今天測試在已開啓GTID的情況下的binlog複製切換到GTID複製,遇到個問題,記錄下來。
場景是:主庫和從庫分別開啓GTID模式,主庫創建一個庫和一張表並寫入數據;主庫mysqldump使用了--set-gtid-purged=OFF即不記錄GTID事務編號做完備,導入到從庫
從庫show slave status\G看到的狀態應該是這樣
而主庫上show master status;看到的結果是
此時如果直接切換到GTID複製,你會發現複製分報錯
我們知道
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;
最後主從複製恢復,同時可以看到複製狀態
總結一下,在已開啓GTID的情況下的binlog複製切換到GTID複製的步驟:
主庫執行show master status並記錄Executed_Gtid_Set的開始位置
從上圖可以看出我的環境的Executed_Gtid_Set集合從1開始
從庫導入數執行change master to語句,設置成binlog複製模式,看下複製是否成功,如果成功,把複製停掉,執行reset master後再執行show slave status\G, 可以看到當前已接收到的GTID集合,記錄下集羣的結束位置是15
從庫執行set global gtid_purged='d26fd29a-b7d4-11e6-b38e-00155d7b0100:1-15';
再執行show slave status\G可以看到
可以看出主從庫Executed_Gtid_Set是一樣的
問題?
如果主庫在初始化完成後馬上做完備,這種情況下會有這個問題嗎?