首页 > 解决方案 > 在不停机的情况下将完整数据库从 utf8mb3 (utf-8) 转换为 utf8mb4 的正确方法是什么?

问题描述

由于 MySQL 8.0 已经贬低了 utf8mb3(并且随后将在未来完全删除对 utf8mb3 的支持),将完整的数据库(生产中)从 utf8mb3(utf-8)升级/转换为 utf8mb4 没有(或最少)停机时间的正确方法是什么?

问题不在于转换,我知道此转换存在多个脚本。我主要担心的是停机时间。是否有可能在不停机的情况下实现这一目标?

标签: mysql

解决方案


假设没有奴隶、8.0、没有触发器和其他一些东西,我会推荐

pt-online-schema-change

它将CREATE TABLE使用新模式(utf8mb4),然后从现有表(utf8 aka utf8mb3)复制行,并使用触发器保持同步。最后在桌子上有一个短暂的锁来完成和交换桌子。

你会一次做一张桌子。

文档:https ://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

也四处寻找它;有时缩写pt-osc

与奴隶

使用 RDS 研究“故障转移”选项和速度。如果您可以控制故障转移,那么此方法可能会快速且“简单”且可行。我假设它真的是主从,而不是主主?

  1. 使用 Slave,让它从 Master 复制。(潜在问题:RBR 可能会在 utf8 复制到 utf8mb4 时发出警告。这需要调查。)
  2. ALTER TABLE ... CONVERT TO ...为从站上的每张桌子做。
  3. 故障转移。
  4. 根据 RDS 拥有的工具,最好从新的 Master 重建 Slave,而不是ALTERs在新的 Slave(即旧的 Master)上重建。

建议你启动一些具有相同主从拓扑和版本和字符集的小实例。然后尝试这些步骤。它不需要可能的行,但它确实需要FOREIGN KEYs、触发器等,以防它们中的任何一个造成麻烦。(请注意 pt-osc 如何与 FK 存在一些问题。)


推荐阅读