下載本手冊
PDF (美國信紙) - 2.3Mb
PDF (A4) - 2.3Mb


MySQL Shell 9.0  /  ...  /  從重大故障重新啟動叢集

7.8.3 從重大故障重新啟動叢集

如果您的叢集發生完全中斷,您可以使用 dba.rebootClusterFromCompleteOutage() 重新設定它。此操作可讓您連線到叢集的一個 MySQL 執行個體,並使用其中繼資料來復原叢集。

完全中斷表示群組複寫已在所有成員執行個體上停止。

注意

執行 dba.rebootClusterFromCompleteOutage() 前,請確定已啟動所有叢集成員。如果任何叢集成員無法連線,命令將會失敗。

如果叢集已失效且是叢集集的成員,則會忽略此檢查。

連線到最新的執行個體,並執行下列命令

  JS> var cluster = dba.rebootClusterFromCompleteOutage()

如果所有成員都具有相同的 GTID 集,則您目前連線的成員會成為主要成員。請參閱 使用 rebootClusterFromCompleteOutage 選取主要成員

dba.rebootClusterFromCompleteOutage() 操作會遵循下列步驟,以確保叢集已正確重新設定

  • 叢集中繼資料和叢集拓撲會從目前的執行個體擷取。

  • 如果叢集成員處於復原或錯誤狀態,且所有其他成員都處於離線或錯誤狀態,則 dba.rebootClusterFromCompleteOutage() 會嘗試停止該成員上的群組複寫。如果群組複寫無法停止,命令會停止並顯示錯誤。

  • 檢查目前 MySQL Shell 連線的執行個體上找到的 InnoDB 叢集中繼資料,查看其是否包含 GTID 超集。如果目前連線的執行個體不包含 GTID 超集,則操作會中止並顯示該資訊。

    請參閱 GTID 超集

  • 如果執行個體包含 GTID 超集,則會根據該執行個體中儲存的中繼資料復原叢集。

  • MySQL Shell 會檢查目前可連線的叢集執行個體,如果任何成員目前無法連線,則會失敗。

    注意

    可以使用 force 選項略過此檢查。這會使用剩餘可連線的成員重新啟動叢集。

    請參閱 強制選項

  • 同樣地,MySQL Shell 會偵測目前無法連線的執行個體。如果先前成員目前無法連線,則無法在 dba.rebootClusterFromCompleteOutage() 命令中新增或移除這些成員。

  • 如果在叢集的主要執行個體上啟用,在單一主要模式中,super_read_only 會停用。

GTID 超集

若要重新啟動叢集,您必須連線到具有 GTID 超集的成員,這表示在發生中斷之前套用最多交易的執行個體。

若要判斷哪個成員具有 GTID 超集,請執行下列其中一項操作

  • 連線到執行個體並執行 dba.rebootClusterFromCompleteOutage(),其中 dryRun: true。產生的報告會傳回類似下列的資訊:。

                  Switching over to instance '127.0.0.1:4001' to be used as seed.

    這會指示具有 GTID 超集的成員。

    針對具有較低 GTID 集的成員執行 dba.rebootClusterFromCompleteOutage() 會導致錯誤。

  • 依序連線到每個執行個體,並在 SQL 模式中執行下列操作

    SHOW VARIABLES LIKE 'gtid_executed';

    已套用最大 GTID 集交易的執行個體包含 GTID 超集。

注意

可以覆寫此行為,並透過使用 force 選項執行 dba.rebootClusterFromCompleteOutage(),來使用具有較低 GTID 集的執行個體。

這會使選取的成員成為主要成員,並捨棄未包含在選取成員 GTID 集中的任何交易。

如果此程序失敗,且叢集中繼資料已嚴重損毀,您可能需要捨棄中繼資料並從頭重新建立叢集。您可以使用 dba.dropMetadataSchema() 捨棄叢集中繼資料。

警告

只有在無法還原叢集時,才應將 dba.dropMetadataSchema() 方法作為最後手段使用。它無法復原。

如果您將 MySQL Router 與叢集搭配使用,當您捨棄中繼資料時,所有目前的連線都會被捨棄,而且會禁止新的連線。這會導致完全中斷。

