本節(jié)將討論下面3種信息更新的時(shí)機(jī)鞍帝,因?yàn)槲野l(fā)現(xiàn)經(jīng)常有朋友問(wèn)我為什么主庫(kù)和從庫(kù)的這幾個(gè)地方的修改時(shí)機(jī)不一樣诫睬。下面我們先來(lái)看一下它們的定義。其中g(shù)tid_executed和gtid_purged變量都是我們通過(guò)命令‘show global variables’來(lái)獲取的帕涌。
1. mysql.gtid_executed表:GTID持久化的介質(zhì)摄凡,GTID模塊初始化的時(shí)候會(huì)讀取這個(gè)表來(lái)作為獲取gtid_executed變量的基礎(chǔ)。
2. gtid_executed變量:表示數(shù)據(jù)庫(kù)中執(zhí)行了哪些GTID蚓曼,它是一個(gè)GTID SET處于內(nèi)存中亲澡。‘show slave status’中的Executed_Gtid_Set和‘show master status’中的Executed_Gtid_Set都來(lái)自于它纫版。
3. gtid_purged變量:表示由于binary log文件的刪除(如purge binary logfiles或者超過(guò)expire_logs_days設(shè)置)已經(jīng)丟失的GTID Event谷扣,它是一個(gè)GTID SET處于內(nèi)存中。我們?cè)诖罱▊鋷?kù)的時(shí)候捎琐,通常需要使用‘set global gtid_purged’命令來(lái)設(shè)置本變量,用于表示這個(gè)備份已經(jīng)執(zhí)行了哪些GTID操作裹匙。注意手動(dòng)刪除binary log將不會(huì)更新這個(gè)變量瑞凑。
這也是我們DBA通常能夠觀察到的幾種GTID信息,有了前文的描述我們知道其中mysql.gtid_executed表是一種GTID持久化的介質(zhì)概页,而gtid_executed和gtid_purged變量則對(duì)應(yīng)了內(nèi)部結(jié)構(gòu)體Gtid_state中的executed_gtids和lost_gtids內(nèi)存數(shù)據(jù)籽御,它們分別表示數(shù)據(jù)庫(kù)執(zhí)行了哪些GTID操作,有哪些GTID操作由于binary log文件的刪除已經(jīng)丟失了惰匙。
其次我們先來(lái)達(dá)成一個(gè)共識(shí)技掏,gtid_executed變量一定是實(shí)時(shí)更新的,不管主庫(kù)還是從庫(kù)项鬼。我們的討論將分為三部分:
- 主庫(kù)修改時(shí)機(jī)
- 從庫(kù)修改時(shí)機(jī)
- 通用修改時(shí)機(jī)
我們約定都是打開(kāi)GTID的情況下哑梳。下面我們先給出總結(jié)然后再來(lái)逐一分析。
一绘盟、總結(jié)
我這里先給出總結(jié)然后再具體分析原因鸠真,我使用一張圖來(lái)更加清晰的表示如下(圖1):