二十五、二进制日志之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课程 第六章 日志管理

posted @ 2021-03-14 11:29  努力吧阿团  阅读(281)  评论(0编辑  收藏  举报