已開啓GTID的情況下的binlog複製切換到GTID複製可能會遇到的問題

今天測試在已開啓GTID的情況下的binlog複製切換到GTID複製,遇到個問題,記錄下來。

場景是:主庫和從庫分別開啓GTID模式,主庫創建一個庫和一張表並寫入數據;主庫mysqldump使用了--set-gtid-purged=OFF即不記錄GTID事務編號做完備,導入到從庫

 

從庫show slave status\G看到的狀態應該是這樣

a1c29fba6b3c70195463794022c2bd9c.png

而主庫上show master status;看到的結果是

22bd6a57ddac0044c1f4fd4be5e821a9.png

此時如果直接切換到GTID複製,你會發現複製分報錯

cd5525a45be8d34ce67bf53d27fc9d95.png997b1079440875a3acf61a07fe2d3661.png

我們知道

Retrieved_Gtid_Set是指定從庫接收到的GTID集合

Executed_Gtid_Set是已執行的GTID集合

對比可以發現

切換GTID複製以後,主庫會把從庫沒有的GTID發送給從庫,而從庫接收到這些GTID後,按順序執行,當執行到第一個GTID時就發生報錯,原因是從庫已經執行過這個GTID的SQL語句(創建表);這個問題的解決辦法是從庫的master信息並跳過已經執行的GTID

root@localhost [(none)]>reset master;
Query OK, 0 rows affected (0.13 sec)

root@localhost [(none)]>set global gtid_purged='d26fd29a-b7d4-11e6-b38e-00155d7b0100:1-14';
Query OK, 0 rows affected (0.00 sec)

root@localhost [(none)]>start slave;

 

最後主從複製恢復,同時可以看到複製狀態

3760b76c05363febf86fa1a23b45eea0.png

 

總結一下,在已開啓GTID的情況下的binlog複製切換到GTID複製的步驟:

主庫執行show master status並記錄Executed_Gtid_Set的開始位置

f4aab58aeb0049713f6bc38531eb8af8.png

從上圖可以看出我的環境的Executed_Gtid_Set集合從1開始

從庫導入數執行change master to語句,設置成binlog複製模式,看下複製是否成功,如果成功,把複製停掉,執行reset master後再執行show slave status\G, 可以看到當前已接收到的GTID集合,記錄下集羣的結束位置是15

ded91036b8b684d80f92b158826290da.png

從庫執行set global gtid_purged='d26fd29a-b7d4-11e6-b38e-00155d7b0100:1-15';

再執行show slave status\G可以看到

614c08475630fba1de4fac45f5325f93.png

可以看出主從庫Executed_Gtid_Set是一樣的


問題?

如果主庫在初始化完成後馬上做完備,這種情況下會有這個問題嗎?

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