mysql - 在不停机的情况下将完整数据库从 utf8mb3 (utf-8) 转换为 utf8mb4 的正确方法是什么?
问题描述
由于 MySQL 8.0 已经贬低了 utf8mb3(并且随后将在未来完全删除对 utf8mb3 的支持),将完整的数据库(生产中)从 utf8mb3(utf-8)升级/转换为 utf8mb4 没有(或最少)停机时间的正确方法是什么?
问题不在于转换,我知道此转换存在多个脚本。我主要担心的是停机时间。是否有可能在不停机的情况下实现这一目标?
解决方案
假设没有奴隶、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 研究“故障转移”选项和速度。如果您可以控制故障转移,那么此方法可能会快速且“简单”且可行。我假设它真的是主从,而不是主主?
- 使用 Slave,让它从 Master 复制。(潜在问题:RBR 可能会在 utf8 复制到 utf8mb4 时发出警告。这需要调查。)
ALTER TABLE ... CONVERT TO ...
为从站上的每张桌子做。- 故障转移。
- 根据 RDS 拥有的工具,最好从新的 Master 重建 Slave,而不是
ALTERs
在新的 Slave(即旧的 Master)上重建。
建议你启动一些具有相同主从拓扑和版本和字符集的小实例。然后尝试这些步骤。它不需要可能的行,但它确实需要FOREIGN KEYs
、触发器等,以防它们中的任何一个造成麻烦。(请注意 pt-osc 如何与 FK 存在一些问题。)
推荐阅读
- reactjs - 使用反应钩子形式受控组件,第一次按键不起作用
- python - 用于读取 CSV 并加载到 PostgreSQL 的气流管道
- shapes - 如何根据条件同时仅显示其中一个形状的状态
- javascript - 新用户输入后如何更新 JSON 查询/数据?
- odoo - 按钮单击 odoo 网站时生成警告
- python - 如何计算重叠轮廓
- post - 通过 ServiceNow Table API 创建知识库文章
- ios - UICollectionView cellForItemAt 在滚动时被调用两次
- arrays - 如何将字符串添加到Powershell中数组中的重复元素
- ruby-on-rails - Devise 的默认登录方法是什么(例如 http-auth、token-auth)以及如何正确设置?