定期备份 Docker 中运行的 mysql、mongo、redis 的数据到宿主机 home 编辑时间 2019/11/26 ## 前言 目前服务器的mysql、mongodb、redis等服务都已经搬家进了docker 需求是在宿主机上跑定时任务脚本,实现docker容器中的各个服务的备份、压缩 数据最终由宿主机统一处理。 ## MySQL 直接上shell脚本 **backup_mysql.sh** ```shell #!/bin/bash # mysql 自动备份 压缩 保留15天 # 文件名 backupDatabase=mydatabases # 存放备份的目录,可以是任意位置,先创建并赋权 baseDir=/home/backup/ # 代表数据库名_年月日 也可以根据需要修改 %Y%m%d%H%M%S fileName=mysql_${backupDatabase}_`date +%Y%m%d` # 备份数据库 其中mysql代表容器名称,如果没有名称可以用其他方法代替 docker exec mysql mysqldump --databases ${backupDatabase} > ${baseDir}${fileName}.sql # 加密压缩 # 这里提供两个压缩方案选择 # targz 还不错的压缩率 速度非常快 CPU占用率比较低 # 解压targz命令: openssl des3 -d -k '你的密码' -salt -in mysql_api_20191126.tar.gz | tar xzf - tar -zcPvf - ${baseDir}${fileName}.sql | openssl des3 -salt -k '你的密码' -out ${baseDir}${fileName}.tar.gz # 7z压缩 非常高的压缩率 速度有点慢 CPU占用率比较高 # 7za a -p'你的密码' ${baseDir}${fileName}.7z ${baseDir}${fileName}.sql # 删除刚刚备份的sql文件,留下压缩的 rm -f ${baseDir}${fileName}.sql; # 删除15天前备份的数据(targz和7z只在扩展名有所不同) find ${baseDir} -mtime +15 -name "${backupDatabase}*.tar.gz" -exec rm -rf {} \; # find ${baseDir} -mtime +15 -name "${backupDatabase}*.7z" -exec rm -rf {} \; ``` 这里解释一下上述脚本 主要是通过 `docker exec` 操作docker名为 `mysql` 容器中的命令 `mysqldump` `--databases` 指定要备份的数据库的库名 `> /xxx/xxx.sql` 指定了备份到的路径以及文件名称 这里是直接备份到的宿主机目录,省去了两边都要操作的麻烦 下一步是压缩 这里提供了2个选择 1. tar gz 压缩速度快 效率还不错 2. 7z 首先需要额外安装7zip来支持,然后压缩速度一般,cpu占用率偏高,优点是极强的压缩率,和解压缩可以允许在任何系统的图形界面下解压缩 (对比tar gz的加密压缩,只有用命令行下调用 openssl 实现) 压缩完成后删除源文件 最后删除日期超过15天的压缩文件 结束脚本 ## Mongodb ## Redis ```shell #!/bin/bash # Redis 自动备份 压缩 保留15天 # 存放备份的目录,可以是任意位置,先创建并赋权 baseDir=/home/backup/ # 代表数据库名_年月日 也可以根据需要修改 %Y%m%d%H%M%S fileName=redis_dump_`date +%Y%m%d` # 备份redis docker exec redis redis-cli save # 复制到宿主机 docker cp redis:/data/dump.rdb ${baseDir}dump.rdb # 加密压缩 # tar gz 较高压缩率 速度快 CPU占用率低 # 解压命令 openssl des3 -d -k '你的密码' -salt -in redis_dump_20191126.tar.gz | tar xzf - tar -zcPvf - ${baseDir}dump.rdb | openssl des3 -salt -k '你的密码' -out ${baseDir}${fileName}.tar.gz # 7z压缩 高压缩率 压缩速度慢 CPU占用高 # 7za a -p'你的密码' ${baseDir}${fileName}.7z ${baseDir}dump.rdb # 删除刚刚备份的rdb文件,留下压缩的 rm -f ${baseDir}dump.rdb # 删除15天前备份的数据 find ${baseDir} -mtime +15 -name "${backupDatabase}*.tar.gz" -exec rm -rf {} \; # find ${baseDir} -mtime +15 -name "${backupDatabase}*.7z" -exec rm -rf {} \; ``` ## 后续处理解释 这些备份之所以只备份15天,是因为服务器硬盘价格昂贵, 我选择其他地方存这些备份数据,之所以加密数据, 是考虑到传输和存储过程,都涉及到了其他服务器,存在不安全隐患。 ## END 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay Linux Deepin 下搞定绝大部分难装的windows 应用程序安装 关于对称加密、非对称加密、签名算法的理解