天天看點

FAQ系列 | 添加自增列失敗0、導讀1、問題描述2、原因分析3、其他建議

0、導讀

想往一個表裡添加一個自增列做主鍵,居然失敗報告無法讀取,這是怎麼回事?

1、問題描述

有位朋友在更新discuz論壇資料庫時遇到問題了,想給一個表添加自增列做主鍵,結果發生下面的報錯:

mysql> ALTER TABLE pre_common_credit_log ADD `logid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (logid) ;

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

2、原因分析

從報錯資訊來看,第一反應是:資料表損壞了。不過,再仔細想想,肯定不是啊,否則報錯也不是這個了,而是像下面這樣的了:

1030 Got error -1 from storage engine

再仔細一想,更大的可能性是:該表裡的總資料量,超過了mediumint最大值所緻。

讓朋友把自增列資料類型改成int或者bigint,果真就好了。

3、其他建議

建議使用discuz的同學們可以考慮這麼做:

  • 如果啟用了搶樓功能,那麼就把post相關的表繼續保留使用MyISAM引擎。或者自己動手改造代碼,把搶樓功能中的樓梯值用redis來存儲;
  • 如果沒有啟用搶樓功能,那麼就可以放心的把所有表引擎改成InnoDB了。

順便,再次吐槽一下discuz的某些功能設計,比如把session表用HEAP引擎,其他表預設引擎還是MyISAM。不過,這并不影響discuz成為國内最優秀的論壇解決方案(沒辦法,沒更好的了,占了先機)。