MySQL容器备份核心是保证一致性:推荐用mysqldump实时导出(无需停容器),或停机后对命名卷做文件级备份;配合挂载目录、压缩、定时脚本与crontab可实现自动化。
直接在 Docker 环境中备份 MySQL 容器,核心是利用 mysqldump 工具导出数据,再结合容器运行时的文件系统访问能力。关键不在于“停不停容器”,而在于确保备份一致性——即避免边写入边导出导致数据不一致。
这是最常用、最安全的方式,无需停止容器,只要 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 挂载了目录docker exec mysql-container mysqldump -u root -p'your_password' mydb | gzip > backu
p-mydb-$(date +%F).sql.gz
如果容器使用了命名卷(named volume)存储数据,可直接备份卷内文件,但必须先停止 MySQL 服务(或整个容器),否则可能损坏 InnoDB 表空间。
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
宿主机上写个脚本 + cron,就能每天自动备份。
/opt/scripts/mysql-backup.sh:#!/bin/bash
BACKUP_DIR="/opt/backups/mysql"
CONTAINER="mysql-container"
DATE=$(date +%F_%H-%M)
mkdir -p $BACKUP_DIR
docker exec $CONTAINER mysqldump -u root -p'password' --single-transaction --routines --triggers --events myapp_db | gzip > $BACKUP_DIR/myapp_db-$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
chmod +x /opt/scripts/mysql-backup.sh
0 2 * * * /opt/scripts/mysql-backup.sh(每天凌晨2点执行)备份是为了能用,恢复操作同样轻量:
docker exec -i mysql-container mysql -u root -p'password' mydb
gunzip
不复杂但容易忽略:备份前确认字符集和排序规则是否一致;远程备份记得检查网络和权限;敏感环境别把密码写死在脚本里。用好 --single-transaction 参数,能极大降低锁表影响。