MySQL5.7 GTID學習筆記


GTID(global transaction identifier)是對於一個已提交事務的全局唯一編號,前一部分是server_uuid,后面一部分是執行事務的唯一標志,通常是自增的。

下表整理了GTID常用的查看命令,以及變量的描述及原理,供大家參考(以下基於MySQL5.7,對於MySQL5.6的GTID由於存在性能問題,不推薦使用)

 

角色

常用查看GTID的相關命令

變量示例

描述

變量的更新時機

master

show global variables like '%gtid%';

gtid_mode=ON

GTID模式,開啟GTID時在配置文件中開啟

gtid_mode參數的4種選項

1> GTID_MODE = OFF : 不產生Normal_GTID,只接受來自master的ANONYMOUS_GTID

2> GTID_MODE = OFF_PERMISSIVE : 不產生Normal_GTID,可以接受來自master的ANONYMOUS_GTID & Normal_GTID

3> GTID_MODE = ON_PERMISSIVE : 產生Normal_GTID,可以接受來自master的ANONYMOUS_GTID & Normal_GTID

4> GTID_MODE = ON : 產生Normal_GTID,只接受來自master的Normal_GTID

在my.cnf配置中指定,或者online可以通過下面修改

SET @@GLOBAL.GTID_MODE=

SET GLOBAL GTID_MODE=

 

 

enforce_gtid_consistency=ON

保證GTID安全的參數,開啟GTID時在配置文件中開啟

ENFORCE_GTID_CONSISTENCY參數的3種選項

1> OFF:所有事務允許違反gtid一致性。

2> ON:沒有事務允許違反gtid一致性。

3> WARN:所有事務允許違反gtid一致性,但一個警告會產生,Mysql5.7.6新增。

在my.cnf配置中指定,或者online可以通過下面修改

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY=

SET GLOBAL ENFORCE_GTID_CONSISTENCY=

 

 

 

gtid_executed=

06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936,

14361082-83ae-11e8-8328-883fd32565d6:1-1051075034

執行過的所有GTID集合

ordered_commit flush階段生成GTID,在commit階段才計入gtid_executed變量,在內存中實時更新

 

 

gtid_purged=

06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936,

14361082-83ae-11e8-8328-883fd32565d6:1-1045677424

由於binlog文件的刪除(如purge binary logfiles或者超過expire_logs_days設置)已經丟失的GTID事務,同時在搭建從庫時使用set global gtid_purged變量來標識哪些GTID事務已經執行過了。

在MySQL觸發清理binlog的情況下,比如purge binary logs to或者超過參數expire_logs_days設置的天數后自動刪除,需要將丟失的GTID計入這個變量中

 

 

gtid_owned=

14361082-83ae-11e8-8328-883fd32565d6:1049600466#997780200

 

分配GTID發生在GROUP COMMIT的第一個階段,也就是flush stage,大概可以描述為:

1、事務過程中,碰到第一條DML語句需要記錄Binlog時,分配一段Gtid事件的cache,但不分配實際的GTID

2、事務完成后,進入commit階段,分配一個GTID並寫入Step1預留的Gtid事件中,該GTID必須保證不在gtid_owned集合和gtid_executed集合中。 分配的GTID隨后被加入到gtid_owned集合中。

3、將Binlog 從線程cache中刷到Binlog文件中。

4、將GTID加入到gtid_executed集合中。

5、在完成sync stage 和commit stage后,各個會話將其使用的GTID從gtid_owned中移除。

master

show global variables like '%uuid%';

server_uuid=14361082-83ae-11e8-8328-883fd32565d6

server_uuid實際上是一個32字節+1字節(/0)的字符串。

MySQL啟動的時候會調用init_server_auto_options() 讀取auto.cnf文件。如果沒有讀取到則調用generate_server_uuid()調用生成一個server_id。

master

select * from mysql.gtid_executed;

source_uuid=14361082-83ae-11e8-8328-883fd32565d6

uuid of the source where the transaction was originally executed.

gtid_executed表是5.7.5以后新增的,是GTID持久化的介質,實例重啟后讀取這個表初始化。

1、從庫在binlog關閉或者binlog開啟,參數log_slave_updates關閉的情況,實時將GTID持久化到gtid_executed表中。

2、從庫在binlog開啟同時參數log_slave_updates開啟的情況,不實時更新

3、主庫不實時更新。

4、執行reset master時,清空表

5、set global gtid_purged時,設置表

 

 

interval_start=1

First number of interval

同上

 

 

interval_end=1053828634

Last number of interval

同上

master

show master status\G

Executed_Gtid_Set=

06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936,

14361082-83ae-11e8-8328-883fd32565d6:1-1054196743

執行過的所有GTID集合

同gtid_executed

master

Mysqlbinlog -vvv SVR14077HW2288-bin.030734|less

Previous-GTIDs=

# 14361082-83ae-11e8-8328-883fd32565d6:1-1055704939,

#e36c6adf-fe56-11e6-9f8e-883fd325654a:74434853-7475373424

Previous gtid Event是包含在每一個binlog的開頭用於描述所有以前binlog所包含的全部Gtid的一個集合

(包括已經刪除的binlog)

產生的binlog中開頭會包含這個值

在5.7中不開啟GTID也會包含這個Previous gtid Event

slave

show slave status\G

Master_UUID: 14361082-83ae-11e8-8328-883fd32565d6

對應master的server_uuid

 

 

 

Retrieved_Gtid_Set:14361082-83ae-11e8-8328-883fd32565d6:962977557-1057333221

IO線程已經讀取的GTID的集合

1、IO線程收到一個GTID EVENT就會把它加入到Retrieved_Gtid_Set中

2、MySQL重啟時會從relay log中初始化Retrieved_Gtid_Set

 

 

Executed_Gtid_Set:06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936,

14361082-83ae-11e8-8328-883fd32565d6:1-1057333220

表示SQL線程已經執行的GTID的集合

主庫的binlog在從庫應用時,會更新Executed_Gtid_Set值

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM