MySQL InnoDB Cluster 恢復故障成員(資料庫為5.7版本)
問題:InnoDB Cluster 3個節點中,1個節點丟失,狀態為:MISSING
問題分析:因為發現問題比較晚。資料庫配置的日誌是7天迴圈刪除的。也就是說當MISSING時間大於7天的時候,就不能直接在mysqlsh中使用:cluster.rejoinInstance("root@hostname:3306")重新加入節點的方式恢復,因為主庫的日誌七天前的日誌被清除了,所以無法直接恢復。
解決步驟:
1.匯出正常節點的資料庫,並傳到故障節點
mysqldump -uroot -p --all-databases --triggers --routines --events --quick --single-transaction --flush-logs --master-data=2 > dbs.dump
scp dbs.dump sql-1:~/
2.在叢集中刪除故障節點:
執行:mysqlsh
MySQL sql-2:3306 JS > var cluster=dba.getCluster(‘yspCluster‘)
MySQL sql-2:3306 JS > cluster.removeInstance('root@sql-1:3306')
3.刪除故障節點的data目錄,重新初始化資料庫。建立使用者(這一步其實就是重新初始化sql-1節點)
(1)先備份/etc/my.cnf,然後編輯配置檔案
vim /etc/my.cnf
[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
建立資料庫目錄
mkdir -pv /data/mysql/data/
chown -R mysql:mysql /data/mysql/data/
(2) 初始化資料庫
mysqld --initialize --user=mysql --basedir=/data/mysql/ --datadir=/data/mysql/data (注意:此處會初始化出mysql的初始密碼!!!)
(3)初始化mysql密碼
mysqladmin -uroot -p'隨機生成的密碼' password '要設定的密碼'
4.在sql-1節點上配置叢集例項
dba.configureLocalInstance('root@localhost:3306');
重啟資料庫後再執行下面的語句,不然狀態不會改變為Ok。
dba.checkInstanceConfiguration('root@localhost:3306') 檢查叢集例項的狀態是否為:OK
5.故障節點匯入資料庫
登入到故障節點的資料庫,執行下面的恢復命令:
mysql> set sql_log_bin=0;
mysql> source dbs.dump
mysql> set sql_log_bin=1;
重啟故障節點 MySQL
6.叢集中,將故障節點重新加入叢集(在正常節點上)
mysqlsh
MySQLsql-2:3306 JS > var cluster=dba.getCluster()
MySQL sql-2:3306 JS > cluster.addInstance('root@sql-1:3306')
7.然後在之前的故障節點使用mysqlsh執行:
dba.configureLocalInstance('root@localhost:3306'); // 儲存配置資訊到檔案,不然讀節點重啟後無法自動加入到叢集中會一直MISSING。