代码有价,数据无价,为了安全起见,我们每天都需要备份数据库,但是备份数据库的时间往往是在凌晨左右,大家都休息,没人使用的时候,而我们也不能长期在每天的这个时候手动进行备份,所以我们就需要 Linux 系统实现自动备份,即定时自动执行脚本任务,但是我们也不能让所有的备份一直保留,那样长期备份的数据会占用很大的存储空间,所以我们还需要自动删除过期的备份。为了方便自己和大家,我写了一个 Shell 脚本来实现自动备份。


程序源码:

#!/bin/bash
# Author:Tespera
# Blog: https://www.tespera.com/

## 备份配置信息 (自定义)##

# 备份名称,用于标记,如:www.tespera.com
BACKUP_NAME=" "
# 备份目录,多个请空格分隔,如:/home/www
BACKUP_SRC=" "
# Mysql主机地址
MYSQL_SERVER="127.0.0.1"
# Mysql用户名
MYSQL_USER="user"
# Mysql密码
MYSQL_PASS="password"
# Mysql备份数据库,多个请空格分隔
MYSQL_DBS=" "
# 备份文件存放目录
BACKUP_DIR="/Data/BlogBackup"
# 备份文件压缩密码
BACKUP_FILE_PASSWD=" "
# 备份文件保留天数
SAVE_DAYS="30"
## 备份配置信息 End ##



## 以下内容无需修改 ##

NOW=$(date +"%Y%m%d%H%M%S") #精确到秒,同一秒内上传的文件会被覆盖

mkdir -p $BACKUP_DIR
mkdir -p $BACKUP_SRC/MySQL_bak

# 备份Mysql
echo -e "\nStart dump MySQL ..."
for db_name in $MYSQL_DBS
do
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS $db_name > "$BACKUP_SRC/MySQL_bak/$BACKUP_NAME-$db_name-$NOW.sql"
done
echo "Dump MySQL OK !"

# 打包备份文件
echo -e "\nStart tar ..."
BACKUP_FILENAME="$BACKUP_NAME-backup-$NOW.zip"
zip -q -r -P $BACKUP_FILE_PASSWD $BACKUP_DIR/$BACKUP_FILENAME $BACKUP_SRC/MySQL_bak/*.sql $BACKUP_SRC
echo "tar OK ! "

# 清理临时备份文件
echo -e "\nStart clean temp file ..."
rm -rf $BACKUP_SRC/MySQL_bak/*.sql
echo "Clean temp file OK !"

# 清理过期备份文件
echo -e "\nStart clean outdated file ..."
find $BACKUP_DIR -type f -name "*zip" -mtime +$SAVE_DAYS -exec rm -rf {} \;
echo "Clean outdated file OK !"

# 写入日志
echo "$NOW Backup $BACKUP_SRC successifully!" >> $BACKUP_DIR/backup.log 2>&1

# 备份结束
echo -e "\033[32m \nBackup Successifully! \n \033[0m"


程序源码已同步至 GitHub 仓库:『 AutoBackupWebsite 』


使用方法:

下载脚本:

git clone https://github.com/Tespera/AutoBackupWebsite.git


修改配置信息,只需修改如下内容:

## 备份配置信息 (示例)##

# 备份名称,用于标记
BACKUP_NAME="www.tespera.com"
# 备份目录,多个请空格分隔
BACKUP_SRC="home/www"
# Mysql主机地址
MYSQL_SERVER="127.0.0.1"
# Mysql用户名
MYSQL_USER="user"
# Mysql密码
MYSQL_PASS="password"
# Mysql备份数据库,多个请空格分隔
MYSQL_DBS="blog"
# 备份文件存放目录
BACKUP_DIR="/Data/BlogBackup"
# 备份文件压缩密码
BACKUP_FILE_PASSWD="123456"
# 备份文件保留天数
SAVE_DAYS="30"
## 备份配置信息 End ##


赋予脚本执行权限:

chmod +x AutoBackupWebsite.sh


开始执行:

./AutoBackupWebsite.sh


执行结束之后,屏幕输出如下信息意味着已经备份成功,可在自己设置的备份文件存放目录查看生成的备份文件,压缩包内含 MySQL 数据库文件。


Start dump MySQL ...
Dump MySQL OK !

Start tar ...
tar OK !

Start clean temp file ...
Clean temp file OK !

Start clean outdated file ...
Clean outdated file OK !

Backup Successifully!

[root@VM_135_138_centos backblog]#


❉ 注:脚本中清理过期备份的命令:

find $BACKUP_DIR -type f -name "*zip" -mtime +3 -exec rm -rf {} \;


参数 -mtime 表示修改时间,按天计算,以当前时间 2019-05-17 04:00 来说, -mtime +3 表示整数三天前,即 2019-05-14 04:00 之前,04:00 之后的不在查找范围之内。该行命令表示查找以当前时间 2019-05-17 04:00 计算三天之外的以 zip 结尾的普通文件并静默删除。

本地测试需将 -mtime 参数改为 -mmin ,即修改时间按分钟计算,-mmin +3 可以删除三分钟之前修改过的文件,-mtime 无法在本地测试。

测试成功之后,我们需要将此脚本添加至 Linux 的定时任务中,让其每天按时自动执行。

先查看系统是否安装了 cron 服务(一般默认都安装了)

crontab -l  


输入上述命令如果不报错并输出了 corntab 里面已经存在的定时任务列表即表示系统已安装了 corntab 服务,如果显示 ‘no crontab for root’ 表示系统没有安装 corn ,安装指南:

ContOS 

yum -y install vixie-cron crontabs


Ubuntu

apt-get install cron


 安装成功之后,终端输入下面指令,打开定时器:

crontab -e


按 i 修改,在最后一行添加如下代码,保存并退出,即可实现每天凌晨 4 点自动执行备份:

0 4 * * * /你的脚本存放目录/AutobackupWebsite.sh

❉ 凌晨 4 点上网人数最少,服务器压力最小,适合做备份,可自行修改时间。


OK ! Enjoy !😘


<!---------分割线---------->

顺便说下 crontab ,好玩!

Crontab 概念

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中(是“cron table”的简写),以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常 crontab 储存的指令被守护进程激活,crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为 cron jobs。简单来说,原理类似于我们手机上的闹钟。

cron 服务的启动与关闭

ContOS

# 查看cond 状态
service crond status

# 启动cron
service crond start

# 关闭cron
service crond stop

# 重启cron
service crond restart


Ubuntu

# 查看cond 状态
service cron status

# 启动cron
service cron start

# 关闭cron
service cron stop

# 重启cron
service cron restart


指令解释每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command
# Example of job definition:
.---------------------------------- minute (0 - 59) 表示分钟,* 表示每~,下同
| .------------------------------- hour (0 - 23) 表示小时
| | .---------------------------- day of month (1 - 31) 表示日期
| | | .------------------------- month (1 - 12) 表示月份
| | | | .---------------------- day of week (0 - 6) 表示星期(0 或 7 表示星期天)
| | | | | .------------------- username 以哪个用户来执行(可省略)
| | | | | | .------ command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
| | | | | | |
* * * * * user-name command to be executed


格式示例

 格式

说明 

 */1 * * * * service httpd restart  

 每一分钟 重启httpd服务

 0 */1 * * * service httpd restart

 每一小时 重启httpd服务

 30 21 * * * service httpd restart

 每天 21:30 分 重启httpd服务

