利用计划任务和批处理从docker容器中备份数据库文件到宿主机指定目录
如何创建定时任务
创建计划任务(定时任务):
crontab -e
打开后是VI编辑器,将自己计划任务的内容写到里边然后wq(保存并退出)就行了
查看计划任务:
crontab -l
查看以及存在的计划任务
可能遇到的问题
bash: crontab: command not found
这个问题主要是因为 crond 服务没有启动
启动crond服务service crond start
- 启动crond提示
没有找到服务
安装 crond服务即可
安装成功yum -y install crontabs
数据库备份脚本
容器内操作 :
-
备份文件路径:/home/database_bak/
-
计划任务内容(每天晚上10点执行):
容器内也可不用加定时任务,直接从宿主机调用容器内的脚本 -
0 10 * * * /home/database_bak/bak_database.sh
-
脚本bak_database.sh内容:
# 备份数据库文件 mysqldump -u*** -p*** boo_db -t > /home/database_bak/$(date +%Y%m%d)_boo_db.sql # 清理5天前的备份文件,防止过度占用内存 rm -rf /home/database_bak/$(date -d "5 day ago" +%Y%m%d)_boo_db.sql
宿主机操作:
- 备份文件路径:/thinker/storage/data_base_bak
- 计划任务(每天晚上11点执行):
0 11 * * * /thinker/storage/data_base_bak/bak_database.sh
- 调用容器内部脚本示例
docker exec -it [容器ID或名称] /bin/bash -c "sh /home/database_bak/bak_database.sh"
- 调用容器内部脚本示例
- 脚本bak_database.sh内容:
# 从容器中复制出备份过的数据库文件 docker cp 57e5270897f0:/home/database_bak/$(date +%Y%m%d)_boo_db.sql /thinker/storage/data_base_bak/ # 清除历史备份文件 清除5天前的备份文件 rm -rf /thinker/storage/data_base_bak/$(date -d "5 day ago" +%Y%m%d)_boo_db.sql
优化
- 防止误清历史数据,也可以对历史文件做个判断
例如下面示例:当2天前的备份文件存在 且 文件大小大于1M,才执行清理3天前的文件
if [ -f /www/backup/database/$(date -d "2 day ago" +%Y%m%d)_covid.sql ] && [ $(stat -c %s /www/backup/database/$(date -d "2 day ago" +%Y%m%d)_covid.sql) -gt 1048576 ]; then
echo "File exists and is larger than 1MB"
rm -rf /www/backup/database/$(date -d "3 day ago" +%Y%m%d)_covid.sql
else
echo "File does not exist or is smaller than 1MB"
fi
问题
- crontab定时任务不执行的原因
1.crond服务未启动
2.时区不对
3. 排查日志,我的日志文件是/var/log/cron
从日志可以看出定时执行了,但是报错 了…