将 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:Schema 兼容性分析修复 Schema 问题步骤 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),而 MySQL-PXC 已从 Alauda Database Service for MySQL v4.3.0 开始弃用并移除。组织必须迁移到 MySQL 8.0,才能继续获取安全更新并利用新特性。
迁移生产数据库涉及复杂的考量:
- 与 MySQL 8.0 保留关键字的 Schema 兼容性
- 字符集变更(utf8mb4)
- 认证插件更新
- 在迁移过程中确保数据完整性
解决方案
本指南提供了将 MySQL-PXC 5.7 迁移到 MySQL-MGR 8.0 的完整、已验证操作说明:
- 经过验证的方法:已在 ACP v4.0+ 上使用 Alauda Database Service for MySQL 验证
- 完整对象覆盖:迁移所有标准 MySQL 对象(tables、views、routines、triggers、events、users、grants)
- Schema 兼容性:自动检查并修复 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:Schema 兼容性分析
请在计划迁移前 一周 执行此分析。
运行以下命令以检测 Schema 兼容性问题:
修复 Schema 问题
步骤 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:
-
识别要迁移的数据库:
-
导出并导入数据:
-
迁移用户和权限:
TIP在 MySQL 8.0 目标端,
SHOW CREATE USER会保留原始认证插件和密码哈希,因此用户在迁移后仍可使用现有密码登录。如果需要为了客户端兼容性切换到mysql_native_password,请运行:MySQL 8.4 目标端在 MySQL 8.4 目标端,
mysql_native_password插件 默认未加载且无法启用,因此重新应用使用mysql_native_password的 5.7/8.0SHOW CREATE USER定义会失败,并报错ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded。对于 8.4 目标端,请使用默认的caching_sha2_password插件重新创建每个用户,而不是保留原始哈希:这要求你知道或重置每个用户的密码——
mysql_native_password的哈希无法直接迁移为caching_sha2_password。请确保应用驱动/连接字符串支持caching_sha2_password。
上面的 mysqldump 流式方式不需要为 dump 文件预留磁盘空间。
步骤 5:验证迁移
验证清单:
- 每个数据库中的表数量相同
- 每个表的行数相同
- 视图数量相同
- 所有视图都能成功执行
- 所有存储过程和函数都存在
- 所有触发器和事件都已迁移
- 所有用户账户都存在
- 所有权限都已迁移
步骤 6:迁移后优化
1. 更新表统计信息
2. 检查碎片
如果发现明显碎片(>100MB),请重建表:
原生应用切换
步骤 7:将原生应用切换到目标端
1. 验证应用已停止
2. 更新应用连接字符串
3. 重启应用
4. 验证应用功能
监控
对迁移后的实例进行 24-48 小时监控:
灾难恢复
回滚计划
如果在切换后发现严重问题:
在迁移得到验证且回滚窗口结束之前,不要删除 PXC 自定义资源。
常见问题及解决方法
问题:GTID_PURGED 错误
症状:
解决方法: 已在迁移操作步骤中通过过滤 grep -v "SET @@GLOBAL.GTID_PURGED" 处理。
问题:字符集转换错误
症状:
解决方法:
问题:DEFINER 权限错误
症状:
解决方法:
问题:认证插件错误
症状:
解决方法(MySQL 8.0 目标端): 对于无法协商 caching_sha2_password 的旧客户端,将用户切换为 mysql_native_password:
解决方法(MySQL 8.4 目标端): 在 8.4 中,mysql_native_password 不可用(ERROR 1524: Plugin 'mysql_native_password' is not loaded),因此不能回退到该插件。请改为升级客户端驱动/连接器到支持 caching_sha2_password 的版本(并使用 TLS,因为 caching_sha2_password 对非本地连接的首次密码交换需要 TLS)。保持用户使用默认的 caching_sha2_password 插件即可。
故障排除
诊断命令
检查迁移进度:
验证数据完整性:
检查 MySQL 8.0 错误日志:
最佳实践
迁移前规划
- 在测试环境中验证:始终先在非生产环境执行测试迁移
- Schema 清理:在生产迁移前修复所有 Schema 兼容性问题
- 字符集迁移:尽早转换为 utf8mb4(建议在迁移前 3-5 天完成)
- 备份策略:确保迁移前有最新备份可用
- 维护窗口:根据数据库大小安排充足的停机时间
迁移期间
- 停止应用写入:确保导出/导入期间没有写入,以保持一致性
- 监控进度:定期跟踪导出/导入进度
- 保留源端运行:在迁移验证完成前不要删除源端
迁移后
- 全面测试:彻底测试应用功能
- 性能监控:持续监控查询性能 24-48 小时
- 保留源端用于回滚:在回滚窗口内保留源集群 24-48 小时
- 更新文档:更新连接字符串和监控面板