MySQL 容器迁移的核心是数据安全、服务连续性和配置一致性。直接拷贝容器或镜像不可靠,应聚焦于数据导出/导入 + 配置重建 + 服务切换。
备份与还原:用 mysqldump 迁移数据
这是最通用、兼容性最好的方式,适用于跨版本、跨主机、甚至跨平台迁移。
在源容器中导出全库(含创建语句和数据):docker exec mysql-source mysqldump -u root -p'yourpass' --all-databases --single-transaction > backup.sql
(建议加
--single-transaction减少锁表,适合 InnoDB) 将备份文件复制到目标环境:
docker cp backup.sql mysql-target:/tmp/ 在目标容器中导入:
docker exec -i mysql-target mysql -u root -p'yourpass'
卷(Volume)迁移:保留原始数据目录
适合同版本、同架构、且希望跳过逻辑导入的场景,速度快、不依赖 SQL 解析。
确认源容器使用命名卷(如mysql-data)或绑定挂载路径;
查看命令:docker volume inspect mysql-data 或检查
docker inspect中的
Mounts停止源容器:docker stop mysql-source 将卷内容打包(若为命名卷,需临时挂载到 busybox 容器中):
docker run --rm -v mysql-data:/volume -v $(pwd):/backup alpine tar czf /backup/mysql-data.tar.gz -C /volume . 在目标主机解压到对应路径或新建同名卷,启动新容器时复用该卷。
配置与启动参数同步
容器迁移后功能异常,80% 源于配置不一致。关键项必须核对:
字符集与排序规则:检查my.cnf中
character-set-server=utf8mb4和
collation-server=utf8mb4_0900_ai_ci(MySQL 8.0+) binlog 与 GTID:若需后续主从或恢复点,确保
log-bin、
server-id、
gtid_mode=ON等已启用并唯一 挂载路径与权限:数据目录、配置文件、SSL 证书路径需在新容器中正确映射,且 MySQL 用户(uid/gid)有读写权限 推荐把
my.cnf单独挂载为 config 文件,便于版本管理和快速调整
平滑切换与验证
避免停机时间过长或应用报错,迁移后务必验证再切流。
启动新容器后,先连接测试:docker exec -it mysql-new mysql -u root -p -e "SHOW DATABASES;" 比对关键表行数、校验和(如CHECKSUM TABLE t1;),确认数据完整性 检查慢查询日志、错误日志是否正常生成;观察连接数、QPS 是否符合预期 更新应用配置指向新容器 IP/端口,或通过 DNS/Service Mesh 切换流量
