linux-docker备份数据库

利用计划任务和批处理从docker容器中备份数据库文件到宿主机指定目录

如何创建定时任务

创建计划任务(定时任务):

crontab -e

打开后是VI编辑器,将自己计划任务的内容写到里边然后wq(保存并退出)就行了
查看计划任务:

crontab -l

查看以及存在的计划任务

可能遇到的问题

  • bash: crontab: command not found
    这个问题主要是因为 crond 服务没有启动
    启动crond服务
    	service crond start
    
  • 启动crond提示没有找到服务
    安装 crond服务即可
    	yum -y install crontabs
    
    安装成功
    linux-docker备份数据库_第1张图片

数据库备份脚本

容器内操作 :

  • 备份文件路径:/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
    从日志可以看出定时执行了,但是报错 了…
    在这里插入图片描述

你可能感兴趣的:(数据库,docker,linux)