MySQL5.7 GTID學習筆記
GTID(global transaction identifier)是對於一個已提交事務的全域性唯一編號,前一部分是server_uuid,後面一部分是執行事務的唯一標誌,通常是自增的。
下表整理了GTID常用的檢視命令,以及變數的描述及原理,供大家參考(以下基於SQL/">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值 |