docker mysql8 数据备份,每天备份,保留三个月
Docker MySQL8 每日自动备份脚本(保留 3 个月,自动清理过期)
一、前置说明
- 假设容器名:
mysql8(替换成你实际容器名) - 备份存放路径:
/home/docker-home/mysql_backup(大盘存储,不占系统盘) - 保留规则:90 天自动删除超期备份,每日凌晨 2 点自动执行
- 备份文件格式:
mysql_20260711_0200.sql.gz压缩节省空间
二、1. 创建备份目录
mkdir -p /home/docker-home/mysql_backup
三、2. 编写备份脚本 mysql_backup.sh
tee /home/docker-home/mysql_backup/mysql_backup.sh <<-'EOF'
#!/bin/bash
# MySQL8容器备份脚本
# 配置项
CONTAINER_NAME="mysql8" # 你的mysql容器名称
BACKUP_DIR="/home/docker-home/mysql_backup"
DB_USER="root"
DB_PWD="你的mysql数据库root密码"
RETENTION_DAY=90 # 保留90天(3个月)
DATE=$(date +%Y%m%d_%H%M)
BACKUP_FILE="${BACKUP_DIR}/mysql_${DATE}.sql.gz"
# 执行容器内mysqldump全库备份并压缩
docker exec ${CONTAINER_NAME} mysqldump -u${DB_USER} -p${DB_PWD} --all-databases --single-transaction --quick --lock-tables=false | gzip > ${BACKUP_FILE}
# 清理超过90天的备份文件
find ${BACKUP_DIR} -name "mysql_*.sql.gz" -type f -mtime +${RETENTION_DAY} -delete
# 输出日志
echo "[$(date +%Y-%m-%d %H:%M:%S)] 备份完成: ${BACKUP_FILE}"
EOF
修改脚本内关键参数
CONTAINER_NAME:改成你运行的 mysql 容器名字,docker ps查看DB_PWD:替换为 MySQL root 账号密码
四、3. 赋予脚本执行权限
chmod +x /home/docker-home/mysql_backup/mysql_backup.sh
五、4. 手动测试备份(先验证能否正常导出)
/home/docker-home/mysql_backup/mysql_backup.sh
# 执行完查看是否生成压缩包
ls -lh /home/docker-home/mysql_backup/
六、5. 设置定时任务(crontab 每日凌晨 2 点执行)
编辑定时任务
crontab -e
写入定时规则
0 2 * * * /home/docker-home/mysql_backup/mysql_backup.sh >> /home/docker-home/mysql_backup/backup_log.log 2>&1
含义:每天 02:00 自动运行备份,日志写入backup_log.log方便排错。
查看已生效定时任务
crontab -l
七、补充关键说明
1. 备份参数解释
--single-transaction:InnoDB 库热备份,无需锁表,不中断业务读写 --lock-tables=false:关闭锁表,适配生产在线环境
2. 恢复数据库备份示例
# 解压备份文件
gzip -d mysql_20260711_0200.sql.gz
# 导入到mysql容器
cat mysql_20260711_0200.sql | docker exec -i mysql8 mysql -uroot -p你的密码
3. 优化方案(可选)
- 异地备份:如需防磁盘损坏,可在脚本末尾加 rsync 同步备份到另一台服务器;
- 分库备份:只备份指定业务库,去掉
--all-databases,替换为数据库名1 数据库名2; - 权限加固:脚本密码明文不安全,可改用容器内
.my.cnf免密配置。
4. 过期清理逻辑
-mtime +90:自动删除修改时间超过 90 天的备份文件,严格实现只保留近 3 个月备份。

浙公网安备 33010602011771号