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. 同时更新 事务引擎 和 非事务引擎
原文地址:https://www.cnblogs.com/polestar/p/10794563.html