MySQL——GTID模式应用及数据恢复

GTID介绍

GTID(Global Transaction Identifier)全局事务标识。由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL集群内也是唯一的。GTID在MySQL 5.6.2版本中开始支持到现在已经非常完善了,它相对于之前版本基于Binlog文件+Position和GTID的主从复制,数据一致性更高,主从数据复制更健壮,主从切换、故障切换出错率更低。对于binlog中的每一个事务,都会生成一个GTID号码,对于DCL、DDL语句来讲,一个event就是一个事务也就会跟随一个GTID号;对于DML语句来讲,从开始事务(begin)到提交事务(commit)的过程是一个事务,会跟随一个GTID号。
GITD由severi_uuid:TID组成。
severi_uuid在数据目录下的auto.cnf文件中:

[root@localhost 3306]# cat auto.cnf 
[auto]
server-uuid=398bf878-78c6-11ea-84ef-000c291fce9a

TID是一个从1开始自增长的数据,比如:

398bf878-78c6-11ea-84ef-000c291fce9a:1-15

说明已经执行了15个事务。

GTID工作原理

1.master更新数据的时候,会在事务前产生GTID,一同记录到binlog日志中。

2.slave端的io线程将binlog写入到本地relay log中。

3.然后SQL线程从relay log中读取GTID,设置gtid_next的值为该gtid,然后对比slave端的binlog是否有记录

4.如果有记录的话,说明该GTID的事务已经运行,slave会忽略

5.如果没有记录的话,slave就会执行该GTID对应的事务,并记录到binlog中
在这里插入图片描述

开启GTID

vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true

截取日志:

mysqlbinlog --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql_bin.000006 >/tmp/gtid.sql

检查检查检查(vim)备份文件

恢复:
(mysqlbinlog --start-position=111 --stop-position=55555 /data/binlog/mysql-bin.000004 >/tmp/bin.sql)

mysql> set sql_log_bin=0;//基于binlog恢复,日志里面记录的也是mysql语句,临时关闭恢复时产生的新日志。
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;

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

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

解决:
在刚才执行的mysqlbinlog命令加上–skip-gtids 参数作用:
在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息

删库跑路

1.全备
mysqldump -uroot -p123 -A -R --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction > /backup/full_$(date +%F).sql

参数说明:
-R 存储过程和函数
–triggers 触发器
–master-data=2 记录备份时刻的binlog信息(start-position),配合–single-transaction使用,如果不配合使用则开启自动锁表
–single-transaction 对于InnoDB的表,进行一致性快照备份,不锁表
--set-gtid-purged=OFF 启用了GTID情况下,记录binlog日志,如果不加,不记录binlog日志,如果做了主从用mysqldump备份时一定要加上该参数,否则在主上导入了恢复数据,主不记录binlog,主从会失效

2.全备后增加一些数据
use backup
insert into t1 values(11),(22),(33);
commit;
create table t2 (id int);
insert into t2 values(11),(22),(33);
commit;

3.已经买了机票了
drop database backup;
4.(1)
截取二进制日志 vim /data/binlog/mysql-bin.000002
– CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000002’, MASTER_LOG_POS=753;

(2)
show binlog events in ‘mysql-bin.000002’;
mysqlbinlog --skip-gtids --start-position=753 --stop-position=1519 /data/binlog/mysql-bin.000002 >/backup/bin.sql

5.恢复备份到临时库
mysql -S /data/3307/mysql.sock
set sql_log_bin=0;
source /backup/full_2019-07-15.sql
source /backup/bin.sql

6.将故障表导出并恢复到生产库
mysqldump -S /data/3307/mysql.sock -B backup >/backup/bak.sql
mysql -uroot -p123
set sql_log_bin=0
source /backup/bak.sql;

单表备份(独立表空间迁移)

(1)创建和原表结构一致的空表
(2)将空表的ibd文件删除
alter table city dicard tablespace;
(3)将原表的ibd拷贝过来,并且修改权限
(4)将原表ibd进行导入
alter table city import tablespace;

猜你喜欢

转载自blog.csdn.net/nmb_jiang/article/details/105442663