Shell 脚本实现网站及数据库定时自动备份
代码有价,数据无价,为了安全起见,我们每天都需要备份数据库,但是备份数据库的时间往往是在凌晨左右,大家都休息,没人使用的时候,而我们也不能长期在每天的这个时候手动进行备份,所以我们就需要 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 』
二、使用方法:
1、下载脚本:
git clone https://github.com/Tespera/AutoBackupWebsite.git
2、修改配置信息,只需修改如下内容:
## 备份配置信息 (示例)##
# 备份名称,用于标记
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 ##
3、赋予脚本执行权限:
chmod +x AutoBackupWebsite.sh
4、开始执行:
./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。简单来说,原理类似于我们手机上的闹钟。
1、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
2、指令解释:
每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
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)表示星期
| | | | | .------------------- username 以哪个用户来执行(可省略)
| | | | | | .------ command 要执行的命令
| | | | | | |
* * * * * user-name command to be executed
3、格式示例:
- */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% 是数字的星期几
tips:
- crontab 不能添加系统级的任务。
- crontab 的最小执行时间单位是分钟,如果需要每 30 秒执行任务,可以如下实现:
#每30秒 把时间写入 /tmp/cron.txt 文件
*/1 * * * * data >> /tmp/cron.txt
*/1 * * * * sleep 30s; data >> /tmp/cron.txt
你 Get 到了吗?
上一篇 : 使用 Python 和 sendmail 服务给用户发送邮件 下一篇 : 纯Shell脚本实现CentOS7一键安装Python3及pip3并与Python2共存