(mysql 5.7.19 aws rds)如何在不锁定的情况下更改表列字符集

vh0rcniy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(363)

我要将表格字符集从“utf8”更改为“utf8mb4”
但每列都有自己的字符集设置(utf8)
因此,我需要将列字符集更改为“table default”,但锁定是个问题
帮助我在不锁定表的情况下更改列字符集
表中有超过100000000行

vof42yt1

vof42yt11#

“字符集”是以字节为单位的字符编码。
“排序规则”是如何对字符排序。
INDEXVARCHAR 是按其排序规则排序的,因此更改列的排序规则需要重建索引--这是一个非常重要的操作。
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 而重建索引仍悬而未决。)
如果您尝试这些技术之一,我强烈建议您构建一个至少包含一百万行的表,并尝试所有步骤(alter add、join、recreate index、alter drop column等),以验证哪些部分“足够快”和/或“不锁定”。

相关问题