如何解決innodb集群衝突
我目前正在維護一個具有三個節點的 innodb 集群。它執行良好,但有時會出現一個節點,
MISSING
然後我必須再次將其聯機。問題是我插入了一個沒有主鍵的表。然後一個節點失敗了。當我想將故障節點重新加入集群時,它說它無法加入,因為有一個沒有主鍵的表。我更改了集群中的表以提供主鍵,但故障節點仍然抱怨相同。所以我刪除了故障節點中的表,並期望它會重建表。
現在它說
ERROR: Group Replication join failed. ERROR: Error joining instance to cluster: '192.168.123.45@3306' - Query failed. 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.. Query: START group_replication (RuntimeError)
在我執行 cluster.checkInstanceState(‘root@192.168.123.45:3306’);
The instance '192.168.123.45:3306' is invalid for the cluster. The instance contains additional transactions in relation to the cluster. { "reason": "diverged", "state": "error" }
我知道這是因為不同數據庫中的狀態不一致。但是我搜尋了網際網路,但沒有關於如何解決 innodb 集群中衝突的文件。任何意見將是有益的!
嗯……所以我最終部分擦除了數據庫並通過
reset master
and再次重新同步它drop database mysql_innodb_cluster_metadata
。現在它工作正常。仍然想知道是否有辦法倒帶 gtid 而不是完全重置……
我最近解決了這個問題,步驟如下:
我嘗試將實例重新加入集群,如下所示:
cluster.rejoinInstance(instance);
現在該
cluster.status()
功能報告,成員狀態為**“RECOVERING”,但幾分鐘後,它再次報告為“MISSING”**。我已經登錄到失去的實例並驗證了程序列表
SHOW FULL PROCESSLIST;
,但我看不到任何活動流量,我通過查詢幾個使用者表來驗證數據不一致。此外,使用功能檢查集群狀態
cluster.status({extended:true, queryMembers:true});
並觀察,lastApplied
阻止並startTimestamp
顯示較舊的日期,這確認最近的交易不適用於此實例。然後,我執行以下步驟從集群中刪除實例:
cluster.removeInstance(instance);
並添加回實例如下:
cluster.removeInstance(instance);
這產生了錯誤:
The instance is already part of the another Group Replication;
於是,我查詢了下表中缺少的實例,並再次找出了實例狀態:
select * from performance_schema.replication_group_members;
要將後面添加到集群中,我現在有以下 2 個選項:
- 使用新備份重建實例並從主數據庫恢復
- 從實例中刪除集群元數據並重新加入集群。
第一個選擇永遠是我最後的選擇。所以我嘗試了以下步驟:
- 第1步:
var cluster = dba.getCluster();
- 第2步:
cluster.rescan();
- 第 3 步:按
'Y'
刪除互動式MySQL Shell視窗中缺失的節點。- 第 4 步:登錄到 Missing 節點並設置
super_read_only = OFF;
- 第 5 步:停止組複製:
STOP GROUP_REPLICATION;
- 第 5 步:重置從站:
RESET SLAVE ALL;
- 第 6 步:刪除集群元數據數據庫:
刪除數據庫 mysql_innodb_cluster_metadata;
- 第 7 步:轉到 shell 並將節點添加回集群:
cluster.addInstance(instance);
- 第 8 步:在互動視窗中:選擇恢復方法為
"Clone"
(MySQL 8.0.16 及更高版本)。在這種情況下我沒有嘗試
Incremental Recovery
,但在另一種情況下,它起作用了。如果您因任何原因無法使用複製或增量恢復選項,請使用方法 1 重建實例。
我希望它有幫助!