選項

dba.rebootClusterFromCompleteOutage() 具有下列選項

  • force: true | false (預設):如果為 true,即使無法連線到叢集的某些成員,或選取的主要執行個體具有分歧或較低的 GTID_SET,也必須執行此操作。請參閱 強制選項

  • dryRun: true | false (預設):執行命令的所有驗證和步驟,但不進行任何變更。完成時會顯示報告。請參閱 測試 rebootClusterFromCompleteOutage

  • primary:代表必須選取為主要成員的執行個體定義。請參閱 使用 rebootClusterFromCompleteOutage 選取主要成員

  • switchCommunicationStack: mysql | xcom:叢集在重新啟動後使用的群組複寫通訊堆疊。請參閱 第 7.5.9 節,〈設定群組複寫通訊堆疊〉

  • ipAllowList:使用 XCOM 通訊堆疊時,允許連線到執行個體以進行群組複寫流量的主機清單。

  • localAddress:使用 XCOM 通訊堆疊時,要使用而非自動產生的群組複寫本機位址的字串值。

強制選項

force 選項可讓您忽略叢集成員的可用性,或選取成員中的 GTID 集差異,並重新啟動叢集。

例如,重新啟動叢集 myCluster

  JS> var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{force: true})

在下列情況下,不允許使用 force 選項

  • 如果叢集屬於叢集集且已失效,或主要叢集未處於全域狀態 OK。

  • 叢集屬於叢集集,是主要叢集且已失效。

無法使用 rebootClusterFromCompleteOutage 新增或重新加入執行個體。如果您使用 force 忽略無法連線的成員並重新啟動叢集,您必須使用 cluster.rejoinInstance() 將無法連線的成員新增至叢集。

使用 rebootClusterFromCompleteOutage 選取主要成員

您可以透過下列其中一種方式定義叢集主要成員

  • 定義 dba.rebootClusterFromCompleteOutage() 命令中的 primary 選項。

    例如,重新啟動叢集 myCluster,並將在本機電腦的 4001 連接埠上執行的成員設定為主節點。

    var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{primary: "127.0.0.1:4001"})

  • 透過在 GTID 集低於另一個成員的叢集成員上使用 primary 選項和 force 選項。

測試 rebootClusterFromCompleteOutage

您可以使用 dryRun 選項來測試變更。此選項會驗證命令及其選項,並產生結果記錄。如果建議的變更存在問題,則會擲回例外狀況。

以下範例顯示重新啟動叢集 myCluster 的試執行,將主節點設定為在本機成員的 4001 連接埠上執行,以及它傳回的記錄訊息。

JS > var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{primary: "127.0.0.1:4001", dryRun: true})

NOTE: dryRun option was specified. Validations will be executed, but no changes will be applied.
Cluster instances: '127.0.0.1:4000' (OFFLINE), '127.0.0.1:4001' (OFFLINE), '127.0.0.1:4002' (OFFLINE)
Switching over to instance '127.0.0.1:4001' to be used as seed.
dryRun finished.

針對 ClusterSet 和 ReplicaSet 的考量

rebootClusterFromCompleteOutage 會執行下列檢查,如果叢集不符合需求,則會產生警告。

  • 確認已沒有從 ClusterSet 強制移除複本叢集。

  • 確認 ClusterSet 的主叢集可連線。

  • 檢查叢集是否有未變為檢視變更日誌事件 (VCLE) 的錯誤交易。請參閱分散式復原如何運作

  • 確認叢集的已執行交易集(GTID_EXECUTED)不為空。

此命令會自動將複本叢集重新加入 ClusterSet,確保為所有叢集成員設定 ClusterSet 複寫通道。

切換通訊堆疊

您可以在 dba.rebootClusterFromCompleteOutage() 作業期間切換通訊堆疊。

例如:

        js> dba.rebootClusterFromCompleteOutage("testcluster", {switchCommunicationStack: "mysql"})

MYSQL 通訊協定切換到 XCOM 需要 localAddress 的額外網路位址,也可能需要您定義 ipAllowList 值。