本節說明 InnoDB
復原。主題包括
若要將 InnoDB
資料庫從建立實體備份的時間復原到現在,您必須在建立備份之前,就啟動二進位記錄功能的 MySQL 伺服器。若要在還原備份之後達到時間點復原,您可以套用備份建立之後,二進位日誌中發生的變更。請參閱第 9.5 節,「時間點 (增量) 復原」。
如果您的資料庫損毀或發生磁碟故障,您必須使用備份執行復原。如果發生損毀,請先找到未損毀的備份。還原基礎備份之後,使用 mysqlbinlog 和 mysql 從二進位日誌檔案執行時間點復原,以還原備份建立之後發生的變更。
在某些資料庫損毀的情況下,僅需傾印、捨棄和重新建立一或數個損毀的資料表。您可以使用 CHECK TABLE
陳述式來檢查資料表是否損毀,雖然 CHECK TABLE
自然無法偵測到所有可能的損毀類型。
在某些情況下,表面上的資料庫頁面損毀實際上是作業系統損毀其自己的檔案快取所造成的,而磁碟上的資料可能沒問題。最好先嘗試重新啟動電腦。這樣做可能會消除看似是資料庫頁面損毀的錯誤。如果 MySQL 仍然因為 InnoDB
一致性問題而難以啟動,請參閱第 17.20.3 節,「強制 InnoDB 復原」,了解如何在復原模式下啟動執行個體的步驟,這允許您傾印資料。
若要從 MySQL 伺服器意外關閉的情況中恢復,唯一的要求是重新啟動 MySQL 伺服器。InnoDB
會自動檢查日誌並執行資料庫的前滾以回到目前狀態。InnoDB
也會自動回滾當機時存在的未提交交易。
InnoDB
的當機復原包含數個步驟:
資料表空間探索
資料表空間探索是
InnoDB
用於識別需要套用重做日誌的資料表空間的程序。請參閱當機復原期間的資料表空間探索。重做日誌套用
重做日誌套用會在初始化期間執行,在接受任何連線之前。如果關機或當機時,所有變更都已從緩衝池刷新到資料表空間(
ibdata*
和*.ibd
檔案),則會跳過重做日誌套用。InnoDB
如果在啟動時遺失重做日誌檔案,也會跳過重做日誌套用。每次值變更時,目前的自動遞增計數器最大值都會寫入重做日誌,使其具備當機安全性。在復原期間,
InnoDB
會掃描重做日誌以收集計數器值的變更,並將變更套用到記憶體中的資料表物件。如需
InnoDB
如何處理自動遞增值的詳細資訊,請參閱第 17.6.1.6 節「InnoDB 中的 AUTO_INCREMENT 處理」,以及InnoDB AUTO_INCREMENT 計數器初始化。當遇到索引樹狀結構損毀時,
InnoDB
會將損毀旗標寫入重做日誌,使損毀旗標具備當機安全性。InnoDB
也會在每個檢查點將記憶體中的損毀旗標資料寫入引擎私有的系統資料表。在復原期間,InnoDB
會從兩個位置讀取損毀旗標,並在將記憶體中的資料表和索引物件標記為損毀之前,合併結果。不建議移除重做日誌以加速復原,即使可以接受一些資料遺失也是如此。只有在乾淨關機後,且將
innodb_fast_shutdown
設定為0
或1
時,才應考慮移除重做日誌。
不完整交易是指在意外關閉或快速關機時處於活動狀態的任何交易。回滾不完整交易所需的時間,可能會是交易中斷前處於活動狀態的時間的三到四倍,具體取決於伺服器負載。
您無法取消正在回滾的交易。在極端情況下,當預期回滾交易需要非常長的時間時,使用設定為
3
或更大的innodb_force_recovery
設定來啟動InnoDB
可能會更快。請參閱第 17.20.3 節「強制 InnoDB 復原」。變更緩衝區合併
將變更從變更緩衝區(系統資料表空間的一部分)套用到次要索引的分頁,因為索引分頁會讀取到緩衝池。
刪除不再對活動交易可見的已標記為刪除的記錄。
重做日誌套用之後的步驟並不依賴重做日誌(除了記錄寫入之外),並且與正常處理平行執行。在這些步驟中,只有回滾不完整交易是當機復原的特殊之處。插入緩衝區合併和清除是在正常處理期間執行的。
重做日誌套用之後,InnoDB
會嘗試儘早接受連線,以減少停機時間。作為當機復原的一部分,InnoDB
會回滾伺服器關閉時未提交或處於 XA PREPARE
狀態的交易。回滾是由背景執行緒執行,與來自新連線的交易平行執行。在回滾作業完成之前,新連線可能會遇到與復原的交易的鎖定衝突。
在大多數情況下,即使 MySQL 伺服器在繁重的活動中意外終止,復原程序也會自動發生,且 DBA 不需要採取任何動作。如果硬體故障或嚴重的系統錯誤損毀了 InnoDB
資料,MySQL 可能會拒絕啟動。在這種情況下,請參閱第 17.20.3 節「強制 InnoDB 復原」。
如需二進位日誌和 InnoDB
當機復原的相關資訊,請參閱第 7.4.4 節「二進位日誌」。
如果在復原期間,InnoDB
遇到自上次檢查點之後寫入的重做日誌,則必須將重做日誌套用到受影響的資料表空間。在復原期間識別受影響的資料表空間的程序稱為資料表空間探索。
資料表空間探索依賴innodb_directories
設定,該設定定義啟動時要掃描以尋找資料表空間檔案的目錄。innodb_directories
的預設設定為 NULL,但 innodb_data_home_dir
、innodb_undo_directory
和 datadir
定義的目錄,在 InnoDB 建構啟動時要掃描的目錄清單時,始終會附加到 innodb_directories
引數值。無論是否明確指定 innodb_directories
設定,都會附加這些目錄。以絕對路徑定義或位於附加到 innodb_directories
設定的目錄之外的資料表空間檔案,應加入到 innodb_directories
設定。如果先前未探索到重做日誌中參考的任何資料表空間檔案,則會終止復原。