文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  強制 InnoDB 復原

17.20.3 強制 InnoDB 復原

若要調查資料庫頁面損毀,您可以使用 SELECT ... INTO OUTFILE 從資料庫傾印您的資料表。通常,以這種方式取得的大部分資料都是完好的。嚴重的損毀可能會導致 SELECT * FROM tbl_name 陳述式或 InnoDB 背景操作意外結束或斷言,甚至導致 InnoDB 向前復原當機。在這種情況下,您可以使用 innodb_force_recovery 選項,強制 InnoDB 儲存引擎啟動,同時防止背景操作執行,以便您可以傾印您的資料表。例如,您可以將下列行新增至選項檔案的 [mysqld] 區段,然後重新啟動伺服器。

[mysqld]
innodb_force_recovery = 1

有關使用選項檔案的資訊,請參閱第 6.2.2.2 節,「使用選項檔案」

警告

僅在緊急情況下才將 innodb_force_recovery 設定為大於 0 的值,以便您可以啟動 InnoDB 並傾印您的資料表。在執行此操作之前,請確保您擁有資料庫的備份副本,以防需要重新建立資料庫。值為 4 或更大可能會永久損壞資料檔案。僅在您已在資料庫的單獨實體副本上成功測試設定之後,才在生產伺服器實例上使用 innodb_force_recovery 設定為 4 或更大。強制 InnoDB 復原時,您應該始終從 innodb_force_recovery=1 開始,並僅在必要時逐漸增加值。

innodb_force_recovery 預設值為 0(正常啟動,不強制復原)。innodb_force_recovery 的允許非零值為 1 到 6。較大的值包含較小值的功能。例如,值為 3 包含值 1 和 2 的所有功能。

如果您能夠使用 innodb_force_recovery 值為 3 或更小的值傾印您的資料表,則您相對安全,只會遺失一些損毀個別頁面上的資料。值為 4 或更大被認為是危險的,因為資料檔案可能會永久損壞。值為 6 被認為是極端的,因為資料庫頁面會保持在過時的狀態,這反過來可能會將更多損毀引入 B 樹和其他資料庫結構。

作為安全措施,當 innodb_force_recovery 大於 0 時,InnoDB 會防止 INSERTUPDATEDELETE 操作。innodb_force_recovery 設定為 4 或更大會將 InnoDB 置於唯讀模式。

  • 1 (SRV_FORCE_IGNORE_CORRUPT)

    即使偵測到損毀的頁面,仍允許伺服器執行。嘗試使 SELECT * FROM tbl_name 跳過損毀的索引記錄和頁面,這有助於傾印表格。

  • 2 (SRV_FORCE_NO_BACKGROUND)

    防止主執行緒和任何清除執行緒執行。如果在清除操作期間發生意外結束,此復原值可防止它。

  • 3 (SRV_FORCE_NO_TRX_UNDO)

    崩潰復原後,不執行交易回滾

  • 4 (SRV_FORCE_NO_IBUF_MERGE)

    防止插入緩衝區合併操作。如果它們會導致崩潰,則不執行它們。不計算表格統計資料。此值可能會永久損毀資料檔案。使用此值後,請準備好刪除並重新建立所有次要索引。將 InnoDB 設定為唯讀。

  • 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

    啟動資料庫時不查看復原日誌InnoDB 將未完成的交易視為已提交。此值可能會永久損毀資料檔案。將 InnoDB 設定為唯讀。

  • 6 (SRV_FORCE_NO_LOG_REDO)

    在復原時,不執行重做日誌向前滾動。此值可能會永久損毀資料檔案。將資料庫頁面保留在過時的狀態,這反過來可能會將更多損毀引入 B 樹和其他資料庫結構中。將 InnoDB 設定為唯讀。

您可以從表格SELECT 來傾印它們。當 innodb_force_recovery 值為 3 或更小時,您可以 DROPCREATE 表格。當 innodb_force_recovery 值大於 3 時,也支援 DROP TABLE。當 innodb_force_recovery 值大於 4 時,不允許 DROP TABLE

如果您知道給定的表格在回滾時會導致意外結束,您可以刪除它。如果您遇到由失敗的大量匯入或 ALTER TABLE 引起的失控回滾,您可以終止 mysqld 程序,並將 innodb_force_recovery 設定為 3,以在沒有回滾的情況下啟動資料庫,然後 DROP 導致失控回滾的表格。

如果表格資料內的損毀阻止您傾印整個表格內容,帶有 ORDER BY primary_key DESC 子句的查詢可能能夠傾印損毀部分之後的表格部分。

如果啟動 InnoDB 需要較高的 innodb_force_recovery 值,則可能存在損毀的資料結構,這可能會導致複雜的查詢(包含 WHEREORDER BY 或其他子句的查詢)失敗。在這種情況下,您可能只能執行基本的 SELECT * FROM t 查詢。