• 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. 同时更新 事务引擎 和 非事务引擎
  • 相关阅读:
    Linux系统介绍(二)文件系统结构
    为Docker Swarm添加调度策略
    Docker 三剑客之 Docker Swarm
    Hadoop中文文档
    hadoop 学习笔记:mapreduce框架详解
    Java进阶-- GUI
    ceph(8)--关于Ceph PGs
    今天在学习NTP时发现了2个网站
    开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
    Switch能否用string做参数
  • 原文地址:https://www.cnblogs.com/polestar/p/10794563.html
Copyright © 2020-2023  润新知