mysql5.7开启GTID后如何使用日志还原到时间点
![0594c85ab1f396436478128f40a2a0de.png](https://i-blog.csdnimg.cn/blog_migrate/d41a3af853e7fe12ece9b426c0f9c97d.jpeg)
mysql5.7 开启GTID功能前后使用日志还原到时间点的方案是有所不同的,我们来演示下二者的区别
我们有两个mysql数据库 A库没有开启GTID,B库开启了GTID,我们来演示下不同
一. 数据准备(A B库)
分别在两个库上创建test库和表t,为后边做差别比较
create database test;
use test;
create table t(id int,name varchar(20));
flush logs;
insert into t values (1,'a'),(2,'b');
insert into t values (3,'a'),(4,'b');
delete from t where id in (1,2);
select *from t;
![ff30ecd42ce9aafe9a3b45855131187d.png](https://i-blog.csdnimg.cn/blog_migrate/1710d55450bdf8b3a326776048f9bff0.jpeg)
二.A B库备份日志
A库
mysqlbinlog --read-from-remote-server --host=localhost --user=goodhope --password=123456 --raw mysqlbin.000010 --result-file=/home/
B库
mysqlbinlog --read-from-remote-server --host=localhost --user=goodhope --password=123456 --raw mysql3306-bin.000014 --result-file=/home/
三. A库(未开GUID)使用日志还原
1.查看日志
mysqlbinlog --base64-output=DECODE-ROWS -v -v /home/mysqlbin.000010
![9d289b3570fa4c6ed8e1069e8dfa0233.png](https://i-blog.csdnimg.cn/blog_migrate/754c7c20b165a71ad662a8cc078c243c.jpeg)
![3e02d337ffe64aa6177a5cf8e15bd58c.png](https://i-blog.csdnimg.cn/blog_migrate/19a3c10c7c77d6bd41ad58286f2b962c.jpeg)
我们看到在position 291- 418 对应的是插入 id 1 和2,555 到745 是插入 id 3 和4 ,所以我们要将删除的1 和2回复回来,只需要将position 从291 到418这块进行还原即可
2. 直接使用二进制日志恢复
mysqlbinlog --start-position=291 --stop-position=418 /home/mysqlbin.000010 | mysql -ugoodhope -p123456
3. 查看
![8ae60f0d67ef466c4ad443bb2ee71da8.png](https://i-blog.csdnimg.cn/blog_migrate/93d237ec9857ee41247a69332782cd16.jpeg)
数据完全恢复了
四 . B库(GUID)使用日志还原
1.查看日志
mysqlbinlog --base64-output=DECODE-ROWS -v -v /home/mysql3306-bin.000014
![1cb944ad66f522153fcafd7207bd7b6a.png](https://i-blog.csdnimg.cn/blog_migrate/a28081dad463016c42ad87441a6a460b.jpeg)
同上面的方法,我们也找到了插入1 2的position是从371 到498, 我们只要将这部分还原就可以
2. 还原
mysqlbinlog --start-position=371 --stop-position=498 /home/mysql3306-bin.000014 | mysql -ugoodhope -p123456
还原指令报错
![d866848d65d58d8ce0141f9058515928.png](https://i-blog.csdnimg.cn/blog_migrate/dd5d9da45af5f29ee6a6eafc54c6dc00.jpeg)
开启了gtid的数据库是不能随便的使用日志去还原的,因为在日志中是有显性设置事务号的,所以正确做法是先从日志中将需要执行的sql产生出来
mysqlbinlog --skip-gtids -d test --start-position=371 --stop-position=498 /home/mysql3306-bin.000014>/home/testlog.sql
使用mysql 使用 source 进行还原该语句
![fa9e727c3ee4f9265d76f0c75ba3b250.png](https://i-blog.csdnimg.cn/blog_migrate/726675120c28f53a6567d66a02e45f85.jpeg)
select *from t;
![804d644521b393d0b7bb5429f3a9c156.png](https://i-blog.csdnimg.cn/blog_migrate/ca0652f863c047ac1be565cef5a5d268.jpeg)
另外还要注意,如果是在主从环境中,主库上恢复数据,但是又不想将该恢复动作传递到从库上,则要将该执行sql不要记录到日志中,这里可以使用 set sql_log_bin=0,比如下面这个例子
set sql_log_bin=0;
source /home/log.sql;
set sql_log_bin=1;