前言:本文针对Docker部署的MySQL,实现「指定多个数据库」的完整备份(含建库、建表结构+全量数据),适配CentOS服务器,结合定时任务实现自动备份,附带测试方法和避坑指南,全程实操可直接落地(已适配真实服务器环境)。
一、环境前提(已适配你的服务器)
先确认服务器Docker容器信息,避免因容器名错误导致备份失败(你的服务器实测信息):
bash
# 查看Docker容器信息(执行命令)
docker ps
你的服务器核心容器信息(重点关注MySQL):
- MySQL容器名:mysql(非mysql8,避坑重点!)
- MySQL版本:8.0.28
- 备份目录:/home/mysql-safe(已提前创建,无需额外新建)
- 系统环境:CentOS(腾讯云服务器,含系统自带星网关进程,不影响备份)
二、核心需求
- 备份内容:指定多个MySQL数据库,包含「建库语句+建表结构+全量业务数据」,可直接恢复。
- 自动备份:先测试每分钟备份(便于验证),测试完成后改为每天凌晨2点自动备份。
- 自动优化:备份文件压缩存储,自动清理7天前旧备份,避免占用过多磁盘空间。
- 稳定可靠:不影响MySQL正常运行,适配Docker容器环境,避免出现「No such container」错误。
三、完整操作步骤(全程实操)
步骤1:创建/修改多库备份脚本
脚本路径固定为 /home/mysql-safe/mysql_backup.sh,已适配你的备份目录和容器名,只需修改2个关键参数即可使用。
bash
# 编辑脚本(执行命令)
vi /home/mysql-safe/mysql_backup.sh
脚本内容(复制粘贴,修改密码和数据库名即可):
bash
#!/bin/bash
# ===================== 需修改的2个关键参数 =====================
CONTAINER_NAME="mysql" # 你的MySQL容器名(固定,无需改)
MYSQL_ROOT_PASSWORD="你的MySQL真实密码" # 替换为你的root密码
BACKUP_DIR="/home/mysql-safe" # 备份目录(固定,无需改)
DATABASES="db1 db2 db3" # 多个要备份的数据库,用空格隔开
# ==============================================================
# 自动创建备份目录(防止目录不存在)
mkdir -p $BACKUP_DIR
# 备份文件命名(含时间戳,避免重复)
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/mysql_full_$DATE.sql"
# 执行多库完整备份(结构+数据,无锁备份不影响业务)
docker exec $CONTAINER_NAME mysqldump -u root -p$MYSQL_ROOT_PASSWORD \
--single-transaction \
--set-charset \
--databases $DATABASES > $BACKUP_FILE
# 压缩备份文件(节省磁盘空间)
gzip $BACKUP_FILE
# 自动清理7天前的旧备份(避免磁盘占满)
find $BACKUP_DIR -name "mysql_full_*.sql.gz" -mtime +7 -delete
# 输出备份成功日志
echo "✅ 多库完整备份完成($(date +%Y-%m-%d %H:%M:%S)):$BACKUP_FILE.gz"
}
步骤2:给脚本添加执行权限
执行命令,确保脚本可正常运行:
bash
chmod +x /home/mysql-safe/mysql_backup.sh
步骤3:手动测试脚本(关键一步)
先手动执行脚本,验证备份是否成功,避免定时任务配置后无效果:
bash
# 手动执行备份脚本
/home/mysql-safe/mysql_backup.sh
验证成功标准:
- 无报错信息,输出「✅ 多库完整备份完成」。
- 执行以下命令,能看到生成的 .sql.gz 压缩备份文件:
bash
ls -lh /home/mysql-safe/
步骤4:配置定时任务(先测试,后正式)
使用crontab配置定时任务,先设置「每分钟备份」便于测试,测试无误后改为「每天凌晨2点备份」。
4.1 编辑定时任务
bash
crontab -e
4.2 添加定时任务(当前测试版:每分钟备份)
你的服务器crontab已存在腾讯云星网关进程(无需删除,不影响),新增以下一行即可:
bash
# 腾讯云系统自带进程(无需修改,保留)
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
# MySQL多库自动备份(测试版:每分钟执行一次)
*/1 * * * * /home/mysql-safe/mysql_backup.sh >> /home/mysql-safe/backup.log 2>&1
说明:日志会输出到 /home/mysql-safe/backup.log,便于查看备份是否正常。
4.3 验证定时任务是否生效
bash
# 查看当前定时任务列表
crontab -l
能看到新增的MySQL备份任务,即为生效。
四、测试验证方法
配置好每分钟备份后,等待1-2分钟,通过以下命令验证效果:
- 查看备份文件(每分钟新增1个压缩文件):
bash
ls -lh /home/mysql-safe/
- 查看实时备份日志(确认无报错):
bash
tail -f /home/mysql-safe/backup.log
若日志持续输出「备份完成」,且有新增备份文件,说明测试成功。
五、正式环境配置(测试完成后必做)
每分钟备份仅用于测试,测试无误后,务必修改为「每天凌晨2点备份」,避免频繁备份占用资源:
bash
# 重新编辑定时任务
crontab -e
# 将测试版定时任务替换为正式版(每天凌晨2点执行)
0 2 * * * /home/mysql-safe/mysql_backup.sh >> /home/mysql-safe/backup.log 2>&1
六、备份恢复方法(备用)
若需恢复备份,执行以下步骤(完整恢复指定多库的结构和数据):
bash
# 1. 解压备份文件(替换为你的备份文件名)
gzip -d /home/mysql-safe/mysql_full_20260403_xxxxxx.sql.gz
# 2. 执行恢复命令(容器名固定为mysql,替换密码和备份文件名)
docker exec -i mysql mysql -uroot -p你的密码 < /home/mysql-safe/mysql_full_20260403_xxxxxx.sql
恢复完成后,登录MySQL即可验证数据和结构是否完整。
七、避坑指南(重点!)
- 坑1:容器名错误,报「No such container」。解决方案:确认容器名为mysql(而非mysql8),脚本中CONTAINER_NAME固定为mysql。
- 坑2:脚本无执行权限,报「Permission denied」。解决方案:执行chmod +x /home/mysql-safe/mysql_backup.sh授权。
- 坑3:备份目录不存在,备份失败。解决方案:脚本已添加mkdir -p $BACKUP_DIR,无需手动创建。
- 坑4:定时任务不生效。解决方案:确认crontab配置正确,可通过crontab -l查看,重启crond服务(systemctl restart crond)。
八、总结
本文实现了Docker部署MySQL的多库自动备份,适配你的CentOS腾讯云服务器,核心亮点:
- 适配性强:已根据你的服务器容器信息(mysql容器名、备份目录)配置,修改密码和数据库名即可使用。
- 功能完整:支持多库备份、结构+数据完整、压缩存储、自动清理旧备份。
- 易操作:全程命令复制即用,测试+正式配置清晰,新手也能快速落地。
- 稳定可靠:无锁备份不影响业务,定时任务结合日志,便于排查问题。
测试完成后记得切换到正式定时任务,避免频繁备份占用服务器资源~