【发布时间】:2018-08-28 08:47:29
【问题描述】:
我想将表格字符集从“utf8”更改为“utf8mb4”
但每列都有自己的字符集设置(utf8)
所以我需要将列字符集更改为“表默认值”,但问题是锁定
帮我更改没有表锁定的列字符集
表中有超过 100,000,000 行
【问题讨论】:
标签: mysql collation table-lock
我想将表格字符集从“utf8”更改为“utf8mb4”
但每列都有自己的字符集设置(utf8)
所以我需要将列字符集更改为“表默认值”,但问题是锁定
帮我更改没有表锁定的列字符集
表中有超过 100,000,000 行
【问题讨论】:
标签: mysql collation table-lock
“字符集”是以字节为单位的字符编码。
“排序规则”是如何对字符进行排序。
VARCHAR 上的 INDEX 按其排序规则排序,因此更改列的排序规则需要重建索引——这是一项不平凡的操作。
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 和重建索引的问题仍然悬而未决。)
如果您尝试其中一种技术,我强烈建议您构建一个至少有一百万行的表并尝试所有步骤(更改添加、连接、重新创建索引、更改删除列等)以验证哪些部分是“足够快”和/或“非锁定”。
【讨论】: