文件首頁
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 參考手冊  /  ...  /  處理複本的意外停止

19.4.2 處理複本的意外停止

為了使複寫能夠在伺服器意外停止(有時稱為當機安全)時具有韌性,複本必須能夠在停止之前恢復其狀態。本節說明複寫期間複本意外停止的影響,以及如何設定複本以獲得最佳的恢復機會,以繼續複寫。

在複本意外停止後,重新啟動時,複寫 SQL 執行緒必須復原已執行交易的相關資訊。復原所需的資訊儲存在複本的應用程式中繼資料儲存庫中。此儲存庫預設建立為名為 mysql.slave_relay_log_infoInnoDB 資料表。透過使用此交易儲存引擎,資訊始終可以在重新啟動時復原。對應用程式中繼資料儲存庫的更新會與交易一起提交,這表示記錄在該儲存庫中的複本進度資訊始終與已應用於資料庫的內容保持一致,即使在發生意外伺服器停止的情況下也是如此。如需應用程式中繼資料儲存庫的詳細資訊,請參閱第 19.2.4 節,「中繼日誌和複寫中繼資料儲存庫」

DML 交易和原子 DDL 也會在複本的應用程式中繼資料儲存庫中的 mysql.slave_relay_log_info 資料表中更新複寫位置,並將變更原子操作套用至資料庫。在所有其他情況下,包括非完全原子的 DDL 陳述式,以及不支援原子 DDL 的豁免儲存引擎,如果伺服器意外停止,mysql.slave_relay_log_info 資料表可能會遺失與複寫資料相關聯的更新。在這種情況下還原更新是手動程序。如需 MySQL 9.0 中原子 DDL 支援以及特定陳述式複寫結果行為的詳細資訊,請參閱第 15.1.1 節,「原子資料定義陳述式支援」

副本從意外停止中恢復的過程,會因副本的配置而異。恢復過程的細節會受到所選的複製方法、副本是單線程還是多線程,以及相關系統變數的設定所影響。恢復過程的整體目標是識別在意外停止發生之前,哪些交易已應用於副本的資料庫,並檢索並應用副本在意外停止後遺漏的交易。

  • 對於基於 GTID 的複製,恢復過程需要已由副本接收或提交的交易的 GTID。可以使用 GTID 自動定位從來源檢索遺失的交易,該功能會自動比較來源的交易和副本的交易,並識別遺失的交易。

  • 對於基於檔案位置的複製,恢復過程需要一個精確的複製 SQL 線程(應用程式)位置,顯示已應用於副本的最後一筆交易。根據該位置,複製 I/O 線程(接收器)會從來源的二進位日誌中檢索從該點開始應應用於副本的所有交易。

使用基於 GTID 的複製,可以最容易地配置複製以應對意外停止。GTID 自動定位表示副本可以可靠地識別和檢索遺失的交易,即使應用交易的順序中存在間隙。

以下資訊提供適用於不同類型副本的設定組合,以確保在複製的控制範圍內盡可能地進行恢復。

重要事項

某些不受複製控制的因素可能會影響複製恢復過程以及恢復過程之後複製的整體狀態。特別是,影響個別儲存引擎恢復過程的設定,可能會導致交易在副本意外停止的情況下遺失,因此無法用於複製恢復過程。下面清單中提到的 innodb_flush_log_at_trx_commit=1 設定,是使用 InnoDB 進行交易的複製設定的關鍵設定。但是,特定於 InnoDB 或其他儲存引擎的設定,特別是與刷新或同步相關的設定,也可能產生影響。請務必檢查並應用您所選儲存引擎關於當機安全設定的建議。

