前言


MySql部署在Docker下,通过每日定时任务,备份并加密压缩,的每日任务脚本
之前写过类似的笔记,年代久远了,再重写一版


正文


先提前安装7Z

  1. # yum 安装7z
  2. yum -y install epel-release
  3. yum -y install p7zip p7zip-plugins
  4. # 测试7z是否安装成功
  5. 7za -h


完整备份脚本如下
从docker容器MySql中备份数据库database到本地
必须先正确安装7z才能使用7za命令压缩文件

  1. #!/bin/bash
  2. # MySql 自动备份 加密压缩 本地保留90天
  3. # 数库名
  4. backupDatabase=database
  5. # 存放备份的目录,可以是任意位置,先创建并赋权
  6. baseDir=/root/backup/mysql/
  7. # 最终文件名,使用类似 mysql_database_20201231.sql
  8. fileName=mysql_${backupDatabase}_`date +%Y%m%d`
  9. # 备份数据库 其中mysql代表容器名称,如果没有名称可以用其他方法代替
  10. docker exec mysql mysqldump --databases ${backupDatabase} > ${baseDir}${fileName}.sql
  11. # 加密压缩 使用7zip 密码123456
  12. 7za a ${baseDir}${fileName}.7z ${baseDir}${fileName}.sql -p123456
  13. # 删除刚刚备份的sql文件,留下压缩的
  14. rm -f ${baseDir}${fileName}.sql;
  15. # 删除大于90天的备份数据
  16. find ${baseDir} -mtime +90 -name "mysql_${backupDatabase}_*.7z" -exec rm -rf {} \;


这里补充说明一下 7z的命令还有一个用法 具体写法如下
亲测使用正牌7z扩展名,压缩率可以提升30%
缺点是单核CPU下测试 压缩中CPU100% 压缩时间也会加倍
所以这里是一个取舍 CPU被挤占 和 磁盘空间占用 哪个重要了
另外如果文件扩展名是tar.gz貌似密码就不起作用了
如果改了扩展名,那删除大于N天的脚本也要改扩展名

  1. 7za a filename.zip filename.sql -ppassword
  2. # 也可以改成
  3. 7za a filename.7z filename.sql -ppassword


进入crontab 增加定时任务

  1. crontab -e
  2. # 最后一行加入 即每日凌晨3点 执行脚本 backup.sh
  3. 0 3 * * * /root/shell/backup.sh
  4. # 保存并退出
  5. :wq
  6. # 保险起见再重启一下crontab确认生效
  7. systemctl restart crond

END

如果还有归档用的OSS或者公网的FTP
还可以进一步上传压缩文件到外部设备做多重备份