MySQL?8.0自增變量的持久化問題小結(jié)
MySQL 8.0特性-自增變量的持久化
在MySQL 8.0之前,自增主鍵AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重啟后,會(huì)重置AUTO_INCREMENT=max(primary key)+1,這種現(xiàn)象在某些情況下會(huì)導(dǎo)致業(yè)務(wù)主鍵沖突或者其他難以發(fā)現(xiàn)的問題。 下面通過案例來對(duì)比不同的版本中自增變量是否持久化。
MySQL5.7測(cè)試
在MySQL 5.7版本中,測(cè)試步驟如下: 創(chuàng)建的數(shù)據(jù)表中包含自增主鍵的id字段,語(yǔ)句如下:
CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREMENT ); -- 插入4個(gè)空值,執(zhí)行如下: INSERT INTO test1 VALUES(0),(0),(0),(0); -- 查詢數(shù)據(jù)表test1中的數(shù)據(jù),結(jié)果如下: mysql> SELECT * FROM test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec) -- 刪除id為4的記錄,語(yǔ)句如下: DELETE FROM test1 WHERE id = 4; -- 再次插入一個(gè)空值,語(yǔ)句如下: INSERT INTO test1 VALUES(0); -- 查詢此時(shí)數(shù)據(jù)表test1中的數(shù)據(jù),結(jié)果如下: mysql> SELECT * FROM test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 5 | +----+ 4 rows in set (0.00 sec) -- 從結(jié)果可以看出,雖然刪除了id為4的記錄,但是再次插入空值時(shí),并沒有重用被刪除的4,而是分配了5。 -- 刪除id為5的記錄 DELETE FROM test1 where id=5;
重啟數(shù)據(jù)庫(kù)
service mysql stop service mysql start
繼續(xù)插入空值,然后再次查詢數(shù)據(jù)表test1中的數(shù)據(jù),結(jié)果如下:
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)
從結(jié)果可以看出,新插入的0值分配的是4,按照重啟前的操作邏輯,此處應(yīng)該分配6。出現(xiàn)上述結(jié)果的主要原因是自增主鍵沒有持久化。 在MySQL 5.7系統(tǒng)中,對(duì)于自增主鍵的分配規(guī)則,是由InnoDB數(shù)據(jù)字典內(nèi)部一個(gè) 計(jì)數(shù)器 來決定的,而該計(jì)數(shù)器只在 內(nèi)存中維護(hù) ,并不會(huì)持久化到磁盤中。當(dāng)數(shù)據(jù)庫(kù)重啟時(shí),該計(jì)數(shù)器會(huì)被初始化。
MySQL 8.0測(cè)試
上述測(cè)試步驟最后一步的結(jié)果如下:
mysql> select * from test1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 6 | +----+ 4 rows in set (0.00 sec)
從結(jié)果可以看出,自增變量已經(jīng)持久化了。
MySQL 8.0將自增主鍵的計(jì)數(shù)器持久化到 重做日志
中。每次計(jì)數(shù)器發(fā)生改變,都會(huì)將其寫入重做日志中。如果數(shù)據(jù)庫(kù)重啟,InnoDB會(huì)根據(jù)重做日志中的信息來初始化計(jì)數(shù)器的內(nèi)存值。
到此這篇關(guān)于MySQL 8.0自增變量的持久化的文章就介紹到這了,更多相關(guān)mysql自增變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql通過frm和ibd文件恢復(fù)表_mysql5.7根據(jù).frm和.ibd文件恢復(fù)表結(jié)構(gòu)和數(shù)據(jù)
文章主要介紹了如何從.frm和.ibd文件恢復(fù)MySQL InnoDB表結(jié)構(gòu)和數(shù)據(jù),需要的朋友可以參考下2025-03-03CentOS6.9下mysql 5.7.17安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS6.9下mysql 5.7.17安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10通過sysbench工具實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的性能測(cè)試的方法
sysbench是一款壓力測(cè)試工具,可以測(cè)試系統(tǒng)的硬件性能,也可以用來對(duì)數(shù)據(jù)庫(kù)進(jìn)行基準(zhǔn)測(cè)試。這篇文章主要介紹了通過sysbench工具實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的性能測(cè)試 ,需要的朋友可以參考下2019-07-07mysql 8.0.22壓縮包完整安裝與配置教程圖解(親測(cè)安裝有效)
這篇文章主要介紹了mysql 8.0.22壓縮包完整安裝與配置教程圖解(親測(cè)安裝有效),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12mysql5.6建立索引報(bào)錯(cuò)1709問題及解決
這篇文章主要介紹了mysql5.6建立索引報(bào)錯(cuò)1709問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03