基于GTID,binlog恢复

GTID介绍
对于binlog中的每一个事务,都会生成一个GTID号码
DDL ,DCL 一个event就是一个事务,就会有一个GTID号.
DML语句来讲,begin到commit,是一个事务,就是一个GTID号

GTID的组成
severid_uuid:TID
severid_uuid?
[root@db01 data]# cat auto.cnf
[auto]
server-uuid=5559361e-d20d-11ea-8f61-000c2955e23b

TID是一个:自增长的数据,从1开始
server-uuid=5559361e-d20d-11ea-8f61-000c2955e23b:1-6

GTID的幂等性
如果拿有GTID的日志去恢复时,检查当前系统中是否有相同GTID号,有相同的就自动跳过
会影响到binlog恢复和主从复制.

GTID的开启和配置
vim /etc/my.cnf
log-slave-updates=on
gtid-mode=on
enforce-gtid-consistency=on

查看GTID信息
mysql> create database gtid charset utf8mb4;
mysql> show master status;
在这里插入图片描述
mysql> use gtid;
mysql> create table t1(id int);
mysql> show master status;
mysql> insert into t1 values(1);
mysql> show master status;

模拟恢复数据
删库
mysql> drop database gtid;

查看现在所使用的binlog号,并确定GTID事物号
show master status;
在这里插入图片描述
确定GTID事物号
show BINLOG EVENTS in “backup.000004”;
在这里插入图片描述

(1) 截取日志
cd /data/binlog/
mysqlbinlog --include-gtids=“5559361e-d20d-11ea-8f61-000c2955e23b:1-3” backup.000004 >/tmp/gtid.sql

(2)恢复
mysql> set sql_log_bin=0;
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;
(3) 报错
ERROR 1049 (42000): Unknown database ‘gtid’
Query OK, 0 rows affected (0.00 sec)
ERROR 1046 (3D000): No database selected
为什么报错?
因为幂等性的检查,1-3事务已经做过了.

(4)正确的做法?
mysqlbinlog --skip-gtids --include-gtids=“5559361e-d20d-11ea-8f61-000c2955e23b:1-3” backup.000004 >/tmp/gtid.sql

–skip-gtids 作用:在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息

(5) 恢复

set sql_log_bin=0;
source /tmp/gtid.sql
set sql_log_bin=1;

2.6.7 GTID相关的参数
–skip-gtids
–include-gtids=‘5559361e-d20d-11ea-8f61-000c2955e23b:6’,‘5559361e-d20d-11ea-8f61-000c2955e23b:8’ 包含多个写法
–exclude-gtids=‘5559361e-d20d-11ea-8f61-000c2955e23b:6’,‘5559361e-d20d-11ea-8f61-000c2955e23b:8’ 排除多个写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值