Mysql

為什麼 InnoDB 在恢復時會損壞表?

  • April 3, 2020

設置時

innodb_fast_shutdown=0

MySQL 在關閉/崩潰之前丟棄所有不完整的事務。預設值為1,這對於保留不完整的事務是可以理解的。

然而,在恢復模式(例如,innodb_force_recovery = 6)中,MySQL 將所有未完成的事務視為已送出。由於事務不完整,這顯然會損壞表。

當損壞整個表時保留不完整事務的目的是什麼?

如果在某些情況下有必要,為什麼不能像保存表innodb_force_recovery一樣簡單地刪除所有未完成的事務(當它們無法送出時) ?innodb_fast_shutdown=0還是我錯過了什麼?

innodb_fast_shutdown控制更改緩衝區,而不​​是重做日誌。無論是什麼值innodb_fast_shutdown,如果事務在關閉時未送出,它將無法在重新啟動時存活。

如果事務已送出,那麼它是否會持續取決於 innodb_flush_log_at_trx_commit. 如果它是預設值 1,則事務將持續存在。如果 != 1,可能不會持續存在。

現在,innodb_force_recovery. 這是可能的。當您在事務中執行 UPDATE 時,新記錄將寫入頁面(在緩衝池中,頁面變髒)。稍後,即使事務尚未送出,數據頁也可以刷新到磁碟。當你不得不使用innodb_force_recovery這意味著你已經準備好犧牲數據一致性(你稱之為損壞的表嗎?)只是為了取回一些數據。innodb_force_recovery=6InnoDB 試圖挽救盡可能多的數據。它無法完成崩潰恢復過程,但新記錄已寫入頁面 - 為什麼不將其提供給使用者?

引用自:https://dba.stackexchange.com/questions/262566