副本上的以下設定組合最能應對意外停止

  • 當使用基於 GTID 的複製時 (gtid_mode=ON),設定 SOURCE_AUTO_POSITION=1,這會啟動與來源連線的 GTID 自動定位,以自動識別和檢索遺失的交易。此選項是使用 CHANGE REPLICATION SOURCE TO 陳述式設定的。如果副本有多個複製通道,則需要為每個通道個別設定此選項。有關 GTID 自動定位如何運作的詳細資訊,請參閱 第 19.1.3.3 節,「GTID 自動定位」。當使用基於檔案位置的複製時,不會使用 SOURCE_AUTO_POSITION=1,而是使用二進位日誌位置或中繼日誌位置來控制複製的開始位置。

  • 當使用基於 GTID 的複製時 (gtid_mode=ON),設定 GTID_ONLY=1,這會使副本僅在恢復過程中使用 GTID,並停止在複製元資料儲存庫中保留二進位日誌和中繼日誌檔案名稱和檔案位置。此選項是使用 CHANGE REPLICATION SOURCE TO 陳述式設定的。如果副本有多個複製通道,則需要為每個通道個別設定此選項。使用 GTID_ONLY=1 時,在恢復期間,將忽略檔案位置資訊,並使用 GTID 自動跳過來跳過已提供的交易,而不是識別正確的檔案位置。如果使用 relay_log_purge 的預設設定清除中繼日誌,則此策略會更有效率,這表示只需要檢查一個中繼日誌檔案。

  • 設定 sync_relay_log=1,這會指示複製接收器線程在每次接收到的交易寫入中繼日誌後,將中繼日誌同步到磁碟。這表示副本從來源的二進位日誌讀取的目前位置記錄(在應用程式元資料儲存庫中)永遠不會領先於儲存在中繼日誌中的交易記錄。請注意,雖然此設定最安全,但由於涉及的磁碟寫入次數,它也是最慢的。使用 sync_relay_log > 1sync_relay_log=0(其中同步由作業系統處理),如果副本發生意外停止,則可能會有已提交但尚未同步到磁碟的交易。如果恢復副本根據中繼日誌中最後同步到磁碟的資訊,嘗試再次檢索並應用這些交易,而不是跳過它們,則此類交易可能會導致恢復過程失敗。設定 sync_relay_log=1 對於多線程副本尤其重要,如果無法使用中繼日誌中的資訊填補交易順序中的間隙,則恢復過程會失敗。對於單線程副本,如果相關資訊在應用程式元資料儲存庫中不可用,則恢復過程只需要使用中繼日誌。

  • 設定 innodb_flush_log_at_trx_commit=1,這會在每次提交交易之前,將 InnoDB 日誌同步到磁碟。此設定是預設設定,可確保將 InnoDB 表格和 InnoDB 日誌儲存在磁碟上,因此不再需要中繼日誌中關於交易的資訊。結合設定 sync_relay_log=1,此設定進一步確保 InnoDB 表格的內容和 InnoDB 日誌與中繼日誌的內容始終保持一致,以便在發生意外停止時,清除中繼日誌檔案不會導致副本的交易歷史記錄中出現無法填補的間隙。

  • 設定 relay_log_info_repository = TABLE,這會將複製 SQL 線程位置儲存在 InnoDB 表格 mysql.slave_relay_log_info 中,並與交易提交一起更新,以確保記錄始終準確。此設定為預設值;FILE 已棄用。系統變數本身也已棄用,因此請省略它並允許它採用預設值。如果使用 FILE,則資訊會儲存在資料目錄中的檔案中,該檔案會在應用交易後更新。這會產生與來源失去同步的風險,具體取決於副本在處理交易的哪個階段停止,甚至檔案本身也可能損毀。使用 relay_log_info_repository = FILE,無法保證恢復。

  • 設定 relay_log_recovery = ON,這會在伺服器啟動後立即啟用自動中繼日誌恢復。此全域變數預設為 OFF,並且在執行時間為唯讀,但您可以使用 --relay-log-recovery 選項在副本意外停止後於副本啟動時將其設定為 ON。請注意,此設定會忽略現有的中繼日誌檔案,以防它們損毀或不一致。中繼日誌恢復過程會啟動一個新的中繼日誌檔案,並從來源檢索從應用程式元資料儲存庫中記錄的複製 SQL 線程位置開始的交易。先前的中繼日誌檔案會隨著時間推移,由副本的正常清除機制移除。

對於多線程副本,設定 relay_log_recovery = ON 會自動處理從中繼日誌執行的交易順序中的任何不一致和間隙。當使用基於檔案位置的複製時,可能會發生這些間隙。(如需更多詳細資訊,請參閱 第 19.5.1.35 節,「複製和交易不一致」。)中繼日誌恢復過程會使用與 START REPLICA UNTIL SQL_AFTER_MTS_GAPS 陳述式相同的方法來處理間隙。當副本達到一致且無間隙的狀態時,中繼日誌恢復過程會繼續從來源檢索從複製 SQL 線程位置開始的進一步交易。當使用基於 GTID 的複製時,多線程副本會先檢查 SOURCE_AUTO_POSITION 是否設定為 ON,如果是,則會省略計算應跳過或不跳過的交易的步驟,以便恢復過程不需要舊的中繼日誌。