(MySQL 5.7.19 AWS RDS) 如何在不锁定的情况下更改 table 列字符集

(MySQL 5.7.19 AWS RDS) how to change table column character set without locking

我想将 table 字符集从 'utf8' 更改为 'utf8mb4'
但每一列都有自己的字符集设置(utf8)
所以我需要将列字符集更改为 'Table Default',但锁定是问题
帮助我在没有 table 锁定

的情况下更改列字符集 table

中有超过 100,000,000 行

"Character set"是字符的字节编码。
"Collation"是字符排序的方法。

VARCHAR 上的 INDEX 按其排序规则排序,因此更改列的排序规则需要重建索引 -- 一项重要的操作。

utf8 和 utf8mb4 之间的区别相对较小,但我不认为 MySQL(因此 RDS)对此做了特例。

ALTER TABLE t CONVERT TO utf8mb4; 听起来像你想要的操作。这需要 ALGORITHM=COPY,所以它是 'locking'。

研究 pt-online-schema-changegh-ost 作为改变 table 的一种方式,即使它需要 "copy"。这些本质上是非阻塞的。但是,我不知道它们是否可以与 RDS 一起使用。此外,由于 JOINs 和其他 table 可能需要与另一个保持一致的情况,这些工具可能不实用。

另一种方法...添加另一列;更改您的代码以同时使用旧列和新列。同时,逐渐将旧值复制到新列;完成后,再次更改您的代码——这次使用新列而不是旧列。稍后,担心删除死列。

最近的版本MySQL对ALTER的速度有了很大的改变,所以一定要研究一下RDS是从什么版本派生的。在5.6中,ADD COLUMN可以使用ALGORITHM=INPLACE;在 8.0 中,ALGORITHM=INSTANT。我认为就您的目的而言,其中任何一个都不是 "locking"。 (DROP COLUMN 并不便宜;JOIN 和重建索引的问题仍然悬而未决。)

如果您尝试其中一种技术,我强烈建议您构建一个至少包含一百万行的 table 并尝试所有步骤(更改添加、连接、重新创建索引、更改删除列等) ) 验证哪些部分是 "fast enough" and/or "non-locking".