mysql5.7开启GTID后如何使用日志还原到时间点
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;
二.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
我们看到在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. 查看
数据完全恢复了
四 . B库(GUID)使用日志还原
1.查看日志
mysqlbinlog --base64-output=DECODE-ROWS -v -v /home/mysql3306-bin.000014
同上面的方法,我们也找到了插入1 2的position是从371 到498, 我们只要将这部分还原就可以
2. 还原
mysqlbinlog --start-position=371 --stop-position=498 /home/mysql3306-bin.000014 | mysql -ugoodhope -p123456
还原指令报错
开启了gtid的数据库是不能随便的使用日志去还原的,因为在日志中是有显性设置事务号的,所以正确做法是先从日志中将需要执行的sql产生出来
mysqlbinlog --skip-gtids -d test --start-position=371 --stop-position=498 /home/mysql3306-bin.000014>/home/testlog.sql
使用mysql 使用 source 进行还原该语句
select *from t;
另外还要注意,如果是在主从环境中,主库上恢复数据,但是又不想将该恢复动作传递到从库上,则要将该执行sql不要记录到日志中,这里可以使用 set sql_log_bin=0,比如下面这个例子
set sql_log_bin=0;
source /home/log.sql;
set sql_log_bin=1;