将 600GB 表索引键数据类型从 INT 更改为 BIGINT 的最快方法

Noa*_*oam 13 mysql database-design alter-table mysql-5.5

我需要将 600GB MySQL 表中的数据类型从 INT 更改为 BIGINT。该列具有唯一索引。我可能对 unsigned INT 很好,但我认为更改为 unsigned 或 BIGINT 将几乎相同的痛苦。该表的引擎是 InnoDB。什么会更容易:

  1. 更改表
  2. 复制结构和 INSERT INTO (SELECT *)
  3. 转储表和更改转储文件表定义
  4. 还要别的吗?

更新:根据要求,MySQL 5.5.15 版,没有外键并创建表:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

Ike*_*ker 2

假设您的表上没有任何触发器,您应该考虑使用它,pt-online-schema-change因为它允许您在不锁定表的情况下更改表。

考虑到表的大小,这仍然需要相当长的时间。

此外,使用此方法或使用ALTER TABLE您将需要确保有 600 GB 的额外磁盘空间来支持重建表时的两个副本。