当表的主键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.




