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

Raj*_*oel 5 mysql

由于 MySQL 8.0 已弃用 utf8mb3(并且将来将完全删除 utf8mb3 支持),因此在没有(或最少)停机时间的情况下将完整数据库(生产中)从 utf8mb3 (utf-8) 升级/转换为 utf8mb4 的正确方法是什么?

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

Ric*_*mes 5

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

pt-online-schema-change
Run Code Online (Sandbox Code Playgroud)

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

你会一次做一张桌子。

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

还到处寻找它;有时缩写pt-osc

与奴隶

研究 RDS 的“故障转移”选项和速度。如果您可以控制故障转移,那么这种方法可能会快速、“简单”并且可行。我认为这真的是主从,而不是主主?

  1. 对于从站,让它从主站复制。(潜在问题:RBR 可能会在 utf8 复制到 utf8mb4 时发出警告。这需要调查。)
  2. ALTER TABLE ... CONVERT TO ...对从站上的每个表执行此操作。
  3. 故障转移。
  4. 根据 RDS 拥有的工具,从新的 Master 重建 Slave可能ALTERs比在新的 Slave(旧的 Master)上重建更好。

建议您使用相同的主从拓扑、版本和字符集启动一些小型实例。然后尝试以下步骤。它不需要很多行,但它确实需要FOREIGN KEYs,触发器等,以防它们中的任何一个引起麻烦。(注意 pt-osc 在 FK 方面存在一些问题。)