如何在docker环境备份mysql_mysql容器备份方法

来源:这里教程网 时间:2026-02-28 20:35:12 作者:

直接在 Docker 环境中备份 MySQL 容器,核心是利用

mysqldump
工具导出数据,再结合容器运行时的文件系统访问能力。关键不在于“停不停容器”,而在于确保备份一致性——即避免边写入边导出导致数据不一致。

使用 mysqldump 实时备份(推荐)

这是最常用、最安全的方式,无需停止容器,只要 MySQL 正常提供服务即可执行。

进入正在运行的 MySQL 容器并执行导出:
docker exec mysql-container mysqldump -u root -p'your_password' database_name > backup.sql

(注意:密码直接写在命令里有安全风险,生产环境建议用配置文件或
-p
交互输入)
更稳妥的做法是挂载本地目录,把备份文件直接存到宿主机:
docker exec mysql-container mysqldump -u root -p'your_password' --all-databases > /backup/all-databases-$(date +%F).sql

前提是启动容器时已用
-v /host/backup:/backup
挂载了目录
如需压缩节省空间,可管道传递给 gzip:
docker exec mysql-container mysqldump -u root -p'your_password' mydb | gzip > backup-mydb-$(date +%F).sql.gz

基于卷(Volume)的文件级备份(适用于冷备或快速恢复)

如果容器使用了命名卷(named volume)存储数据,可直接备份卷内文件,但必须先停止 MySQL 服务(或整个容器),否则可能损坏 InnoDB 表空间。

查清 MySQL 数据卷名:
docker volume ls | grep mysql
或查看
docker inspect mysql-container
中的
Mounts
部分
停止容器:
docker stop mysql-container
tar
打包卷内容(假设卷名为
mysql_data
):
docker run --rm -v mysql_data:/volume -v $(pwd):/backup alpine tar czf /backup/mysql-data-$(date +%F).tar.gz -C /volume .
备份完成后重启容器:
docker start mysql-container

自动化定时备份(加个 crontab 就行)

宿主机上写个脚本 + cron,就能每天自动备份。

新建脚本
/opt/scripts/mysql-backup.sh
#!/bin/bash<br>
BACKUP_DIR="/opt/backups/mysql"<br>
CONTAINER="mysql-container"<br>
DATE=$(date +%F_%H-%M)<br>
mkdir -p $BACKUP_DIR<br>
docker exec $CONTAINER mysqldump -u root -p'password' --single-transaction --routines --triggers --events myapp_db | gzip > $BACKUP_DIR/myapp_db-$DATE.sql.gz<br>
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
赋予执行权限:
chmod +x /opt/scripts/mysql-backup.sh
添加定时任务:
0 2 * * * /opt/scripts/mysql-backup.sh
(每天凌晨2点执行)

恢复备份也很简单

备份是为了能用,恢复操作同样轻量:

恢复 SQL 文件(容器运行中):
docker exec -i mysql-container mysql -u root -p'password' mydb 
如果是压缩包,先解压再导入:
gunzip 
若用的是卷备份(.tar.gz),需先停容器、清空原卷、解压覆盖,再启动容器 —— 注意版本兼容性,不建议跨大版本恢复

不复杂但容易忽略:备份前确认字符集和排序规则是否一致;远程备份记得检查网络和权限;敏感环境别把密码写死在脚本里。用好

--single-transaction
参数,能极大降低锁表影响。

相关推荐