需求
通过shell脚本定期备份docker容器部署的mysql
编写脚本
#!/bin/bash
#Shell Command For Backup MySQL Database Everyday Automatically By Crontab
#Author : HASIK
#Date : 2021-07-21
#将以下代码保存到: /usr/sbin/DataBackup
#文件名随意,只要不跟系统原有的命令同名即可;
#为脚本添加可执行权限: sudo chmod +x /usr/sbin/DataBackup/backup.sh
#执行脚本: sudo sh /usr/sbin/DataBackup/backup.sh
#如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了:
#01 3 * * * root run-parts /usr/sbin/DataBackup #它代表着将于每天3点执行DataBackup文件下的所有脚本
#配置参数
source /etc/profile #加载环境变量
HOST=127.0.0.1 #数据库IP
PORT=3306 #数据库端口
CONTAINER=zhao #docker容器名称/容器id
USER=root #数据库用户名
PASSWORD=123 #数据库用户密码
DATABASE=cloud_service #数据库名称
WEBMASTER=YASUO@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
BACKUP_DIR=/data/mysqlBackup/ #备份文件存储路径
LOGFILE=/data/mysqlBackup/logs/data_backup.log #日记文件路径
DATE=`date '+%Y%m%d-%H%M'` #日期格式(作为文件名)
DUMPFILE=$DATE.sql #备份文件名
ARCHIVE=$DATE.sql.tgz #压缩文件名
#OPTIONS="-u$USER -p$PASSWORD –opt –extended-insert=false –triggers=false -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE" #mysqldump 参数 详情见帮助 mysqldump -help
OPTIONS="-h$HOST -P$PORT -u$USER -p$PASSWORD $DATABASE"
#判断备份文件存储目录是否存在,否则创建该目录
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p "$BACKUP_DIR"
fi
#开始备份之前,将备份信息头写入日记文件
echo " " >> $LOGFILE
echo " " >> $LOGFILE
echo "———————————————–" >> $LOGFILE
echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
echo "———————————————– " >> $LOGFILE
#切换至备份目录
cd $BACKUP_DIR
#使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
docker exec $CONTAINER mysqldump $OPTIONS > $DUMPFILE
#判断数据库备份是否成功
if [[ $? == 0 ]]; then
#创建备份文件的压缩包
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
#输入备份成功的消息到日记文件
echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE
#删除原始备份文件,只需保 留数据库备份文件的压缩包即可
rm -f $DUMPFILE
else
echo "Database Backup Fail!" >> $LOGFILE
#备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持
#mail -s "Database:$DATABASE Daily Backup Fail" $WEBMASTER
fi
#输出备份过程结束的提醒消息
echo "Backup Process Done"
注意:定时任务执行docker exec -it 要去掉 -it 否则脚本执行会失败
定时任务crontab
编辑 /etc/crontab 文件在文件末尾追加任务
*/1 * * * * root run-parts /usr/sbin/DataBackup
参数说明:
*/1 * * * * : 每分钟执行一次
root : 执行用户
run-parts /usr/sbin/DataBackup : 执行该文件下的所有脚本
注意:run-parts这个参数,如果去掉这个参数的话,后面写要运行的某个脚本名,而不是文件夹名了。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#每分钟执行/usr/sbin/DataBackup文件下的所有shell脚本
*/1 * * * * root run-parts /usr/sbin/DataBackup
#每分钟执行/usr/sbin/DataBackup/backup.sh脚本
#*/1 * * * * root /usr/sbin/DataBackup/backup.sh
编辑/var/spool/cron下的用户文件
以root用户为例
在/var/spool/cron文件下新建root文件夹
并在root文件中写入定时任务,每分钟执行
*/1 * * * * sh /usr/sbin/DataBackup/backup.sh
touch /var/spool/cron/root
#使用vi命令追加任务,cron表达式、执行命令行
*/1 * * * * sh /usr/sbin/DataBackup/backup.sh
注意:定时任务不会加载系统变量、要么在脚本加上一句source /etc/profile #加载环境变量
要么命令使用绝对路径
补充:脚本编写头部添加如下内容加载系统变量更保险
#!/bin/bash
. /etc/profile
. ~/.bash_profile #某些系统上没有这个文件,不过加上也没关系