1)什么是GTID
GTID(Global Transaction ID)是對于一個已提交事務的編號涩金,并且是一個全局唯一的編號。GTID實際上是由UUID+TID組成的醇疼。其中UUID是一個MySQL實例的唯一標識烙肺,保存在mysql數據目錄下的auto.cnf文件里钦勘。TID代表了該實例上已經提交的事務數量,并且隨著事務提交單調遞增棋傍。下面是一個GTID的具體形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23救拉。
2)GTID的作用
根據GTID可以知道事務最初是在哪個實例上提交的
GTID的存在方便了Replication的Failover
3)GTID比傳統(tǒng)復制的優(yōu)勢
更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos瘫拣。
更簡單的搭建主從復制亿絮。
比傳統(tǒng)復制更加安全。
GTID是連續(xù)沒有空洞的麸拄,因此主從庫出現數據沖突時派昧,可以用添加空事物的方式進行跳過。
4)GTID的工作原理:
master更新數據時感帅,會在事務前產生GTID斗锭,一同記錄到binlog日志中。
slave端的i/o線程將變更的binlog失球,寫入到本地的relay log中。
sql線程從relay log中獲取GTID帮毁,然后對比slave端的binlog是否有記錄实苞。
如果有記錄,說明該GTID的事務已經執(zhí)行烈疚,slave會忽略黔牵。
如果沒有記錄,slave就會從relay log中執(zhí)行該GTID的事務爷肝,并記錄到binlog猾浦。
在解析過程中會判斷是否有主鍵,如果沒有就用二級索引灯抛,如果沒有就用全部掃描金赦。
5)GTID常用參數注釋:
GTID的參數注釋:
[master]>showglobal variables like '%gtid%';
enforce_gtid_consistency:開啟gtid的一些安全限制(介意開啟)。
gtid_executed:全局和seeeion級別都可以用对嚼。用來保存已經執(zhí)行過的GTIDs夹抗。
注:showmaster status\G;輸出結果中的Executed_Gtid_Set和gitd_executed一致。reset
master時纵竖,此值會被清空漠烧。
gtid_owned:全局和session級別都可用,全局表示所有服務器擁有GTIDs靡砌,session級別表示當前client擁有所有GTIDs已脓。(此功能用的少)
gtid_mode:是否開啟GTID功能。
gtid_purged:全局參數通殃,設置在binlog中度液,已經purged的GTIDs,并且purged掉的GTIDs會包含到gtid_executed中。
注:從而導致slave不會再去master請求這些GTIDs恨诱,并且Executed_Gtid_Set為空時媳瞪,才可以設置此值。
gtid_next:這個時session級別的參數:
6)使用GTID配置主從復制
實際工作主要會在兩種情況下配置:一是新搭建的服務器照宝,直接配置啟動就可以蛇受,二是已經在運行的服務器,這時候需要閉關master的寫厕鹃,保證所有slave端都已經和master端數據保持同步兢仰。然后即可按如下方法配置
主服務器配置:
停止mysql服務,修改/etc/my.cnf配置文件剂碴,主要配置以下幾項:
log-bin =mysql-bin
log_bin_index =mysql-bin.index
expire_logs_days = 30
binlog_format = ROW
log-slave-updates = true
sync-binlog = 1:
gtid-mode = on
enforce-gtid-consistency = true
啟動數據庫服務把将,查看相關信息
使用如下命令查看GTID的相關參數:showglobal variables like '%gtid%';
下圖顯示GTID是否正常使用:
再次使用show global variables like '%gtid%';查看參數設置,出現如下結果忆矛。
配置從服務器:
停止mysql服務察蹲,修改/etc/my.cnf配置文件,主要配置以下幾項:
gtid-mode = on
enforce-gtid-consistency = true
server-id = 1
log-bin =mysql-bin
log_bin_index =mysql-bin.index
expire_logs_days = 30
binlog_format = ROW
sync-binlog = 1:
relay-log = relay-log
relay-log-index = relay-log.index
log-slave-updates = true
master-info-repository = table
relay-log-info-repository = table
slave-parallel-workers = 1
relay_log_purge = 1
relay_log_recovery = 1
report-port = 3306
report-host = 192.168.10.72
skip-slave-start
啟動數據庫服務
連接master:
CHANGE MASTER TOMASTER_HOST='192.168.10.71',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1;
啟動復制線程:
start slave;
相看相關狀態(tài):
slave上顯示:
mysql> show slave status\G;
*************************** 1. row***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.71
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000008
Read_Master_Log_Pos: 191
Relay_Log_File: relay-log.000005
Relay_Log_Pos: 363
Relay_Master_Log_File: master-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 191
Relay_Log_Space: 530
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 171
Master_UUID:0e9896a7-14f7-11e7-a0e6-000c2900551e
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slaveI/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: 0e9896a7-14f7-11e7-a0e6-000c2900551e:1
Auto_Position: 1
1 row in set (0.00 sec)
在master顯示:
7)催训、修復GTID復制錯誤
在基于GTID的復制拓撲中洽议,要想修復Slave的SQL線程錯誤,過去的SQL_SLAVE_SKIP_COUNTER方式不再適用漫拭。需要通過設置gtid_next或gtid_purged完成亚兄,當然前提是已經確保主從數據一致,僅僅需要跳過復制錯誤讓復制繼續(xù)下去采驻。其中gtid_next就是跳過某個執(zhí)行事務审胚,設置gtid_next的方法一次只能跳過一個事務,要批量的跳過事務可以通過設置gtid_purged完成礼旅。