Mysql

如何在啟動 mysqld 之前清除 InnoDB 重做日誌以進行崩潰恢復

  • February 28, 2020

系統: Windows Server 2012 R2,MariaDB 10.2.8

我們目前正在嘗試從準崩潰中恢復(這是正常關閉,但 mysqld 不會再次啟動)並且在啟動期間 InnoDB 的重做日誌存在問題。如果我們從 開始innodb_force_recovery=0,程序會到達它記錄的點

2019-06-14  9:29:41 14580 [Note] InnoDB: Starting final batch to recover 1150 pages from redo log.

然後卡在那裡。由於從那時起沒有進一步的日誌條目,因此不清楚是需要更多時間還是靜默失敗。我們嘗試等待 22 小時,但沒有明顯進展。該程序以 <1% 的 CPU 使用率和不變的記憶體使用率執行,因此它可能會靜默停止。

然後我們嘗試增加數量,innodb_force_recovery並且在 6 時,伺服器最終通過完全跳過重做日誌再次啟動。不幸的是,這也是從只讀開始的。因此,通過使用清除日誌 innodb_fast_shutdown=0似乎在關機時沒有做任何事情。

我們現在需要的是一種在 mysqld 離線的情況下清除重做日誌的方法。簡單地刪除日誌文件 ib_logfile0並且ib_logfile1似乎也不起作用,因為它們在啟動過程中以某種方式重新創建,這會遇到與上述相同的問題。我們假設數據以某種方式保存在 中ibdata1,但是如果不刪除表空間,我們就不能從那裡刪除它。

作為最後的手段,我們嘗試通過從磁碟中刪除它的目錄來刪除損壞的數據庫(因為我們不能在 MySQL 中刪除它,因為它僅以只讀方式啟動)然後從 開始innodb_force_recovery=3,但該過程再次嘗試執行重做記錄然後停止,因為數據庫不存在。

似乎最好的做法是在不執行重做日誌或事先清除它的情況下以某種方式啟動 mysqld,然後刪除損壞的數據庫並從備份中恢復它。但是如果不嘗試重做日誌並失敗,我們就無法讓它以寫模式啟動。有沒有辦法通過直接操作文件來清除它?

你應該做的是

  • 殺死mysqld程序。如果 MySQL 服務作為服務執行,則禁用它。
  • 升級到最新的 10.2(截至今天它已經在 10.2.24,您使用的是非常舊的版本)
  • 啟用服務並重新啟動。

如果它沒有再次啟動,請在掛起時獲取 mysqld 程序 minidump,並向 JIRA https://jira.mariadb.org/browse/MDEV送出錯誤

這絕對比嘗試通過刪除 Innodb 重做日誌來“恢復”更有幫助(這是你不應該做的事情之一)。

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