問(wèn)題
今天做測(cè)試遇到一個(gè)問(wèn)題,在服務(wù)往DB插入數(shù)據(jù)時(shí),出現(xiàn)插入失敗,發(fā)現(xiàn)報(bào)1467的錯(cuò)誤。
將日志打印的插入SQL到命令行直接執(zhí)行,同樣提示1467錯(cuò)誤,并有了更詳細(xì)的說(shuō)明:
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
分析
這個(gè)報(bào)錯(cuò)看起來(lái)是跟自增字段有關(guān)。
查資料后了解到,其原因是自增字段的數(shù)值已經(jīng)超過(guò)了字段類(lèi)型能夠容納的范圍。
也就是說(shuō),自增字段的類(lèi)型對(duì)應(yīng)一個(gè)數(shù)值范圍,當(dāng)自增ID增長(zhǎng)到一定值的時(shí)候,會(huì)超出范圍,此時(shí)就會(huì)導(dǎo)致自增ID字段自增失敗了。
通過(guò)以下語(yǔ)句看一下當(dāng)前自增ID的類(lèi)型范圍和當(dāng)前自增ID增長(zhǎng)到了多少:
> show create table T_XX;
CREATE TABLE `T_XX` (
`FId` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
……
) ENGINE=InnoDB AUTO_INCREMENT=18446744073 DEFAULT CHARSET=utf8
可見(jiàn)當(dāng)前的自增主鍵的范圍是11位無(wú)符號(hào)整型,而最后的AUTO_INCREMENT的值其實(shí)就是記錄當(dāng)前表中最大的自增主鍵的值是多少,可以看到已經(jīng)達(dá)到了11位,無(wú)法繼續(xù)增加,才會(huì)報(bào)錯(cuò)。
了解原因后,就可以對(duì)癥下藥。
解決
這里可以有兩個(gè)思路:
- 如果ID是正常增長(zhǎng)到極限,此時(shí)需要調(diào)大自增ID的范圍
- 如果ID是異常出現(xiàn)了部分新的極大ID,導(dǎo)致無(wú)法繼續(xù)增長(zhǎng),此時(shí)可以刪去異常記錄,調(diào)整表的自增ID游標(biāo)。
思路1
有可能隨著測(cè)試操作,ID就是增長(zhǎng)到了極限,此時(shí)不好刪數(shù)據(jù),只能調(diào)大自增ID的范圍。
可以通過(guò)以下語(yǔ)句來(lái)修改自增主鍵的類(lèi)型范圍:
ALTER TABLE T_XX MODIFY `FId` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主鍵';
此時(shí)再查看建表語(yǔ)句就會(huì)發(fā)現(xiàn)自增ID的范圍已經(jīng)增大了:
> show create table T_XX;
CREATE TABLE `T_XX` (
`FId` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
……
) ENGINE=InnoDB AUTO_INCREMENT=18446744073 DEFAULT CHARSET=utf8
思路2
有時(shí)僅僅是因?yàn)橐恍┊惓G闆r導(dǎo)致出現(xiàn)幾條極大的自增ID值的記錄,此時(shí)可以刪去它們,然后將當(dāng)前的自增主鍵游標(biāo)修改即可。
先查看數(shù)據(jù),刪去異常的ID的記錄。
然后查到正常增長(zhǎng)到的ID,假設(shè)是12666,執(zhí)行以下語(yǔ)句:
ALTER TABLE T_XX AUTO_INCREMENT = 12666;
此時(shí)再查看建表語(yǔ)句,就會(huì)發(fā)現(xiàn)已經(jīng)恢復(fù)了游標(biāo),可以繼續(xù)插入了:
> show create table T_XX;
CREATE TABLE `T_XX` (
`FId` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
……
) ENGINE=InnoDB AUTO_INCREMENT=12666 DEFAULT CHARSET=utf8
關(guān)注我的公眾號(hào)【月亮與二進(jìn)制】,鵝廠程序員的敲碼間隙,也能讀書(shū)觀影練劍寫(xiě)字,分享給你我的世界