应用场景:生产环境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

https://blog.csdn.net/shiwei_zsw/article/details/131917339

posted on 2023-12-26 15:47  06  阅读(890)  评论(0编辑  收藏  举报