深入了解復制-全局事務標識符(GTID)

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完成礼旅。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末膳叨,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子各淀,更是在濱河造成了極大的恐慌懒鉴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎浇,死亡現場離奇詭異临谱,居然都是意外死亡,警方通過查閱死者的電腦和手機奴璃,發(fā)現死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門悉默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹅龄,“玉大人夕晓,你說我怎么就攤上這事『吧溃” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵跟磨,是天一觀的道長间聊。 經常有香客問我,道長抵拘,這世上最難降的妖魔是什么哎榴? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮僵蛛,結果婚禮上尚蝌,老公的妹妹穿的比我還像新娘。我一直安慰自己充尉,他們只是感情好飘言,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驼侠,像睡著了一般姿鸿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泪电,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天般妙,我揣著相機與錄音,去河邊找鬼相速。 笑死,一個胖子當著我的面吹牛鲜锚,可吹牛的內容都是我干的突诬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼芜繁,長吁一口氣:“原來是場噩夢啊……” “哼旺隙!你這毒婦竟也來了?” 一聲冷哼從身側響起骏令,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔬捷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榔袋,有當地人在樹林里發(fā)現了一具尸體周拐,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年凰兑,在試婚紗的時候發(fā)現自己被綠了妥粟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吏够,死狀恐怖勾给,靈堂內的尸體忽然破棺而出滩报,到底是詐尸還是另有隱情,我是刑警寧澤播急,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布脓钾,位于F島的核電站,受9級特大地震影響桩警,放射性物質發(fā)生泄漏可训。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一生真、第九天 我趴在偏房一處隱蔽的房頂上張望沉噩。 院中可真熱鬧,春花似錦柱蟀、人聲如沸川蒙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜眨。三九已至,卻和暖如春术瓮,著一層夾襖步出監(jiān)牢的瞬間康聂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工胞四, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恬汁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓辜伟,卻偏偏與公主長得像氓侧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子导狡,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容