GTID 筆記

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. 同時更新 事務引擎 和 非事務引擎
相關文章
相關標籤/搜索