docker数据库备份恢复核心是用docker exec调用mysqldump等工具配合宿主机定时任务,确保一致性:备份前确认容器运行及凭证,用--single-transaction等参数保证一致性,cron每日自动备份压缩并清理旧文件,恢复时需cp传入、解压导入、验证数据。

用 Docker 实现数据库自动化备份与恢复,核心是结合 docker exec 调用数据库原生工具(如 mysqldump、mongodump),配合宿主机的定时任务和文件管理,而非依赖容器状态快照。重点不在“备份容器”,而在“备份容器里运行的数据库数据”,且必须保障一致性。
备份前确认数据库访问凭证与容器状态
先确保你能连上数据库:查容器名或 ID(docker ps --filter name=mysql -q),再从 docker inspect 中提取密码:
docker inspect mysql-db | grep -i 'MYSQL_ROOT_PASSWORD\|MARIADB_ROOT_PASSWORD'- 若使用非 root 用户,需同时确认
MYSQL_USER和MYSQL_PASSWORD - 容器必须处于运行中——
mysqldump等工具需数据库服务响应,不能对已停止容器执行
用 mysqldump 实现带一致性的全量备份
推荐加 --single-transaction(InnoDB)或 --lock-all-tables(MyISAM),避免备份中途写入导致数据不一致:
- 备份单库:
docker exec mysql-db mysqldump -uroot -p'123456' --single-transaction myapp > /backup/myapp_$(date +%F).sql - 备份所有库:
docker exec mysql-db mysqldump -uroot -p'123456' --single-transaction --all-databases > /backup/full_$(date +%F_%H%M).sql - 边备份边压缩:
docker exec mysql-db mysqldump -uroot -p'123456' myapp | gzip > /backup/myapp_$(date +%F).sql.gz
通过 cron 实现每日自动备份并清理旧文件
在宿主机设置定时任务,例如每天凌晨 2:15 执行:
- 编辑 crontab:
crontab -e - 添加一行:
15 2 * * * /usr/bin/docker exec mysql-db mysqldump -uroot -p'123456' --single-transaction myapp | gzip > /backup/myapp_$(/bin/date +\%F).sql.gz 2>/dev/null - 再加一行清理 7 天前的备份:
0 3 * * * /usr/bin/find /backup -name "myapp_*.sql.gz" -mtime +7 -delete
恢复时分三步:传文件、导入、验证
恢复不是简单覆盖,而是重放 SQL 到数据库引擎:
- 把备份文件复制进容器:
docker cp /backup/myapp_2026-04-30.sql.gz mysql-db:/tmp/ - 在容器内解压并导入:
docker exec mysql-db sh -c 'gunzip -c /tmp/myapp_2026-04-30.sql.gz | mysql -uroot -p"123456" myapp' - 验证是否成功:
docker exec mysql-db mysql -uroot -p"123456" -e "SELECT COUNT(*) FROM myapp.users;"
不复杂但容易忽略:恢复后务必检查表行数、最近更新时间,必要时重启应用连接池,否则可能还在用旧缓存。











