[MY-011526]系列一 重建MGR集羣

[MY-011526]

報錯信息:

Error number: MY-011526; Symbol: ER_GRP_RPL_MEMBER_TRANS_GREATER_THAN_GRP; SQLSTATE: HY000

Message: This member has more executed transactions than those present in the group. Local transactions: %s > Group transactions: %s

ER_GRP_RPL_MEMBER_TRANS_GREATER_THAN_GRP was added in 8.0.11.

報錯位置:

int Plugin_gcs_events_handler::compare_member_transaction_sets() const {

  /*判斷本地的集合是不是複製組集合的子集,如果不是拋出異常ER_GRP_RPL_MEMBER_TRANS_GREATER_THAN_GRP*/
  if (!local_member_set.is_subset(&group_set)) {
    char *local_gtid_set_buf;
    local_member_set.to_string(&local_gtid_set_buf);
    char *group_gtid_set_buf;
    group_set.to_string(&group_gtid_set_buf);
    /*拋錯位置*/
    LogPluginErr(ERROR_LEVEL, ER_GRP_RPL_MEMBER_TRANS_GREATER_THAN_GRP,
                 local_gtid_set_buf, group_gtid_set_buf);
    my_free(local_gtid_set_buf);
    my_free(group_gtid_set_buf);
    result = 1;
  }
}


報錯判斷函數:

/*判斷本地的集合是不是複製組集合子集的判斷方法*/
bool Gtid_set::is_subset(const Gtid_set *super) const {
      // Check if all GNOs in this Gtid_set for sidno exist in other
      // Gtid_set for super_
      Const_interval_iterator super_ivit(super, super_sidno);
      if (!is_interval_subset(&ivit, &super_ivit)) DBUG_RETURN(false);
}

bool Gtid_set::is_interval_subset(Const_interval_iterator *sub,
                                  Const_interval_iterator *super) {
  
    while (sub_iv->start > super_iv->end) {
      super->next();
      super_iv = super->get();
      /*實際判斷本地的gitd集合是否是組複製中的gitd集合的子集,如果爲空,則返回false*/
      // If we reach end of super, then no interal covers sub_iv, so
      // sub is not a subset of super.
      if (super_iv == NULL) DBUG_RETURN(false);
    }

}


結論:MGR集羣中如果子節點的gtid集合超出了主節點的gtid集合會提示[MY-011526]錯誤


解決方法:

1.現存主節點通過xtrabackup進行備份
sudo /usr/bin/xtrabackup --defaults-file=/etc/my.cnf --host=ip --user=賬號 --password=密碼 --port=端口 --socket=socket文件 --backup --target-dir=/data/backup/

2.主節點備份發送到從節點進行恢復

2.1進入mysql的安裝目錄,備份現有data數據文件夾

>mv data databack

>mkdir data

2.2恢復備份

>sudo /usr/bin/xtrabackup --defaults-file=/etc/my.cnf --user=賬號  --prepare --target-dir=/data/backup/

>sudo /usr/bin/xtrabackup --defaults-file=/etc/my.cnf --user=賬號  --copy-back --target-dir=/data/backup/

2.3更改data文件夾屬主

>sudo chown -R mysql:mysql data

2.4啓動從節點mysql

>sudo ./bin/mysqld --user=mysql &

2.5清除slave_master_info和slave_relay_log_info表信息

>use mysql

>truncate table slave_master_info;

>truncate table slave_relay_log_info;

2.5重啓mysql

2.6確定gtid_executed和gtid_purged是否一致

>select * from @@gtid_executed;

>select * from @@gtid_purged;

2.7重置mater信息和gtid_executed信息

>reset master;

>set global gtid_purged = 

注意:此處設置的值爲2.6查詢後確定一致的gtid的數據集範圍值

2.8重新建立到主節點通道

>CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='root' FOR CHANNEL 'group_replication_recovery';

2.9啓動從節點

>start group_replication


3:請關注,後續介紹如何通過binlog的gtid信息重新建立主從關係

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章