Mysql

無法啟動:InnoDB:損壞的頁面…找不到表空間

  • August 17, 2021

在伺服器崩潰(Ubuntu 16.04)之後,當我嘗試使用它啟動 Mysql(Mysql 5.7)innodb_force_recovery=0時,它沒有啟動並且 error.log 顯示:

InnoDB: Checksum mismatch in datafile: ./panel_financiero_v2/kpis_analytics.ibd, Space ID:93, Flags: 33. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
InnoDB: Corrupted page [page id: space=93, page number=0] of datafile './panel_financiero_v2/kpis_analytics.ibd' could not be found in the doublewrite buffer.
InnoDB: Tablespace 93 was not found at ./panel_financiero_v2/kpis_analytics.ibd.
InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace.
InnoDB: Cannot continue operation.

我只能使用啟動Mysql innodb_force_recovery=6(我無法使用innodb_force_recovery=1 啟動Mysql,如錯誤消息所示)。問題表的.ibd和.frm文件在正確的目錄下(沒有空文件);我什至嘗試(以防萬一,沒有真正的希望)刪除這兩個文件(將它們移動到另一個目錄),但它也不起作用。

有什麼方法可以修復或恢復表(請記住 innodb_force_recovery=6 以只讀模式啟動 Mysql,我什至無法創建新表)?至少,有什麼方法可以正常啟動mysql(使用innodb_force_recovery=0),甚至失去那個有問題的表的資訊?

https://dev.mysql.com/doc/refman/5.7/en/repair-table.html說:

REPAIR TABLE 適用於 MyISAM、ARCHIVE 和 CSV 表。

換句話說,REPAIR TABLE 對 InnoDB 沒有任何作用。InnoDB 有自己的自動崩潰恢復,它在啟動時執行。

但 InnoDB 崩潰恢復僅適用於崩潰時正在進行的失去更改。它使用重做日誌和雙寫緩衝區來重建失去的髒頁。此過程無法重建靜態損壞的數據。

錯誤消息實際上告訴您該怎麼做:

InnoDB:設置 innodb_force_recovery=1 以忽略這一點並永久失去對錶空間的所有更改。

在https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html閱讀更多詳細資訊:

1 (SRV_FORCE_IGNORE_CORRUPT) 讓伺服器執行,即使它檢測到損壞的頁面。嘗試使 SELECT * FROM tbl_name 跳過損壞的索引記錄和頁面,這有助於轉儲表。

innodb_force_recovery=1將表空間文件移回它們所屬的位置後啟動伺服器。

然後您可以使用 轉儲表mysqldump,它應該讀取它可以讀取的頁面,跳過損壞的頁面。然後您可以創建一個新表以從轉儲中導入:

CREATE TABLE mytable_new LIKE mytable;
RENAME TABLE mytable TO mytable_bad, mytable_new TO mytable;

然後重新導入您轉儲的數據。

我假設您在轉儲單個表和導入轉儲文件時不需要幫助。


回复您的評論:

看起來你有更廣泛的腐敗。我建議以下步驟:

  1. 啟動 MySQL 伺服器innodb_force_recovery=6
  2. 用於mysqldump轉儲所有數據。
  3. 關閉 MySQL 伺服器。
  4. 備份 datadir 的內容,以防萬一您想獲得專業幫助,看看他們是否可以恢復更多數據。試試https://twindb.com,他們是 MySQL 數據庫恢復方面最好的專家。
  5. 初始化一個新的數據目錄(我會使用一個新的磁碟設備,並讓舊的設備停止服務,因為它現在有未知的損壞)。
  6. 恢復您使用創建的數據轉儲mysqldump

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