MySQL改变巨大的表(改变字段类型)

时间:2014-04-03 13:18:24

标签: mysql performance

所以我有一张4 016 515 759行的表格。我需要将address_id字段的字段类型从int更改为bigint,还要更改为FOREIGN KEY

我刚测试了这个查询:

SET foreign_key_checks = 0;
ALTER TABLE `my_table` CHANGE address_id address_id bigint;

6 845 016行的本地表上 - 需要14分钟。我猜测生产这40亿行需要很长时间。

所以问题是:如何快速安全地更新这个?或者我应该复制my_table并在此副本上执行ALTER然后为其命名吗?

因为停机时间很长。

1 个答案:

答案 0 :(得分:1)

修改:这可能是引擎特定的。

更改一个包含外键的常用表中的列...您正在进入一个伤害我朋友的世界。

如果您在当时实际使用的环境中执行此操作,则整个表将被锁定,直到您的更改完成。准备锁定等待超时甚至最大连接错误。根据您的情况,只需几分钟的更改就可能意味着停机时间。

有些人非常努力地解决这个问题:

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

请务必阅读有关外键的部分。

因此...

我个人的方法是避免这样的事情,并试图通过过度强化任何可能变得太小和太重要的字段来防止它。所有数字主键上的无符号bigint等。

但是,有一段时间,其他人只是在一个巨大的转换桌上踢,一切都堵塞,我们达到最大连接。很难防止这种情况,因为测试不会那么困难:简单的测试环境没有那么多的流量。

问题在于:不可避免的mysql重启会使用表格重新启动新结构。

简短版本:

  • 计划停机时间
  • 通过关闭内容来最小化客户端查询
  • 运行alter table
  • 当你开始觉得无聊时重启MySQL