生产中从INT到BIGINT的ALTER主键列(MySQL 5.6.19a)


20

生产数据库中的某些INNODB表即将达到INT AUTO_INCREMENT限制2147483647,我们需要将它们更改为BIGINT,否则写入将开始失败。

这些表位于在Amazon RDS上运行的生产MySQL 5.6.19a数据库中。

我们如何做这样的ALTER,而又不中断一直在发生的生产读取和插入?

ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT;

这是该表的DDL:

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8

Answers:


22

如果有足够的空间,则可以创建实际表的副本并在该表上进行工作:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

然后,您可以根据需要更改列:

ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;

完成该过程后,您可以重命名表:

RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;

然后删除原始表,您应该得到指定的结果。


之所以使用这种方法,是因为我在执行复制时可以关闭对表的写操作(全部为批处理模式)。花了大约36个小时。
Mark Hansen

并且您想将这三个交易合而为一。(锁定/解锁)
斯瓦沃米尔Lenart

4

percona工具箱是必经之路,至少在您时间不短的情况下如此。当我们测试它超过24小时时,转换就出现在我们的表上(500Gb,主从设置),在生产中(使用更好的硬件)花费了将近1个月的时间(有趣的旁注,我们大约需要30天才能用完) id,因此我们已经开始计划B和C计划,使用脱机备份,删除从属,...)。延迟的主要原因是等待复制到从属服务器(我们允许最大50秒的时间延迟)。另外,请确保限制并发线程数。每天我们的插入量超过200万,读取次数达数百万。

另请注意,一旦掩盖开始,您就无法停止(或至少我们找不到重新启动它的任何方法):-(


1

好....

KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) PRIMARY KEY是多余的,因此您最好将其删除。

INT UNSIGNED将使您达到40亿美元,足够了吗?

考虑更改filterENUM

您有17.5亿行吗?还是您“烧掉”了很多身份证?如果是这样,也许我们可以解决这个问题?例如REPLACE,某些类型的INSERT遗嘱ID。 INSERT...ON DUPLICATE KEY通常可以更换REPLACE。分两步进行的流程可以避免INSERT IGNOREID的燃烧。

回到问题...

看看pt-online-schema-change是否能解决问题:http : //www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html


我可以将percona与Amazon RDS一起使用吗?是的,我们已经“刻录”了很多ID,该表实际上有大约3.3亿行。
Mark Hansen

我不了解pt和RDS。如果可以消除燃烧,在没有空间的情况下,您还有大约3.3亿个ID。
里克·詹姆斯
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.