将 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),并且从 Alauda Data Services Relational Database E1 v4.3.0 开始,MySQL-PXC 已弃用并被移除。组织必须迁移到 MySQL 8.0,才能继续接收安全更新并利用新功能。
迁移生产数据库涉及复杂的考量:
- 与 MySQL 8.0 保留关键字的架构兼容性
- 字符集变更(utf8mb4)
- 身份验证插件更新
- 确保迁移期间的数据完整性
解决方案
本指南提供了将 MySQL-PXC 5.7 迁移到 MySQL-MGR 8.0 的完整且经过验证的操作说明:
- 经过验证的方法:在使用 Alauda Data Services Relational Database E1 的 ACP v4.0+ 上经过验证
- 完整的对象覆盖范围:迁移所有标准 MySQL 对象(表、视图、例程、触发器、事件、用户和授权)
- 架构兼容性:自动检查并修复 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 选项和命令 - 避免将 heredoc(
<<EOF)与kubectl exec配合使用 — 这通常会因 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:迁移数据、用户和权限
重要:停止应用写入
从此时起直到切换完成,应用必须保持停止状态(或严格设置为只读)。此步骤之后写入源数据库的任何数据都将丢失。
操作步骤:
-
停止应用写入:将应用副本数扩展为零:
-
确定要迁移的数据库:
-
导出和导入数据:
-
迁移用户和权限:
TIP在 MySQL 8.0 目标端上,
SHOW CREATE USER会保留原始身份验证插件和密码哈希,因此迁移后用户可以使用现有密码登录。如果需要切换到mysql_native_password以兼容客户端,请运行:MySQL 8.4 目标端在 MySQL 8.4 目标端上,
mysql_native_password插件默认未加载且无法启用,因此重新应用 5.7/8.0 的SHOW CREATE USER定义(使用mysql_native_password)时会因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 流式传输方式不需要为转储文件预留磁盘空间。
步骤 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 目标实例):mysql_native_password 在 8.4 中不可用(ERROR 1524: Plugin 'mysql_native_password' is not loaded),因此无法回退到该插件。请改为将客户端驱动程序/连接器升级到支持 caching_sha2_password 的版本(并使用 TLS,因为 caching_sha2_password 要求在非本地连接上进行初始密码交换时使用 TLS)。让用户继续使用默认的 caching_sha2_password 插件。
故障排除
诊断命令
检查迁移进度:
验证数据完整性:
检查 MySQL 8.0 错误日志:
最佳实践
迁移前规划
- 在预发布环境中测试:始终先在非生产环境中执行测试迁移
- 清理架构:在生产环境迁移之前修复所有架构兼容性问题
- 字符集迁移:提前转换为 utf8mb4(提前 3-5 天)
- 备份策略:确保迁移前已有最新备份可用
- 维护窗口:根据数据库大小安排足够的停机时间
迁移期间
- 停止应用写入:确保导出/导入期间没有写入操作,以保证一致性
- 监控进度:定期跟踪导出/导入进度
- 保持源实例运行:在确认迁移完成之前不要删除源实例
迁移后
- 全面测试:彻底测试应用功能
- 性能监控:监控查询性能 24-48 小时
- 保留源实例以便回滚:保留源集群 24-48 小时作为回滚窗口
- 更新文档:更新连接字符串和监控面板