(MySQL 5.7.19 AWS RDS)如何更改表列字符集而不进行锁定

时间:2018-08-28 08:47:30

标签: mysql collation table-lock

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

表中有超过100,000,000行

1 个答案:

答案 0 :(得分:0)

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

INDEX上的VARCHAR是按其排序规则排序的,因此,更改列的排序规则需要重建索引-这是不平凡的操作。

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和重建索引的问题仍然悬而未决。)

如果您尝试这些技术之一,强烈建议您建立一个至少包含一百万行的表,并尝试所有步骤(更改添加,联接,重新创建索引,更改放置列等)以验证哪些部分是“足够快”和/或“非锁定”。