应用场景:生产环境mysql数据库大小5G以内(超过15G推荐使用xtrabackup工具),在数据库以外的一台机器上做每天全量备份,以防止数据丢失
为了保持环境的整洁性,这里选用docker加载mysql容器的方式运行mysqldump备份
1.首先导入最新的mysql 镜像
可以联网的环境下
#下载docker镜像
docker pull mysql:5.7.44
#查看docker镜像
docker images
离线的情况下
在外网机器上
#下载docker镜像
docker pull mysql:5.7.44
#导出docker镜像
docker save -o mysql_5.7.44.tar 镜像id
然后把tar包传入内网机器
#导入docker镜像
docker load -i mysql_5.7.44.tar
#给镜像打tag
docker tag 镜像id mysql:5.7.44
#查看docker镜像
docker images
2.制作脚本
在/data/backups/script路径下新建mysqldump-full.sh脚本
脚本内容如下,这里为每天覆盖备份文件,不用在意删除旧文件问题
docker run --rm -v /data/backups/mysql:/backups mysql:5.7.44 \ mysqldump -h mysql服务ip -uroot -p'密码' --all-databases --max_allowed_packet=1GB --quick --triggers --routines --events --single-transaction --result-file=/backups/xxxx_prod.sql
给脚本赋执行权限
chmod 755 mysqldump-full.sh
执行脚本,测试备份是否成功
后来使用中感觉备份一个脚本不够实用,比如周五误删了数据,周一才发现,只保留一天备份的话就无力回天了
所以后面调整为保存最近一周的备份文件,多出的备份文件自动删除
这里还有个使用技巧就是,如果对mysql数据库有变更,可以提前把前一天的mysql备份文件单独拷贝一份,这样就不怕备份文件被删了
有一点要注意,就是这个脚本做了mysqldump进程检查,所以备份脚本命名就不要用mysqldump关键词了,改成mysqlbackup-full.sh即可
#!/bin/bash datetime=`date +%Y%m%d-%H-%M-%S` OneWeekAgo=`date -d "1 week ago" +%Y%m%d` basePath=/data/backups/mysql bakFileName=ygsafe_$datetime.sql bakFile=$basePath/$bakFileName logfile=$basePath/full_$datetime.log pid=`ps -ef | grep -v "grep" |grep -i mysqldump|awk '{print $2}'|head -n 1` if [ -z $pid ] then echo " start full backup database " >> $logfile touch $bakFile docker run --rm -v $basePath:/backups mysql:5.7.44 \ mysqldump -h 192.1.1.1 -uroot -p'123456' --all-databases --quick --triggers --routines --events --single-transaction --result-file=/backups/$bakFileName >> $logfile 2>&1 ret=`tail -n 1 $bakFile |grep "Dump completed on"|wc -l` if [ "$ret" = 1 ] ; then echo 'delete expired backup ' $basePath/ygsafe_$OneWeekAgo*.sql >> $logfile rm -f $basePath/ygsafe_$OneWeekAgo*.sql rm -f $basePath/full_$OneWeekAgo*.log else echo 'backup failure ,no delete expired backup' >> $logfile fi else echo "****** mysqldump in backup database ****** " >> $logfile fi
3.新建crontab任务
crontab -e
这里的策略为,每晚3点全量备份
0 3 * * * sh /data/backups/script/mysqldump-full.sh >/data/backups/mysql/cron.log 2>&1
遇到的问题:
问题1:备份文件的生成为当天11点,定时任务为3点,Ubuntu的crontab执行时间相差8小时
问题原因:crontab的时区不对。此时系统时区是正常的。
处理方法:
修改 contab 时区:
vim /etc/crontab
添加变量:
CRON_TZ=Asia/Shanghai
重启cron服务:
sudo service cron restart
参考文档:
https://www.jianshu.com/p/ca0a8561e537
https://blog.csdn.net/u012447842/article/details/103684585
问题2:mysqldump备份文件乱码
此时不要慌,把备份文件下载到本地,再打开看一下,如果是正常的,则是xshell,或者vi问题,备份文件是正常可用的
参考文档:
https://blog.csdn.net/WuDan_1112/article/details/127615513
https://www.cnblogs.com/zhoading/p/17029412.html
问题3:mysqldump: Error 2020: Got packet bigger than ‘max_allowed_packet’ bytes when dumping table `txt_blt_bas_txt` at row: 141529
这个报错是由于数据超出max_allowed_packet的限制导致的报错
配置 --max-allowed-packet=2G 参数即可
参考文档:
https://blog.csdn.net/weixin_43767002/article/details/86507584