Docker部署MySQL 多库自动备份(结构+数据完整,适配CentOS)

前言:本文针对Docker部署的MySQL,实现「指定多个数据库」的完整备份(含建库、建表结构+全量数据),适配CentOS服务器,结合定时任务实现自动备份,附带测试方法和避坑指南,全程实操可直接落地(已适配真实服务器环境)。

一、环境前提(已适配你的服务器)

先确认服务器Docker容器信息,避免因容器名错误导致备份失败(你的服务器实测信息):

bash 复制代码
# 查看Docker容器信息(执行命令)
docker ps

你的服务器核心容器信息(重点关注MySQL):

  • MySQL容器名:mysql(非mysql8,避坑重点!)
  • MySQL版本:8.0.28
  • 备份目录:/home/mysql-safe(已提前创建,无需额外新建)
  • 系统环境:CentOS(腾讯云服务器,含系统自带星网关进程,不影响备份)

二、核心需求

  1. 备份内容:指定多个MySQL数据库,包含「建库语句+建表结构+全量业务数据」,可直接恢复。
  2. 自动备份:先测试每分钟备份(便于验证),测试完成后改为每天凌晨2点自动备份。
  3. 自动优化:备份文件压缩存储,自动清理7天前旧备份,避免占用过多磁盘空间。
  4. 稳定可靠:不影响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

验证成功标准:

  1. 无报错信息,输出「✅ 多库完整备份完成」。
  2. 执行以下命令,能看到生成的 .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. 查看备份文件(每分钟新增1个压缩文件):
bash 复制代码
ls -lh /home/mysql-safe/
  1. 查看实时备份日志(确认无报错):
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腾讯云服务器,核心亮点:

  1. 适配性强:已根据你的服务器容器信息(mysql容器名、备份目录)配置,修改密码和数据库名即可使用。
  2. 功能完整:支持多库备份、结构+数据完整、压缩存储、自动清理旧备份。
  3. 易操作:全程命令复制即用,测试+正式配置清晰,新手也能快速落地。
  4. 稳定可靠:无锁备份不影响业务,定时任务结合日志,便于排查问题。

测试完成后记得切换到正式定时任务,避免频繁备份占用服务器资源~

相关推荐
高梦轩2 小时前
MySQL 故障排查与优化
数据库·mysql
吴声子夜歌2 小时前
Node.js——操作MySQL数据库
数据库·mysql·node.js
爱丽_2 小时前
MySQL 锁等待与死锁进阶:怎么看等待、怎么降冲突(工程化套路)
数据库·mysql
心有—林夕2 小时前
MySQL 误操作恢复完全指南
android·数据库·mysql
夕除2 小时前
Mysql--15
java·数据库·mysql
荒川之神3 小时前
MySQL 商品拉链表 完整最终版(配备了全套存储过程)
数据库·mysql
admin and root3 小时前
从资产收集FUZZ接口到SQL注入案例
网络·数据库·sql·安全·web安全·渗透测试·log4j
我真会写代码3 小时前
MySQL关键词全面总结(含用法+避坑指南)
数据库·mysql·索引
pingao1413784 小时前
智慧井盖传感器震动倾斜溢水监测:传统市政设施的智慧化升级典范
运维·网络·安全