MySQL?8.0自增變量的持久化問題小結
MySQL 8.0特性-自增變量的持久化
在MySQL 8.0之前,自增主鍵AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重啟后,會重置AUTO_INCREMENT=max(primary key)+1,這種現(xiàn)象在某些情況下會導致業(yè)務主鍵沖突或者其他難以發(fā)現(xiàn)的問題。 下面通過案例來對比不同的版本中自增變量是否持久化。
MySQL5.7測試
在MySQL 5.7版本中,測試步驟如下: 創(chuàng)建的數(shù)據(jù)表中包含自增主鍵的id字段,語句如下:
CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREMENT ); -- 插入4個空值,執(zhí)行如下: INSERT INTO test1 VALUES(0),(0),(0),(0); -- 查詢數(shù)據(jù)表test1中的數(shù)據(jù),結果如下: mysql> SELECT * FROM test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec) -- 刪除id為4的記錄,語句如下: DELETE FROM test1 WHERE id = 4; -- 再次插入一個空值,語句如下: INSERT INTO test1 VALUES(0); -- 查詢此時數(shù)據(jù)表test1中的數(shù)據(jù),結果如下: mysql> SELECT * FROM test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 5 | +----+ 4 rows in set (0.00 sec) -- 從結果可以看出,雖然刪除了id為4的記錄,但是再次插入空值時,并沒有重用被刪除的4,而是分配了5。 -- 刪除id為5的記錄 DELETE FROM test1 where id=5;
重啟數(shù)據(jù)庫
service mysql stop service mysql start
繼續(xù)插入空值,然后再次查詢數(shù)據(jù)表test1中的數(shù)據(jù),結果如下:
mysql> INSERT INTO test1 values(0); Query OK, 1 row affected (0.00 sec) mysql> select * from test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec)
從結果可以看出,新插入的0值分配的是4,按照重啟前的操作邏輯,此處應該分配6。出現(xiàn)上述結果的主要原因是自增主鍵沒有持久化。 在MySQL 5.7系統(tǒng)中,對于自增主鍵的分配規(guī)則,是由InnoDB數(shù)據(jù)字典內部一個 計數(shù)器 來決定的,而該計數(shù)器只在 內存中維護 ,并不會持久化到磁盤中。當數(shù)據(jù)庫重啟時,該計數(shù)器會被初始化。
MySQL 8.0測試
上述測試步驟最后一步的結果如下:
mysql> select * from test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 6 | +----+ 4 rows in set (0.00 sec)
從結果可以看出,自增變量已經(jīng)持久化了。
MySQL 8.0將自增主鍵的計數(shù)器持久化到 重做日志中。每次計數(shù)器發(fā)生改變,都會將其寫入重做日志中。如果數(shù)據(jù)庫重啟,InnoDB會根據(jù)重做日志中的信息來初始化計數(shù)器的內存值。
到此這篇關于MySQL 8.0自增變量的持久化的文章就介紹到這了,更多相關mysql自增變量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深度解析MySQL 鎖機制:間隙鎖、Next-Key Lock 與幻讀防御
本文深入探討了MySQL的鎖機制,特別是間隙鎖(GapLock)和臨鍵鎖(Next-KeyLock),本文將從"為什么要鎖間隙"出發(fā),一路追到"為什么是左開右閉",把這套機制徹底講透,感興趣的朋友跟隨小編一起看看吧2026-03-03

