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


13

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

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

更新:根据要求,MySQL ver 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

确定疼痛,以最短的时间....?最快的结果?

@AlecTeal用最短的时间
Noam

尽管它不能回答问题,并且在表格变大之前就曾对此问题进行过讨论,但我也希望找到一种减小表格大小的方法。

1
哪个版本的MySQL?就像某些版本一样重要ALTER TABLE ONLINE。您是否有外键引用此列?如果您显示SHOW CREATE TABLE tablename;输出,它将有所帮助。
ypercubeᵀᴹ

2
如果短字段名有助于减小表大小,则将为600 MB
所有行业的乔恩(Jon of All Trades)2013年

Answers:


2

假设您的表没有任何触发器,则应考虑使用,pt-online-schema-change因为它将允许您更改表而不锁定它。

鉴于表的大小,仍然需要花费大量时间。

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


有时间估计吗?(我知道这取决于许多因素,但是如果您不得不猜测,范围会是多少)
Noam

@Noam,您不需要复制表格。如果您使用Alter表,那么最坏的情况就是它复制,如果您使用的是成熟的引擎,它只会给自己做一个记述,即之前(文件中的某些位置或某些记录)使用int,任何后继使用bigint直到你很乐观。

@AlecTeal您对此有正式参考吗?
Noam 2013年

@诺姆看到我的答案。

1
@Noam我估计这ALTER TABLE可能需要24-96 个小时才能运行。通过在测试环境中运行ALTER TABLE可以得到更好的估计。
艾克·沃克

2

pt-online-schema-change在不影响使用的情况下,我将选择使用percona工具包进行生产。这将添加一些触发器来获取您的增量和一个临时表,该表在完成后将重命名。

例:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt是要走的路。@Noam FYI:在270GB的表上进行INT-> BIGINT迁移,在EC2实例上有很多行,并且此表上的写入活动非常繁重,使用pt-online-schema-change花费了64个小时。
JakubGłazik2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.