zoukankan      html  css  js  c++  java
  • 二十五、二进制日志之GTID模式

    GTID介绍

    从5.7开始建议将二进制日志记录模式改为GTID记录模式

    对于binlog中的每一个事务,都会生成一个GTID号码;
    这里的事务对于DDL,DCL语句来讲每一个event就是一个事务,就会有一个GTID号,跟事件一样;
    对于DML语句来讲,从begin到commit,是一个事务,就有一个GTID号,这个跟事件不一样要注意;

    GTID的组成

    由两部分组成,severi_uuid跟TID组成;

    severi_uuid:TID
    TID:事务号码,从1开始,是一个自增长的数字
    例如:d60b549f-9e10-11e9-ab04-000c294a1b3b:1-15

    而server-uuid是数据库在第一次初始化并启动时就生成了,存放于data/目录下auto.cnf文件中

    $ cd /usr/local/mysql5.7/data/
    $ cat auto.cnf
    [auto]
    server-uuid=65c12fe4-613e-11eb-9271-000c29a2912e
    

    开启GTID

    #修改配置文件
    $ vim /etc/my.cnf
    [mysqld]
    gtid-mode=on #开启GTID模式
    enforce-gtid-consistency=true #强制GTID一致性
    
    $ /etc/init.d/mysqld restart
    

    GTID的幂等性
    如果拿有GTID的日志去恢复时,当检查到当前系统中有相同的GTID号时,就会自动跳过,这样就会影响到binlog恢复和主从复制。
    所以需要强制GTID一致性。

    案例

    1、创建测试数据

    mysql> create database gtid charset utf8mb4;
    
    #此时Executed_Gtid_Set列中什么都没有,见下图
    mysql> show master status;
    
    #创建表
    mysql> use gtid;
    mysql> create table t1(id int);
    
    #已生成GTID
    mysql> show master status;
    
    #使用DML语句但未提交会发现GTID号码未增长,见下图
    mysql> insert into t1 values(1);
    mysql> show master status;
    
    #提交后,GTID增长
    mysql> commit;
    mysql> show master status;
    mysql> drop database gtid;
    

    开启GTID之后,创建gtid数据库就会生成GTID事务

    注意使用DML语句commit之后才算一个事务

    开启GTID后,查看binlog事件信息


    2、导出GTID事务
    第4号GTID事务是删库语句,所以导出1-3号的GTID事务进行恢复
    --skip-gtids表示在导出时,忽略原有的gtid信息

    $ mysqlbinlog --skip-gtids 
    --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' 
    mysql-bin.000005 >/tmp/gtid.sql
    

    如果不忽略原有的gtid信息,会由于幂等性的检查而报如下错误,这是因为1-3事务在原有数据已经存在

    ERROR 1049 (42000): Unknown database 'gtid'
    Query OK, 0 rows affected (0.00 sec)
    ERROR 1046 (3D000): No database selected
    

    3、恢复1-3号GTID事务

    mysql> set sql_log_bin=0; #暂时关闭记录二进制日志
    mysql> source /tmp/gtid.sql #开始恢复
    mysql> set sql_log_bin=1; #开启记录二进制日志
    

    GTID相关的参数

    --skip-gtids
    不检查gtid幂等性

    --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'
    只截取6跟8的gtid事务参数

    --exclude-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'
    排除6跟8的gtid事务参数

    学习来自:老男孩深标DBA课程 第六章 日志管理

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    自己写的一些公共js方法
    node(03)--利用 HTTP 模块 URl 模块 PATH 模块 FS 模块创建一个 WEB 服务器
    node(03 fs文件模块)
    node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
    node.js (01http 模块 url 模块)
    Ubuntu 16.04 下python2和python3及对应的pip的方法
    MySQL划重点-查询-聚合
    MySQL划重点-查询-条件
    MySQL命令
    使用Navicat for Mysql连接装在虚拟机Ubuntu16.04上的mysql服务器
  • 原文地址:https://www.cnblogs.com/tz90/p/14598691.html
Copyright © 2011-2022 走看看