若要調查資料庫頁面損毀,您可以使用 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
會防止 INSERT
、UPDATE
或 DELETE
作業。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 時,您可以DROP
或 CREATE
資料表。DROP TABLE
在 innodb_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
值,則可能存在損壞的資料結構,這可能會導致複雜的查詢(包含 WHERE
、ORDER BY
或其他子句的查詢)失敗。在這種情況下,您可能只能執行基本的 SELECT * FROM t
查詢。