MySQL--自增列持久化問題
======================================================================
自增列持久化問題
5.5/5.6/5.7三個版本中,MySQL並不會將自增列分配的自增值信息固化到磁盤,當MySQL重啟後,會根據自增列上當前最大值和參數auto_increment_offset來確定下一次的自增值,為快速獲取自增列上最大值,MySQL要求自增列必須建有索引。
如果一張自增表的數據在重啟實例前被清空,實例重啟後該表數據會從”1”開始自增(假設表的自增初始值定義為1)。
在某次數據庫升級過程中,某張業務表”恰好”因為業務邏輯將表中所有數據刪除,重啟後該表自增值從1開始生成,當該表數據流轉到其他表出現數據沖突,發現問題後,我們緊急手動設置該表自增值,避免事故進一步惡化,並再後期類似操作時,重點關註此類自增表。
如果業務會對自增表數據進行硬刪除,在服務器重啟前應重點關註該自增表使用的自增值,可以通過information_schema.tables中的auto_increment列來獲取。
PS1:在MySQL 8.0中引入自增列持久化特性,可以避免上述問題。
=====================================================================
自增列初始值問題
自增列初始值和增量值取決於:
1、全局參數auto_increment_increment和auto_increment_offset,這兩參數作用於所有自增表,主要應用於分庫分布場景。
2、表創建語句, 在使用SHOW CREATE TABLE或MySQLDump等命令導出建表語句時,建表語句中會包含表當前最大值。
3、服務器重啟後,根據表中自增列最大值確定下一次的自增值。
=====================================================================
MySQL--自增列持久化問題