無法啟動:InnoDB:損壞的頁面…找不到表空間
在伺服器崩潰(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;
然後重新導入您轉儲的數據。
我假設您在轉儲單個表和導入轉儲文件時不需要幫助。
回复您的評論:
看起來你有更廣泛的腐敗。我建議以下步驟:
- 啟動 MySQL 伺服器
innodb_force_recovery=6
- 用於
mysqldump
轉儲所有數據。- 關閉 MySQL 伺服器。
- 備份 datadir 的內容,以防萬一您想獲得專業幫助,看看他們是否可以恢復更多數據。試試https://twindb.com,他們是 MySQL 數據庫恢復方面最好的專家。
- 初始化一個新的數據目錄(我會使用一個新的磁碟設備,並讓舊的設備停止服務,因為它現在有未知的損壞)。
- 恢復您使用創建的數據轉儲
mysqldump
。