1.生成事務
root@(none)>use pxc01
Database changed
root@pxc01>create table tbx(id int);
Query OK, 0 rows affected (0.15 sec)
root@pxc01>insert into tbx values(1);
Query OK, 1 row affected (0.13 sec)
root@pxc01>select * from tbx;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
2.確認當前二進制文件位置
root@pxc01>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 1040 | | | 015d4d11-0363-11e9-bb6c-0800279a3030:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
root@pxc01>
3.查看二進制文件中的事件(Previous_gtids 和 Gtid)
root@pxc01>show binlog events IN 'mysql-bin.000013';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000013 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.23-23-31.31-log, Binlog ver: 4 |
| mysql-bin.000013 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000013 | 154 | Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= '015d4d11-0363-11e9-bb6c-0800279a3030:1' |
| mysql-bin.000013 | 219 | Query | 1 | 467 | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.2.%' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| mysql-bin.000013 | 467 | Gtid | 1 | 532 | SET @@SESSION.GTID_NEXT= '015d4d11-0363-11e9-bb6c-0800279a3030:2' |
| mysql-bin.000013 | 532 | Query | 1 | 619 | flush privileges |
| mysql-bin.000013 | 619 | Gtid | 1 | 684 | SET @@SESSION.GTID_NEXT= '015d4d11-0363-11e9-bb6c-0800279a3030:3' |
| mysql-bin.000013 | 684 | Query | 1 | 784 | use `pxc01`; create table tbx(id int) |
| mysql-bin.000013 | 784 | Gtid | 1 | 849 | SET @@SESSION.GTID_NEXT= '015d4d11-0363-11e9-bb6c-0800279a3030:4' |
| mysql-bin.000013 | 849 | Query | 1 | 922 | BEGIN |
| mysql-bin.000013 | 922 | Table_map | 1 | 969 | table_id: 109 (pxc01.tbx) |
| mysql-bin.000013 | 969 | Write_rows | 1 | 1009 | table_id: 109 flags: STMT_END_F |
| mysql-bin.000013 | 1009 | Xid | 1 | 1040 | COMMIT /* xid=60 */ |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
13 rows in set (0.00 sec)
4.查看全局變量 gtid_executed
root@pxc01>show global variables like 'gtid%';
+----------------------------------+------------------------------------------+
| Variable_name | Value |
+----------------------------------+------------------------------------------+
| gtid_executed | 015d4d11-0363-11e9-bb6c-0800279a3030:1-4 |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | |
+----------------------------------+------------------------------------------+
5 rows in set (0.01 sec)
root@pxc01>
GTID的持久化:
1.gtid_executed被設置爲最新的binlog文件中Previous_gtids_log_event和全部Gtid_log_event的並集。
2.gtid_purged爲最老的binlog文件中Previous_gtids_log_event。
因爲這兩個重要的變量值記錄在binlog中,因此開啓gtid_mode時必須同時在主庫上開啓log_bin在備庫上開啓log_slave_updates。可是,在MySQL5.7中沒有這個限制。MySQL5.7中,
新增長一個系統表mysql.gtid_executed用於持久化已執行的GTID集合。當主庫上沒有開啓log_bin或在備庫上沒有開啓log_slave_updates時,mysql.gtid_executed會跟用戶事務一塊兒每次更新。不然只在binlog日誌發生rotation時更新mysql.gtid_executed。
《與MySQL傳統複製相比,GTID有哪些獨特的複製姿式》
GTID和Binlog之間的關係是怎麼對應的呢:
* 假設有4個binlog: bin.001,bin.002,bin.003,bin.004
* bin.001 : Previous-GTIDs=empty; binlog_event有:1-40
* bin.002 : Previous-GTIDs=1-40; binlog_event有:41-80
* bin.003 : Previous-GTIDs=1-80; binlog_event有:81-120
* bin.004 : Previous-GTIDs=1-120; binlog_event有:121-160
1. 假設如今咱們要找GTID=$A,那麼MySQL的掃描順序爲: 從最後一個binlog開始掃描(即:bin.004)
2. bin.004的Previous-GTIDs=1-120,若是$A=140 > Previous-GTIDs,那麼確定在bin.004中
3. bin.004的Previous-GTIDs=1-120,若是$A=88 包含在Previous-GTIDs中,那麼繼續對比上一個binlog文件 bin.003,而後再循環前面2個步驟,直到找到爲止
《MySQL5.7殺手級新特性:GTID原理與實戰》https://yq.aliyun.com/articles/57731
重要參數如何持久化:
1) 如何持久化gtid_executed [ log-bin=on,log_slave_update=on ]
1. gtid_executed = mysql.gtid_executed 【normal】
or
2. gtid_executed = mysql.gtid_executed + last_binlog中最後沒寫到mysql.gtid_executed中的gtid_event 【recover】
2) 如何持久化重置的gtid_purged值?
reset master; set global gtid_purged=$A:a-b;
1. 因爲有可能手動設置過gtid_purged=$A:a-b, binlog.index中,last_binlog的Previous-GTIDs並不會包含$A:a-b
2. 因爲有可能手動設置過gtid_purged=$A:a-b, binlog.index中,first_binlog的Previous-GTIDs確定不會出現$A:a-b
3. 重置的gtid_purged = @@global.gtid_executed(mysql.gtid_executed:注意,考慮到這個表的更新觸發條件,因此這裏用@@global.gtid_executed代替) - last_binlog的Previous-GTIDs - last_binlog全部的gtid_event
4. 下面就用 $reset_gtid_purged 來表示重置的gtid
3)如何持久化gtid_purged [ log-bin=on,log_slave_update=on ]
gtid_purged=binlog.index:first_binlog的Previous-GTIDs + $reset_gtid_purged
開啓GTID的必備條件:
MySQL 5.6
gtid_mode=ON(必選)
log_bin=ON(必選)
log-slave-updates=ON(必選)
enforce-gtid-consistency(必選)
MySQL 5.7 or higher
gtid_mode=ON(必選)
enforce-gtid-consistency(必選)
log_bin=ON(可選)--高可用切換,最好設置ON
log-slave-updates=ON(可選)--高可用切換,最好設置ON
GTID的Limitation
不安全的事務
1. CREATE TABLE ... SELECT statements
2. CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE statements inside transactions
3. 同時更新 事務引擎 和 非事務引擎