Mysql

如何解決innodb集群衝突

  • December 13, 2019

我目前正在維護一個具有三個節點的 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 masterand再次重新同步它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 重建實例。

我希望它有幫助!

引用自:https://dba.stackexchange.com/questions/186268