MySQL Alter巨型表(更改字段类型)

MySQL Alter巨型表(更改字段类型),mysql,performance,Mysql,Performance,因此,我有一个包含4 016 515 759行的表。我需要将我的地址\u id字段的字段类型从int更改为bigint,同时它也是一个外键 我刚刚测试了这个查询: SET foreign_key_checks = 0; ALTER TABLE `my_table` CHANGE address_id address_id bigint; 在包含6 845 016行的本地表上-需要14分钟。我想这40亿行的生产需要很长时间 所以问题是:如何真正快速安全地更新它?或者我应该复制我的_表,并对该副本

因此,我有一个包含
4 016 515 759
行的表。我需要将我的
地址\u id
字段的字段类型从
int
更改为
bigint
,同时它也是一个
外键

我刚刚测试了这个查询:

SET foreign_key_checks = 0;
ALTER TABLE `my_table` CHANGE address_id address_id bigint;
在包含
6 845 016
行的本地表上-需要14分钟。我想这40亿行的生产需要很长时间

所以问题是:如何真正快速安全地更新它?或者我应该复制
我的_表
,并对该副本进行
更改
,然后重新命名


因为停机时间很长。

编辑:这可能是特定于引擎的

更改一个常用表中具有外键的列。。。你正在进入一个受伤的世界,我的朋友

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

有些人神秘地围绕着它工作:

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

所以

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

不过,偶尔会有人踢进一张巨大的桌子,所有东西都会阻塞,我们会碰到max connections。这很难防止,因为测试不会那么难失败:一个简单的测试环境没有那么多流量

问题是:不可避免的mysql重启往往会在短时间内用新结构恢复表

简短版本:

  • 计划停机时间
  • 通过关闭内容最小化客户端查询
  • 运行alter表
  • 当您开始感到厌烦时,重新启动MySQL

  • address\u id
    的默认值为0
    address\u id not null默认值为0
    相同结果,约14分钟