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