在我的生产数据库中,使用“latin”的默认CharSet创建警报相关表,因此我们在尝试时遇到错误 在表中插入日语字符。我们需要将表和列的默认字符集更改为UTF8。 由于这些表具有大量数据,因此Alter命令可能需要花费很长时间(在本地数据库中使用相同数量的数据需要5小时) 并锁定将导致数据丢失的表。我们是否可以计划一种机制来将Charset更改为UTF8,而不会丢失数据。
这是更改大型数据表的字符集的更好方法吗?
答案 0 :(得分:6)
我在mysql手册http://dev.mysql.com/doc/refman/5.1/en/alter-table.html上找到了这个:
在大多数情况下,ALTER TABLE会制作原始文件的临时副本 表。 MySQL等待修改表的其他操作, 继续。它将更改合并到删除中 原始表,并重命名新表。虽然ALTER TABLE是 执行时,原始表可由其他会话读取。更新 并写入在ALTER TABLE操作之后开始的表 开始停止,直到新表准备好,然后是 自动重定向到新表而没有任何更新失败
所以是的 - 在这样做的同时最大限度地减少停机时间是很棘手的。这取决于您的表的使用情况,是否有更多的读/写?
我能想到的一种方法是使用某种复制方式。因此,创建一个使用UTF-8的新Alert表,并找到一种方法将原始表复制到新表而不影响可用性/吞吐量。复制完成后(或足够接近),通过重命名来切换表?
当然,这说起来容易做起来 - 如果可能的话还需要更多的学习。
答案 1 :(得分:5)
您可以查看Percona Toolkit :: online-chema-change工具:
pt-online-schema-change
它正是这样做的 - "改变了表格的结构,而没有阻止读取或写入" - 和一些
限制(仅限InnoDB表等)和涉及的风险。
答案 2 :(得分:1)
在设置复制问题停止从站命令并更改表时,在其他计算机或实例上创建数据库的复制副本。如果您有多个表,则在每次会话之间可以考虑再次发出启动从站以同步两个数据库。 (如果不这样做,可能需要更长时间才能同步)完成转换后,复制的副本可以替换旧的生产数据库,并删除旧的数据库。这是我发现最小化停机时间的方法。