Ⅰ、GTID的介紹
- global transaction id identifier 全局事務id
- gtid = server_uuid + transaction_id
- server_uuid是全局唯一的虚茶,5.6開始才有媳危,表示當前實例的uuid待笑,保存在數(shù)據(jù)目錄中的auto.conf文件中
- transaction_id是自增的
- gtid的作用是替代filename + position
主:show master status;
(root@localhost) [test]> show master status;
+------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+----------------------------------------+
| bin.000006 | 408 | | | d565cde8-0573-11e8-89b2-525400a4dac1:1 |
+------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
Executed_Gtid_set:server_id:1-xxxx 表示產(chǎn)生了xxx個事務
從:show master status;
Retrieved_Gtid_Set: d565cde8-0573-11e8-89b2-525400a4dac1:1
Executed_Gtid_Set: d565cde8-0573-11e8-89b2-525400a4dac1:1
也能看到事務號
tips:
如果做了A和B做了雙主,B上一直在同步A上數(shù)據(jù)癌压,這時候在B上寫入一個事務
A上看下Executed_Gtid_set滩届,會發(fā)現(xiàn)有兩個值
一個是自己做主當前的事務號,一個是同步的從上的事務號
Ⅱ棠枉、GTID的意義
之前的復制基于(file,pos),當主從發(fā)生宕機辈讶,切換的時候有問題
slave保存的是原master上的(file,pos)娄猫,無法直接指向新master上的(file,pos)
mha通過relay log來判斷(非常有技術性)
gtid實現(xiàn)了真正的全局唯一位置(所有機器上都是統(tǒng)一的)
更容易進行failover操作
舉例:
a是master贱除,b c d是slave,a掛了媳溺,b做主月幌,c d做change master
此時c d 上的pos卻還是a上面的pos,和b沒有對應關系褂删,文件名飞醉,文件大小,position完全不一樣,change不起來
使用gtid的話缅帘,b上保存著c和d回放的位置G_a轴术、G_b(b是通過選舉出來的,保存著最多的日志)
Ⅲ钦无、gtid配置
[mysqld]
log_bin
gtid_mode = ON
log_slave_updates = 1 5.6必須開逗栽,5.7可以不開
enforce-gtid-consistency = 1
tips:
- MySQL5.6必須開啟參數(shù)log_slave_updates,5.7.6開始無需配置
- MySQL5.6升級到gtid模式需要停機重啟
- MySQL5.7.6版本開始可以在線升級gtid模式
- 5.6中gtid用的比較少,最重要的原因在于gtid要么開要么不開,不能做到非gtid升級到gtid
- gtid是一切高可用基礎(gr,mha),強烈建議打開摧冀,5.6就有了,很成熟了
5.7的gtid_mode可選值
ON 完全打開GTID,如果打開狀態(tài)的備庫接受到不帶GTID的事務,則復制中斷
ON_PERMISSIVE 可以認為是打開gtid前的過渡階段秉宿,主庫在設置成該值后會產(chǎn)生GTID,同時備庫依然容忍帶GTID和不帶GTID的事務
OFF_PERMISSIVE 可以認為是關閉GTID前的過渡階段今艺,主庫在設置成該值后不再生成GTID,備庫在接受到帶GTID和不帶GTID事務都可以容忍
主庫在關閉GTID時实牡,執(zhí)行事務會產(chǎn)生一個Anonymous_Gtid事件,會在備庫執(zhí)行:set @@session.gtid_next='anonymous'
OFF 徹底關閉GTID偎谁,如果關閉狀態(tài)的備庫收到帶GTID的事務铐望,則復制中斷
之前只有ON和OFF
平滑開啟gtid
set global gtid_mode = 'off_permissive';
set global gtid_mode = 'on_permissive';
set global enforce_gtid_consistency = 'on'
set global gtid_mode = 'ON';
平滑關閉gtid
stop slave;
set global gtid_mode = 'on_permissive';
set global gtid_mode = 'off_permissive';
change master to master_auto_position = 0;
set global gtid_mode = 'OFF';
set global enforce_gtid_consistency = 'off'
start slave;
主從上都依次敲下來
Ⅳ跟畅、簡單說下搭建過程
大同小異蒜危,全備+binlog
開啟gtid后部翘,mysqldump備份單庫時會報warning夹囚,意思是gtid包含所有事務,只備份了單庫,忽略即可
用mydumper備份掏父,看下metadata文件陶缺,找到gitd:xxxxxx:x-xxx
這玩意等同于mysqldump備份文件中set @@global.gtid_purged='xxxx:x-xxx';
表示這部分gtids對應的事務已經(jīng)在備份中了,slave在還原備份后復制時百框,需要跳過這些gtids
reset master; 清空@@GLOBAL.GTID_EXECUTED嫁蛇,不然執(zhí)行下一步會報錯
SET @@GLOBAL.GTID_PURGED = '找出來的位置'
以上操作mysqldump出來的文件導入無需操作闸拿,mydumper要手動,因為myloader不執(zhí)行這個
最后一把change master送給大家
change master to master_host='127.0.0.1', master_port=3306, master_user='rpl', master_password='123', MASTER_AUTO_POSITION=1;
start slave;
tips:
- binlog文件中會有兩個關于gtid的event——Previous_gtids和Gtid
- 通過掃描binlog中的gtid值,可以知道gtid與filename-pos的對應關系严衬,如果binlog很大请琳,掃描量也很大,所以用Previous_gtid來記錄之前一個binlog文件中最大的gtid
- 如果要找的gtid比previous_gtids大赠幕,就掃描當前文件俄精,反之掃之前的文件竖慧,依次類推
- binlog在rotate的時候,是知道當前最大gtid的诫惭,將該值,寫入下個binlog的文件頭赢笨,即previous_gtids
Ⅴ梅忌、GTID復制中處理報錯小技巧
這里模擬一個1062錯誤即可狰腌,不演示
報錯會告訴你對應的gtid
操作步驟如下:
- 我們將gtid_next指向報錯的gtid
報錯中沒有gtid,則用Retrieved_Gtid_Set和Executed_Gtid_Set對比一下就知道哪個事務執(zhí)行出錯了
(root@localhost) [(none)]> set gtid_next='xxxxxx:xxxx'; # 設置為之前失敗的那個GTID的值
Query OK, 0 rows affected (0.00 sec)
- 執(zhí)行一個空事務
(root@localhost) [(none)]> begin;commit;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
- 將gtid_next還原為automatic
(root@localhost) [(none)]> set gtid_next="automatic";
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.07 sec)
該操作類似于sql_slave_skip_counter铸鹰,只是跳過錯誤癌别,不能保證數(shù)據(jù)一致性,需要人工介入蹋笼,固強烈建議從機開啟read_only=1
Ⅵ展姐、GTID的限制
- 在開啟GTID后,不能在一個事物中使用創(chuàng)建臨時表的語句剖毯,需要使得 autocommit=1;才可以圾笨。5.7開始直接創(chuàng)建臨時表已經(jīng)可以創(chuàng)建了
- 在開啟GTID后,不能使用create table select ... 的語法來創(chuàng)建表了逊谋,因為這其實是多個事物了擂达,GTID沒法對應