所以我有一张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
然后为其命名吗?
因为停机时间很长。
答案 0 :(得分:1)
修改:这可能是引擎特定的。
更改一个包含外键的常用表中的列...您正在进入一个伤害我朋友的世界。
如果您在当时实际使用的环境中执行此操作,则整个表将被锁定,直到您的更改完成。准备锁定等待超时甚至最大连接错误。根据您的情况,只需几分钟的更改就可能意味着停机时间。
有些人非常努力地解决这个问题:
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
请务必阅读有关外键的部分。
因此...
我个人的方法是避免这样的事情,并试图通过过度强化任何可能变得太小和太重要的字段来防止它。所有数字主键上的无符号bigint等。
但是,有一段时间,其他人只是在一个巨大的转换桌上踢,一切都堵塞,我们达到最大连接。很难防止这种情况,因为测试不会那么困难:简单的测试环境没有那么多的流量。问题在于:不可避免的mysql重启会使用表格重新启动新结构。
简短版本: