我要将表格字符集从“utf8”更改为“utf8mb4”但每列都有自己的字符集设置(utf8)因此,我需要将列字符集更改为“table default”,但锁定是个问题帮助我在不锁定表的情况下更改列字符集表中有超过100000000行
vof42yt11#
“字符集”是以字节为单位的字符编码。“排序规则”是如何对字符排序。一 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 而重建索引仍悬而未决。)如果您尝试这些技术之一,我强烈建议您构建一个至少包含一百万行的表,并尝试所有步骤(alter add、join、recreate index、alter drop column等),以验证哪些部分“足够快”和/或“不锁定”。
INDEX
VARCHAR
ALTER TABLE t CONVERT TO utf8mb4;
ALGORITHM=COPY
pt-online-schema-change
gh-ost
JOINs
ALTER
ADD COLUMN
ALGORITHM=INPLACE
ALGORITHM=INSTANT
DROP COLUMN
JOIN
1条答案
按热度按时间vof42yt11#
“字符集”是以字节为单位的字符编码。
“排序规则”是如何对字符排序。
一
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
而重建索引仍悬而未决。)如果您尝试这些技术之一,我强烈建议您构建一个至少包含一百万行的表,并尝试所有步骤(alter add、join、recreate index、alter drop column等),以验证哪些部分“足够快”和/或“不锁定”。