2

我想将表字符集从“utf8”更改为“utf8mb4”
,但每列都有自己的字符集设置(utf8)
所以我需要将列字符集更改为“表默认”,但锁定是问题
帮助我更改列没有表锁定的字符集表中

有超过 100,000,000 行

4

1 回答 1

2

“字符集”是以字节为单位的字符编码。
“排序规则”是如何对字符进行排序。

INDEXa 上的anVARCHAR按其排序规则排序,因此更改列的排序规则需要重新构建索引——这是一个不平凡的操作。

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

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

调查pt-online-schema-changegh-ost作为改变表格的一种方式,即使它需要“复制”。这些基本上是非阻塞的。但是,我不知道它们是否可以与 RDS 一起使用。此外,由于JOINs一个表可能需要与另一个表保持一致的其他情况,这些工具可能不实用。

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

最近的 MySQL 版本在速度上有很大的变化ALTER,所以一定要研究一下 RDS 是从哪个版本衍生出来的。在 5.6 中,ADD COLUMN可以使用ALGORITHM=INPLACE; 在 8.0 中,ALGORITHM=INSTANT. 我认为出于您的目的,其中任何一个都不是“锁定”的。(DROP COLUMN并不便宜;JOIN重建索引的问题仍然悬而未决。)

如果您尝试其中一种技术,我强烈建议您构建一个至少有一百万行的表并尝试所有步骤(更改添加、连接、重新创建索引、更改删除列等)以验证哪些部分“足够快” ”和/或“非锁定”。

于 2018-08-28T22:35:52.257 回答