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


MySQL 8.4 參考手冊  /  ...  /  強制 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 或更大可能會永久損毀資料檔案。僅在您已在資料庫的個別實體副本上成功測試設定之後,才在生產伺服器執行個體上使用 4 或更大的 innodb_force_recovery 設定。強制執行 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 資料表。DROP TABLEinnodb_force_recovery 的值大於 3 時也支援。當 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 查詢。