暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

auto_increment最大值问题处理

黄江平 2025-01-19
191

当表的主键ID用了auto_increment时,达到最大值,想快速修改其类型时,8.0首先想到的是快速加列的方式修改。
操作如下:
mysql> CREATE TABLE test6 (
-> id int NOT NULL AUTO_INCREMENT,
-> a int DEFAULT NULL,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB AUTO_INCREMENT=2147483647;
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test6(a) values(111);
Query OK, 1 row affected (0.04 sec)

mysql> insert into test6(a) values(112);
ERROR 1062 (23000): Duplicate entry ‘2147483647’ for key ‘test6.PRIMARY’

达到最大值,修改表字段id 类型
mysql> ALTER TABLE test6 MODIFY id int UNSIGNED NOT NULL AUTO_INCREMENT, ALGORITHM=INPLACE, LOCK=NONE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

mysql> ALTER TABLE test6 MODIFY id int UNSIGNED NOT NULL AUTO_INCREMENT, ALGORITHM=INSTANT;
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Need to rebuild the table to change column type. Try ALGORITHM=COPY/INPLACE.

从以上2个错误可以看出,在线ddl并不支持,原因是需要重建表。
实际上修改字段id的类型是一样的,都是int(只是改为int UNSIGNED,改变了id的最大值)。

那这种我们只能通过最原始的办法修改id类型。
mysql> ALTER TABLE test6 MODIFY id int UNSIGNED NOT NULL AUTO_INCREMENT;
Query OK, 1 row affected (0.40 sec)
Records: 1 Duplicates: 0 Warnings: 0

这样操作就会有锁表的问题产生,假如数据量多,就需要把表复制一遍,效率不高。从Records: 1复制了表,这张表原有数据是1条。

小结:
1.在实际变更时,为减小对生产影响,可以用pt-osc,或gh-ost对表就进变更。
2.修改表的AUTO_INCREMENT时,会锁表并重建表。并不能使用在线DDL.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论