伺服器重啟後MySql自動增量計數器重置
我需要一種方法來保持 mysql 服務重啟之間的自動增量計數器。
正如文件所述,重啟後預設情況下 mysql 自動增量計數器從 max(id)+1 開始。如何保留最後一個自動增量值?
這對我來說是個大問題。我正在使用 envers 來保持實體審計。我得到的錯誤與我刪除的“最後一行”一樣多。
假設我開始將數據插入一個空表。假設插入 10 行。然後假設刪除最後 8 個。在我的表中,我將得到 2 個實體,id 分別為 1 和 2。在審計表中,我將擁有所有 10 個實體,id 從 1 到 10:id 從 3 到 10 的實體將有 2 個操作:創建操作和刪除操作。
自動增量計數器現在在主表中設置為 11。重新啟動 mysql 服務自動增量計數器變為 3。因此,如果我插入一個新實體,它將以 id 3 保存。但在審計表中已經有一個 id = 3 的實體。該實體已被標記為已創建並已刪除. 它會在更新/刪除操作期間導致斷言失敗,因為 envers 無法處理這種不一致的狀態。
謝謝
MySQL修復
14.5 年後,這在 MySQL 8.0 版中得到了修復
$$ 6 Oct 16:40 $$Daniel Price 開發者發布:由WL#6204 在 8.0.0 中修復。
MariaDB 修復
這也是2017 年 7 月 12 日發布的 MariaDB 10.2.4
我發現這個改動終於被添加到了 2ndquadrant 部落格上,
如果您的自動增量確實具有任意標識符之外的含義,那麼它們可能不應該是
auto_increment
s,而是簡單的 int 或 bigint 無符號。您可以刪除 auto_increment 粒子並插入 max(id)+1,但這會給您帶來各種並發問題(auto_increment 會自動為您解決)。
您可以將 auto_increment 儲存在單獨的表或表註釋中,並編輯表的 auto_increment 或插入 auto_increment 值 - 1 然後將其刪除,具體取決於 ENGINE。但同樣,在實施之前,我會三思而後行。請記住,任何時候都可能產生差距。
**編輯:**這是合理的——我建議不要刪除行(將它們標記為“deleted=true”)或遵循上面的建議:在開始時,執行查詢以檢查您的 auto_increment (
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE table_schema='database' AND table_name='table'
) 是否大於max(audited_id)
並執行假插入。如this comment 所示,您可以將該邏輯與觸發器放在一起--init-file
或放在觸發器上。