MySQL核心月報2015.02-MySQL·答疑釋惑·InnoDB丟失自增值
背景
在上一期的月報中,我們在InnoDB自增列重複值問題 中提到,InnoDB 自增列在重啟後會丟失,因為MySQL沒有持久化自增值,平時是存在記憶體表物件中的。如果例項重啟的話,記憶體值丟失,其初始化過程是做了一個類似 select max(id) + 1 操作。實際上存在另外一種場景,例項即使不重啟,也會導致自增值丟失。
問題說明
例項執行過種中,InnoDB表自增值是儲存在表物件中的,表物件又是放在快取中的,如果表太多而不能全部放在快取中的話,老的表就會被置換出來,這種被置換出來的表下次再使用的時候,就要重新開啟一遍,對自增列來說,這個過程就和例項重啟類似,需要 select max(id) + 1 算一下自增值。
對InnoDB來說,其資料字典中表物件快取大小由 table_definition_cache 系統變數控制,在5.6.8之後,其最小值是400。和表快取相關的另一個系統變數是table_open_cache,這個控制的是所有執行緒開啟表的快取大小,這個快取放在server層。
下面我們用testcase的方式來給出InnoDB表物件對置換出的場景:
可以看到自增值確實和重啟場景一樣,本應是100,卻變成了 2(select max(id) + 1)了。
問題分析
原因就是快取不夠,導致表物件被換出,下次再用就要重新開啟,這裡給出呼叫棧,對程式碼感興趣的同學可以看下。
將老的table置換出:
嘗試從快取載入表物件:
快取載入不到表物件,用select maxt 邏輯初始化自增:
處理建議
對於這個問題,一種解決方法是從原始碼改進,將自增值持久化,可以參考上期的月報給出的思路;如果不想改程式碼的話,可以這樣繞過:在設定auto_increment值後,主動插入一行記錄,這樣不論在重啟還是快取淘汰的情況下,重新開啟表仍能得到預期的值。
相關文章
- MySQL核心月報2015.03-MySQL·捉蟲動態·pidfile丟失問題分析MySql
- mysql root密碼丟失MySql密碼
- MySQL核心月報2014.10-MySQL· 捉蟲動態·binlog重放失敗MySql
- 資料庫核心月報-2015/10-MySQL·答疑解惑·索引過濾性太差引起CPU飆高分析資料庫MySql索引
- Mysql核心:INNODB儲存引擎--《十一》Insert BufferMySql儲存引擎
- MySQL核心InnoDB儲存引擎(卷1)筆記MySql儲存引擎筆記
- 關於MySQL啟動時,丟失資料檔案不報錯的現象MySql
- mysql丟失root密碼的解決辦法MySql密碼
- MySQL核心月報2014.11-MySQL· 5.7特性·高可用支援MySql
- MySQL:Innodb Handler_read_*引數解釋MySql
- oracle 更新丟失Oracle
- 淘寶核心月報 2017
- MySQL核心月報2014.11-MySQL· 5.7改進·Recovery改進MySql
- MySQL 字串轉double轉換棧幀(可能丟失精度)MySql字串
- ubuntu系統下使用xampp 丟失mysql root密碼UbuntuMySql密碼
- netcore釋出時 swagger xml釋出丟失問題NetCoreSwaggerXML
- MySQL啟動報錯InnoDB: The innodb_system data file './ibdata1' is of a differentMySql
- MySQL核心月報2014.12-MySQL· 效能優化·threadpool原理分析MySql優化thread
- MySQL InnoDB 索引MySql索引
- struts中session丟失Session
- innodb_undo_tablespaces導致Mysql啟動報錯MySql
- 關於 5月10號 資料丟失問題反饋
- 1月版號月報:兩次釋出共100款 騰訊自研自走棋轉戰國內
- ZMQ釋出-訂閱模式踩坑之——訊息丟失部分MQ模式
- 資料庫核心月報-2015/09-MySQL·捉蟲動態·建表過程中crash造成重建表失敗資料庫MySql
- 資料庫核心月報-2015/11-MySQL·特性分析·StatementDigest資料庫MySql
- mysql innodb索引高度MySql索引
- MySQL InnoDB update流程MySql
- MySQL Deadlocks in InnoDBMySql
- 找回丟失的檔案
- RabbitMQ防止訊息丟失MQ
- github 丟失的本地提交Github
- 非線上日誌丟失
- 急救:叢集session丟失!Session
- dds丟失字典檔案
- 【MySQL】5.6.x InnoDB Error Table mysql.innodb_table_stats not foundMySqlError
- MySQL · 答疑解惑 · 物理備份死鎖分析MySql
- 阿里資料庫核心月報:2017年07月阿里資料庫