如果您的叢集發生完全中斷,您可以使用 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 會檢查目前可連線的叢集執行個體,如果任何成員目前無法連線,則會失敗。
同樣地,MySQL Shell 會偵測目前無法連線的執行個體。如果先前成員目前無法連線,則無法在
dba.rebootClusterFromCompleteOutage()
命令中新增或移除這些成員。如果在叢集的主要執行個體上啟用,在單一主要模式中,
super_read_only
會停用。
若要重新啟動叢集,您必須連線到具有 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()
您可以透過下列其中一種方式定義叢集主要成員
-
定義
dba.rebootClusterFromCompleteOutage()
命令中的primary
選項。例如,重新啟動叢集
myCluster
,並將在本機電腦的 4001 連接埠上執行的成員設定為主節點。var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{primary: "127.0.0.1:4001"})
透過在 GTID 集低於另一個成員的叢集成員上使用
primary
選項和force
選項。
您可以使用 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.
rebootClusterFromCompleteOutage
會執行下列檢查,如果叢集不符合需求,則會產生警告。
確認已沒有從 ClusterSet 強制移除複本叢集。
確認 ClusterSet 的主叢集可連線。
檢查叢集是否有未變為檢視變更日誌事件 (VCLE) 的錯誤交易。請參閱分散式復原如何運作。
確認叢集的已執行交易集(
GTID_EXECUTED
)不為空。
此命令會自動將複本叢集重新加入 ClusterSet,確保為所有叢集成員設定 ClusterSet 複寫通道。