MySQL 跑在 Docker 里怎么备份?别只打包 data 目录
Docker 里的 MySQL 看起来只是一块 volume,但直接压缩数据目录并不等于可靠备份。数据库运行中仍在写入,文件可能不一致;换版本恢复时也容易失败。本文给个人和小团队一套逻辑导出、配置备份和恢复演练流程。
备份范围先列清楚
至少保存数据库逻辑导出、compose.yaml、.env 和应用上传目录。数据库导出负责表数据,配置负责连接信息,上传目录负责图片和附件,缺一项都可能导致应用恢复不完整。
服务器规格和磁盘
小型 MySQL 可从 2 核 4G 起步,多个站点或查询较多建议 4 核 8G。磁盘要同时容纳生产数据、备份文件和升级临时空间,长期至少留 20% 空闲。
我会把数据库型自托管应用放在雨云服务器-rainyun.com 的 2 核 4G 或 4 核 8G 机型上,优先保证内存和磁盘稳定。注册填优惠码 2026off 领 5折,省下预算更应该投入异地备份,而不是只追求高核数。
逻辑导出示例
容器名和账号按实际项目修改:
bash
STAMP=$(date +%F-%H%M)
docker compose exec -T mysql mysqldump \
-uroot -p"$MYSQL_ROOT_PASSWORD" \
--single-transaction --routines --triggers app \
| gzip > "/opt/backups/mysql-$STAMP.sql.gz"
密码不要直接写进公开脚本。可以从受限权限的环境文件读取,并确保备份目录只有管理员可读。
恢复演练
在临时环境启动同一大版本 MySQL,创建空数据库后导入:
bash
gzip -dc mysql-2026-06-19-0300.sql.gz \
| docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" app
导入成功不等于业务成功。还要登录应用、查询旧记录、打开附件并新增一条测试数据。
高频踩坑
字符集不一致会造成乱码;目标库不是空库会报对象已存在;数据库版本跨度过大可能出现语法或认证兼容问题。大库备份要安排在低峰,并监控磁盘和 I/O。
维护策略
保留最近 7 到 14 天日备份、数份月备份,并至少放一份到另一台机器。每次应用大版本升级前,再做一份手动备份和恢复说明。
总结
MySQL 备份要覆盖逻辑数据、配置和应用文件,并通过另一套环境恢复验证。只看备份脚本返回成功,远远不够。
需要低成本做数据库恢复演练时,可以临时开一台雨云服务器-rainyun.com ,注册填优惠码 2026off 领 5折。演练通过后再升级正式环境,风险会小很多。