由于业务需求,需要变更表的字符集(例如从gbk变更为utf8mb4),如果直接使用ALTER命令修改字符集会锁表,当数据表过大时,对业务的影响较大。
本文介绍的操作方法需要先在目标实例中创建表结构信息(新字符集),再通过DTS将源实例的数据迁移至目标实例,同时可建立简易回滚方案或双写方案,平滑地完成RDS MySQL字符集的变更。
注意事项
- 在执行变更字符集之前,请对业务和SQL进行充分的兼容性测试和功能验证,确认正常后再执行本操作。
- DTS在执行全量数据迁移时将占用源实例和目标实例一定的读写资源,可能会导致数据库的负载上升。因此您需要在执行数据迁移前评估源实例和目标实例的性能,同时建议您在业务低峰期执行数据迁移。
- 如果源实例的待迁移对象没有主键或唯一约束,且所有字段没有唯一性,可能会导致目标实例中出现重复数据。
步骤一:将源实例中表的结构导入至新实例中
步骤二:将源实例中表的数据迁移至新的实例
步骤三:业务切换
您可以根据业务需求选择下述方案执行业务切换:
- 简易回退方案(有一定的回滚失败风险,无需改造业务的应用程序)
- 在目标RDS MySQL实例中完成迁移后的数据校验。
- 执行业务切换并建立回退方案(将目标库的增量数据实时迁移回源库中),详情请参见业务切换流程。
- 回退方案保持一个业务周期,测试完所有功能,确认无误后可结束回退方案中创建的反向数据迁移任务。
- 可选:如不再需要源实例,可将其释放(按量付费实例)或退订(包年包月实例)。
- 双写方案(可保障回滚成功率,业务的应用程序改造量大)
- 对业务的应用程序进行改造,让其实现双写的逻辑(即数据变更会同时向源和目标实例写入)。
- 结束数据迁移任务。
- 全量数据迁移
请勿手动结束迁移任务,否则可能导致数据不完整。您只需等待迁移任务完成即可,迁移任务会自动结束。
- 增量数据迁移
迁移任务不会自动结束,您需要手动结束迁移任务。
- 观察迁移任务的进度变更为增量迁移,并显示为无延迟状态时,将源库停写几分钟,此时增量迁移的状态可能会显示延迟的时间。
- 等待迁移任务的增量迁移再次进入无延迟状态后,手动结束迁移任务。
说明 您可以登录源实例,执行show processlist;
查看会话信息,确保没有新的会话执行写入操作。 - 全量数据迁移
- 在目标RDS MySQL实例中完成迁移后的数据校验。
- 将业务的应用程序设置为双写,即数据变更会同时写入源和目标实例。
- 双写状态保持一个业务周期,测试完所有功能,确认无误后可调整为只写入目标实例。
- 可选:如不再需要源实例,可将其释放(按量付费实例)或退订(包年包月实例)。