Mysql
為什麼 InnoDB 在恢復時會損壞表?
設置時
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=6
InnoDB 試圖挽救盡可能多的數據。它無法完成崩潰恢復過程,但新記錄已寫入頁面 - 為什麼不將其提供給使用者?