所以我有一个包含 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
然后重命名它吗?
因为停机时间会很长。
最佳答案
编辑:这可能是引擎特定的。
更改具有外键的常用表中的列......你正在进入一个伤害我的 friend 的世界。
如果您在当时实际使用的环境中执行此操作,则整个表将被锁定,直到您的更改完成。为锁定等待超时甚至最大连接错误做好准备。根据您的情况,仅几分钟的变化可能意味着停机。
有些人巧妙地解决了这个问题:
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
请务必阅读有关外键的部分。
所以...
我个人的方法是避免这样的事情,并试图通过扩大任何可能变得太小和太重要的字段来防止它。所有数字主键等上的无符号双整数。
不过,偶尔,其他人只是踢了一个巨大的变更表,一切都堵塞了,我们达到了最大连接数。很难防止这种情况发生,因为测试不会那么失败:一个简单的测试环境没有那么多流量。
问题是:不可避免的 mysql 重启往往会立即用新结构恢复表。
简短版:
- 计划停机时间
- 通过关闭内容来最大程度地减少客户查询
- 运行修改表
- 当你开始感到无聊时重启 MySQL
关于MySQL Alter huge table(更改字段类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22838998/