哪个更改大数据表的字符集更好?

mit*_*ous 5 mysql sql character-encoding

在我的生产数据库中,使用"latin"的默认CharSet创建警报相关表,因此我们在尝试在表中插入日语字符时会收到错误.我们需要将表和列的默认字符集更改为UTF8.由于这些表具有巨大的数据,因此Alter命令可能需要花费很长时间(在我的本地数据库中花费5小时的数据量相同)并锁定会导致数据丢失的表.我们是否可以计划一种机制来将Charset更改为UTF8,而不会丢失数据.

哪个是更改大型数据表的字符集的更好方法?

ger*_*tan 6

我在mysql手册http://dev.mysql.com/doc/refman/5.1/en/alter-table.html上找到了这个:

在大多数情况下,ALTER TABLE会生成原始表的临时副本.MySQL等待修改表的其他操作,然后继续.它将更改合并到副本中,删除原始表,并重命名新表.在执行ALTER TABLE时,原始表可由其他会话读取.对ALTER TABLE操作开始后开始的表的更新和写入将停止,直到新表准备就绪,然后自动重定向到新表而没有任何失败的更新

所以是的 - 在这样做的同时最大限度地减少停机时间是很棘手的.这取决于您的表的使用情况,是否有更多的读/写?

我能想到的一种方法是使用某种复制.因此,创建一个使用UTF-8的新Alert表,并找到一种方法将原始表复制到新表而不影响可用性/吞吐量.复制完成后(或足够接近),通过重命名切换表?

当然,这说起来容易做起来 - 如果可能的话还需要更多的学习.


小智 5

您可以查看Percona Toolkit :: online-chema-change工具: pt-online-schema-change
它确实这样做 - "改变表的结构而不阻塞读取或写入" - 有一些限制(仅限InnoDB表等)和风险.