将 MySQL-PXC 迁移到 MySQL-MGR
本指南提供了在 Alauda Container Platform 上从 MySQL-PXC(Percona XtraDB Cluster)5.7 迁移到 MySQL Group Replication(MGR)8.0 的完整操作说明。
目录
背景挑战解决方案环境信息PXC 与 MGR:主要差异常见场景先决条件重要限制开始之前1. 获取 MySQL Root 密码2. 确认 Pod 名称3. 验证集群状态4. kubectl exec 最佳实践执行指南步骤 1:架构兼容性分析修复架构问题步骤 2:字符集与排序规则分析转换为 utf8mb4步骤 3:创建目标 MySQL-MGR 8.0 实例步骤 4:迁移数据、用户和权限步骤 5:验证迁移步骤 6:迁移后优化1. 更新表统计信息2. 检查碎片应用切换步骤 7:切换应用到目标端1. 验证应用已停止2. 更新应用连接字符串3. 重启应用4. 验证应用功能监控灾难恢复回滚计划常见问题与解决方案问题:GTID_PURGED 错误问题:字符集转换错误问题:DEFINER 权限错误问题:认证插件错误故障排查诊断命令最佳实践迁移前规划迁移期间迁移后参考大小与时间估算mysqldump 标志参考有用链接背景
挑战
MySQL 5.7 已于 2023 年 10 月达到生命周期终止(EOL),并且从 Alauda Database Service for MySQL v4.3.0 开始,MySQL-PXC 已被弃用并移除。组织必须迁移到 MySQL 8.0,才能继续获得安全更新并利用新特性。
迁移生产数据库需要考虑诸多复杂因素:
- 架构与 MySQL 8.0 保留关键字的兼容性
- 字符集变更(utf8mb4)
- 认证插件更新
- 确保迁移过程中的数据完整性
解决方案
本指南提供了从 MySQL-PXC 5.7 迁移到 MySQL-MGR 8.0 的完整且经过验证的操作说明:
- 成熟方案:已在 ACP v4.0+ 上使用 Alauda Database Service for MySQL 验证
- 完整对象覆盖:迁移所有标准 MySQL 对象(表、视图、routine、trigger、event、用户、权限)
- 架构兼容性:自动检查并修复 MySQL 8.0 兼容性问题
- 全面验证:覆盖 9 类对象的验证
- 风险最小化:提供详细的回滚步骤,并在每个步骤进行验证
环境信息
PXC 与 MGR:主要差异
在运行迁移命令前,始终先使用 kubectl get pod -n <namespace> 检查实际的 Pod 名称。
常见场景
先决条件
在执行迁移之前,请确保具备以下条件:
- ACP v4.0 或更高版本,且 MySQL Operator 为 v4.0 或更高版本
- 一个健康的 MySQL-PXC 5.7 集群作为源端
- 已启用 GTID 模式(
@@gtid_mode = ON、@@enforce_gtid_consistency = ON) - 在迁移之前已创建新的 MySQL-MGR 8.0 集群作为目标端
- 存储容量为源数据库大小的 2-3 倍
- 本地机器可同时连通两个集群的网络
重要限制
- 为确保一致性,在导出和导入期间需要应用停机
- 推荐的最大数据库大小:200GB(更大的数据库可能需要其他方案)
- 源集群必须启用 GTID
- 必须在迁移开始前创建目标集群
- 目标端的存储性能应与源端相当或更高
开始之前
1. 获取 MySQL Root 密码
2. 确认 Pod 名称
3. 验证集群状态
4. kubectl exec 最佳实践
针对 PXC 5.7(源端):
针对 MGR 8.0(目标端):
- 始终使用参数顺序:
kubectl exec -n <namespace> <pod-name> -- <command> - 在命令前使用
--(双短横线)将 kubectl 选项与命令分隔开 - 避免在
kubectl exec中使用 heredoc(<<EOF)——由于 shell 引号处理问题,它们通常会失败
执行指南
步骤 1:架构兼容性分析
请在计划迁移前一周执行此分析。
运行以下命令以检测架构兼容性问题:
修复架构问题
步骤 2:字符集与排序规则分析
检查非 utf8mb4 的表:
转换为 utf8mb4
对于具有较长 VARCHAR/TEXT 索引(>191 个字符)的表,你可能需要调整索引长度:
步骤 3:创建目标 MySQL-MGR 8.0 实例
在数据迁移阶段开始前不久创建目标 MySQL-MGR 8.0 实例。
使用 Web 控制台:
- 选择 MySQL 版本 8.0
- 配置资源(建议由于 MySQL 8.0 的额外开销,内存比源集群增加 10-20%)
- 将存储大小设置为源数据库大小的 2-3 倍
使用命令行:
验证目标集群:
步骤 4:迁移数据、用户和权限
从此步骤开始,应用必须保持停止状态(或严格只读),直到切换完成。此步骤之后写入源数据库的任何数据都将丢失。
操作步骤:
-
停止应用写入:将应用副本数缩放为 0:
-
确定需要迁移的数据库:
-
导出并导入数据:
-
迁移用户和权限:
TIPSHOW CREATE USER会保留原始认证插件和密码哈希,因此迁移后用户仍可使用现有密码登录。如果你需要为客户端兼容性切换到mysql_native_password,请运行:
上面的 mysqldump 流式处理方式不需要为 dump 文件额外预留磁盘空间。
步骤 5:验证迁移
验证清单:
- 每个数据库中的表数量一致
- 每张表的行数一致
- 视图数量一致
- 所有视图都能成功执行
- 所有存储过程和函数都存在
- 所有 trigger 和 event 都已迁移
- 所有用户账户都存在
- 所有权限都已迁移
步骤 6:迁移后优化
1. 更新表统计信息
2. 检查碎片
如果发现明显碎片(>100MB),请重建表:
应用切换
步骤 7:切换应用到目标端
1. 验证应用已停止
2. 更新应用连接字符串
3. 重启应用
4. 验证应用功能
监控
对迁移后的实例进行 24-48 小时监控:
灾难恢复
回滚计划
如果切换后发现关键问题:
在迁移验证完成且回滚窗口结束之前,不要删除 PXC 自定义资源。
常见问题与解决方案
问题:GTID_PURGED 错误
症状:
解决方案: 迁移步骤中已通过 grep -v "SET @@GLOBAL.GTID_PURGED" 过滤,问题已被处理。
问题:字符集转换错误
症状:
解决方案:
问题:DEFINER 权限错误
症状:
解决方案:
问题:认证插件错误
症状:
解决方案:
故障排查
诊断命令
检查迁移进度:
验证数据完整性:
检查 MySQL 8.0 错误日志:
最佳实践
迁移前规划
- 先在预生产环境测试:始终先在非生产环境执行测试迁移
- 架构清理:在正式迁移前修复所有架构兼容性问题
- 字符集迁移:尽早转换为 utf8mb4(建议提前 3-5 天)
- 备份策略:确保迁移前可以获取最新备份
- 维护窗口:根据数据库大小安排足够的停机时间
迁移期间
- 停止应用写入:确保导出/导入期间无写入,以保证一致性
- 监控进度:定期跟踪导出/导入进度
- 保留源端运行:在验证迁移完成前不要删除源端
迁移后
- 全面测试:对应用功能进行充分测试
- 性能监控:监控 24-48 小时的查询性能
- 保留源端用于回滚:保留源集群 24-48 小时作为回滚窗口
- 更新文档:更新连接字符串和监控仪表盘