群組複寫旨在確保資料庫服務持續可用,即使形成群組的部分伺服器由於計畫性維護或計畫外問題而目前無法參與其中。只要剩餘成員為群組的多數,它們就可以選出新的主要伺服器並繼續作為群組運作。但是,如果複寫群組的每個成員都離開群組,且在每個成員上,群組複寫都因為 STOP GROUP_REPLICATION
陳述式或系統關機而停止,則群組現在僅存在於理論上,作為成員上的組態。在這種情況下,要重新建立群組,必須像第一次啟動一樣透過啟動來啟動。
第一次啟動群組與第二次或後續啟動群組之間的差異在於,在後者情況下,關閉的群組成員可能彼此具有不同的交易集,具體取決於它們停止或失敗的順序。如果成員具有其他群組成員上不存在的交易,則該成員無法加入群組。對於群組複寫,這包括已認可並套用的交易 (位於 gtid_executed
GTID 集中) 以及已驗證但尚未套用的交易 (位於 group_replication_applier
通道中)。交易認可的確切時間點取決於為群組設定的交易一致性層級 (請參閱 第 20.5.3 節「交易一致性保證」)。但是,群組複寫群組成員永遠不會移除已驗證的交易,這表示成員認可交易的意圖。
因此,複寫群組必須從最新的成員開始重新啟動,也就是說,執行和驗證的交易最多的成員。然後,交易較少的成員可以加入,並透過分散式復原趕上它們遺失的交易。假設群組的最後一個已知主要成員是群組的最新成員是不正確的,因為稍後關閉的成員可能具有更多交易。因此,您必須重新啟動每個成員以檢查交易、比較所有交易集,並識別最新的成員。然後可以使用此成員啟動群組。
在每個成員關閉後,請遵循此程序安全地重新啟動複寫群組。
依任意順序,依序針對每個群組成員執行
將用戶端連線至群組成員。如果尚未停止群組複寫,請發出
STOP GROUP_REPLICATION
陳述式,並等待群組複寫停止。編輯 MySQL 伺服器組態檔 (在 Linux 和 Unix 系統上通常命名為
my.cnf
,在 Windows 系統上則為my.ini
),並設定系統變數group_replication_start_on_boot=OFF
。此設定會防止在啟動 MySQL 伺服器時啟動群組複寫,這是預設行為。如果您無法變更系統上的該設定,您可以只允許伺服器嘗試啟動群組複寫,這將會失敗,因為群組已完全關閉且尚未啟動。如果您採用該方法,請勿在此階段在任何伺服器上設定
group_replication_bootstrap_group=ON
。啟動 MySQL 伺服器執行個體,並確認未啟動 (或啟動失敗) 群組複寫。在此階段請勿啟動群組複寫。
從群組成員收集下列資訊
gtid_executed
GTID 集的內容。您可以透過發出下列陳述式來取得此資訊mysql> SELECT @@GLOBAL.GTID_EXECUTED
group_replication_applier
通道上的已驗證交易集。您可以透過發出下列陳述式來取得此資訊mysql> SELECT received_transaction_set FROM \ performance_schema.replication_connection_status WHERE \ channel_name="group_replication_applier";
當您從所有群組成員收集交易集時,請比較它們以找出哪個成員具有最大的整體交易集,包括已執行的交易 (
gtid_executed
) 和已驗證的交易 (位於group_replication_applier
通道上)。您可以手動查看 GTID 來執行此動作,或者您可以使用預存函數來比較 GTID 集,如 第 19.1.3.8 節「用於操作 GTID 的預存函數範例」中所述。使用具有最大交易集的成員來啟動群組,方法是將用戶端連線至群組成員並發出下列陳述式
mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION; mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
請務必不要將設定
group_replication_bootstrap_group=ON
儲存在組態檔中,否則當伺服器再次重新啟動時,會建立第二個同名的群組。若要驗證群組現在是否存在,並包含這個創始成員,請在啟動它的成員上執行此語句
mysql> SELECT * FROM performance_schema.replication_group_members;
依任意順序將其他每個成員加回群組,方法是在每個成員上執行
START GROUP_REPLICATION
語句mysql> START GROUP_REPLICATION;
若要驗證每個成員都已加入群組,請在任何成員上執行此語句
mysql> SELECT * FROM performance_schema.replication_group_members;
當成員重新加入群組後,如果您編輯了它們的組態檔以設定
group_replication_start_on_boot=OFF
,您可以再次編輯它們以設定ON
(或移除系統變數,因為ON
是預設值)。