26 4 1,5,23,28 * * service httpd restart

 每月的1号,5号 23 号 28 号 的4点26分,重启httpd服务

 26 4 1-21 * * service httpd restart

 每月的1号到21号 的4点26分,重启httpd服务

 */2 * * * * service httpd restart

 每隔两分钟 执行,偶数分钟 重启httpd服务

 1-59/2 * * * * service httpd restart

 每隔两分钟 执行,奇数 重启httpd服务

 0 23-7/1 * * * service httpd restart

 每天的晚上11点到早上7点 每隔一个小时 重启httpd服务

  0,30 18-23 * * * service httpd restart

 每天18点到23点 每隔30分钟 重启httpd服务

 0-59/30 18-23 * * * service httpd restart

 每天18点到23点 每隔30分钟 重启httpd服务

59 1 1-7 4 * test 'date +\%w' -eq 0 && /root/a.sh

 四月的第一个星期日 01:59 分运行脚本 /root/a.sh ,命令中的 text 是判断,w% 是数字的星期几


❉ crontab 不能添加系统级的任务。

❉ crontab 的最小执行时间单位是分钟,如果需要每 30 秒执行任务,可以如下实现:

# 每30秒 把时间写入 /tmp/cron.txt 文件

*/1 * * * * data >> /tmp/cron.txt
*/1 * * * * sleep 30s; data >> /tmp/cron.txt


你 Get 到了吗?🌝



Tespera

爱看书,爱看电影,偶尔也听听歌。喜欢写如诗的代码,热爱 IT 行业。熟悉 Web 前端开发,了解 C、Python、PHP 等计算机语言。

3 Comments
子非鱼 2019-04-30 23:22

"多年以来,我认识到,当你拥有真正优秀的人才时,你不必对他们太纵容,"乔布斯后来解释说:"你期待他们做出好成绩,你就能让他们做出好成绩。 最初的 Mac 团队让我知道,最顶级的人才喜欢一起工作,而且他们是不能容忍平庸作品的。你到那个 Mac 团队里随便找个人问问,他们会告诉你,那些痛苦都是值得的。"

Post your comment