2013-01-25 24 views
2

在我的生产数据库中,警报相关表是使用默认的“拉丁”CharSet创建的,由于这个原因,我们在尝试使用 来在表中插入日文字符时出现错误。我们需要将表和列默认字符集更改为UTF8。 由于这些表的数据量很大,Alter命令可能会花费很多时间(在本地数据库中花费5小时,数据量相同) 并锁定导致数据丢失的表。我们是否可以计划一种机制将Charset更改为UTF8,而不会丢失数据。哪个更好的方法来改变大数据表的字符集?

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

+0

我想认为插入UTF8字符到latin1表将触发任何错误。 – ajreal

回答

3

我发现这对MySQL手册http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

在大多数情况下,ALTER TABLE使得原本 表的临时副本。 MySQL等待其他正在修改该表的操作,然后继续执行。 。它将修改合并到副本中,删除原始表格 ,并重命名新的表格。当执行ALTER TABLE为 时,其他会话可以读取原始表。更新 和写入表的ALTER TABLE操作 开始被延迟到新表准备好后开始,然后是 自动重定向到新表,没有任何失败的更新

所以,是的 - 这是棘手尽量减少停机时间。这取决于您的表的使用情况,是否有更多的读/写?

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

当然这说起来容易做起来难 - 如果甚至有可能需要更多的学习。

2

你可以看看到Percona的工具包::在线CHEMA变化的工具: pt-online-schema-change
这不正是这一点 - “改变表的结构而不阻塞读取或写入” - 一些 限制(只InnoDB表等)和涉及的风险。

1

当您设置复制问题stop slave命令并更改表格时,在其他机器或实例上创建数据库的副本。如果您有多个表格,则在每次对话之间,您可能会考虑再次启动从属服务器以同步两个数据库。 (如果您不这样做,可能需要更长时间才能同步)完成转换后,复制副本可以替换旧的生产数据库,并删除旧的生产数据库。这是我发现最大限度地减少停机时间的方式。

相关问题