我想将表字符集从'utf8'更改为'utf8mb4'
但是每列都有自己的字符集设置(utf8)
所以我需要将列字符集更改为“表默认值”,但是锁定是问题所在
帮助我更改没有表锁定的列字符集
表中有超过100,000,000行
答案 0 :(得分:0)
“字符集”是字符的字节编码。
“排序规则”是如何对字符进行排序。
INDEX
上的VARCHAR
是按其排序规则排序的,因此,更改列的排序规则需要重建索引-这是不平凡的操作。
utf8和utf8mb4之间的差异相对较小,但是我不认为MySQL(因此RDS)对此做了特殊的说明。
ALTER TABLE t CONVERT TO utf8mb4;
听起来像您想要的操作。这需要ALGORITHM=COPY
,所以它是“锁定”的。
查看pt-online-schema-change
和gh-ost
作为更改表的一种方式,即使需要“复制”也是如此。这些本质上是非阻塞的。但是,我不知道它们是否可以与RDS一起使用。另外,由于JOINs
和其他情况下一个表可能需要与另一个表保持一致,因此这些工具可能不实用。
另一种方法...添加另一列;更改代码以同时使用旧列和新列。同时,逐渐将旧值复制到新列;完成此操作后,再次更改代码-这次使用新列而不是旧列。稍后,请担心会删除死列。
MySQL的最新版本在ALTER
的速度上进行了重大更改,因此请务必研究RDS源自哪个版本。在5.6中,ADD COLUMN
可以使用ALGORITHM=INPLACE
;在8.0中,ALGORITHM=INSTANT
。我认为这些都不是为了您的目的而“锁定”。 (DROP COLUMN
并不便宜; JOIN
和重建索引的问题仍然悬而未决。)
如果您尝试这些技术之一,强烈建议您建立一个至少包含一百万行的表,并尝试所有步骤(更改添加,联接,重新创建索引,更改放置列等)以验证哪些部分是“足够快”和/或“非锁定”。