博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyFlash MySQL闪回工具
阅读量:5946 次
发布时间:2019-06-19

本文共 6958 字,大约阅读时间需要 23 分钟。

原理介绍请看美团官方博客:     

安装:

环境要求:

1binlog格式必须为row,且binlog_row_image=full

2仅支持5.65.7

3只能回滚DML(增、删、改)

4.  下载地址:https://github.com/Meituan-Dianping/MyFlash

 

安装:

unzip MyFlash-master.zipmv MyFlash-master /usr/local/MyFlash/gcc -w  `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback

闪回:

 

update,情景描述,程序1误将xtr库下面的t2 12,11 更改后0,这是一个错误的操作;而后面的程序21314更改0了,这是一个正确的操作,需要闪回程序1的误操作。

模似上述场景:

原表:

mysql> select * from xtr.t2;+------+| id  |+------+|  12 ||  11 ||  4  ||  3  ||  13 ||  14 |+------+6 rows in set (0.00 sec)

update操作:

update xtr.t2 set id = 0 where id = 12;update xtr.t2 set id = 0 where id = 11;update xtr.t2 set id = 0 where id = 13;update xtr.t2 set id = 0 where id = 14;

DBA接到开发的报警后:

1flush logs;

需要闪回的动作所在的二进制文件,这个文件必须是稳定的,需要flush logs;

2、记录当前的binlog文件

3、解析binlog

mysqlbinlog -vv bin.000038|less# at 838#180326 21:41:59 server id 11  end_log_pos 882 CRC32 0x304d887b         Table_map: `xtr`.`t2` mapped to number 268                                         #这个position开始进入xtr.t2库# at 882#180326 21:41:59 server id 11  end_log_pos 928 CRC32 0x8fac8e57         Update_rows: table id 268 flags: STMT_END_FBINLOG 'twa5WhMLAAAALAAAAHIDAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAXuITTA=twa5Wh8LAAAALgAAAKADAAAAAAwBAAAAAAEAAgAB///+CwAAAP4AAAAAV46sjw=='/*!*/;### UPDATE `xtr`.`t2`                                                                    #更改的第一条语句### WHERE###   @1=11 /* INT meta=0 nullable=1 is_null=0 */### SET###   @1=0 /* INT meta=0 nullable=1 is_null=0 */# at 928#180326 21:41:59 server id 11  end_log_pos 959 CRC32 0xca19e065         Xid = 230COMMIT/*!*/;# at 959#180326 21:42:04 server id 11  end_log_pos 1024 CRC32 0xe7e195c8         GTID        last_committed=3        sequence_number=4SET @@SESSION.GTID_NEXT= '148e1f5e-befd-11e7-ac58-08002738f0ad:207'/*!*/;# at 1024#180326 21:42:04 server id 11  end_log_pos 1095 CRC32 0x0c3e3fdc         Query        thread_id=3        exec_time=0        error_code=0SET TIMESTAMP=1522075324/*!*/;BEGIN/*!*/;# at 1095#180326 21:42:04 server id 11  end_log_pos 1139 CRC32 0xd6cdd96b         Table_map: `xtr`.`t2` mapped to number 268# at 1139#180326 21:42:04 server id 11  end_log_pos 1185 CRC32 0xbd63762d         Update_rows: table id 268 flags: STMT_END_F BINLOG 'vAa5WhMLAAAALAAAAHMEAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAWvZzdY=vAa5Wh8LAAAALgAAAKEEAAAAAAwBAAAAAAEAAgAB///+DAAAAP4AAAAALXZjvQ=='/*!*/;### UPDATE `xtr`.`t2`                              #更改的第二条语句### WHERE###   @1=12 /* INT meta=0 nullable=1 is_null=0 */### SET###   @1=0 /* INT meta=0 nullable=1 is_null=0 */# at 1185#180326 21:42:04 server id 11  end_log_pos 1216 CRC32 0xb62d1a59         Xid = 231COMMIT/*!*/;# at 1216                                         #两个事务结束的position点位置

4、./flashback --sqlTypes='UPDATE' --binlogFileNames=/data/mysql/bin.000038  --start-position=838 --stop-position=1216 --outBinlogFileNameBase=update

反解析UPDATE操作,生成以update开头的文件

生成的文件名:binlog_output_base.flashback

 

5、 mysqlbinlog binlog_output_base.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock

导入数据库

 

6、查询数据库

mysql> select * from xtr.t2;+------+| id   |+------+|   12 ||   11 ||    4 ||    3 ||    0 ||    0 |+------+6 rows in set (0.00 sec)

闪回完成

 

insert 场景闪回

原表:

mysql> select * from xtr.t2;+------+| id   |+------+|   12 ||   11 ||    4 ||    3 ||    0 ||    0 |+------+6 rows in set (0.00 sec)

插入数据

mysql> insert into xtr.t2 values(99);Query OK, 1 row affected (0.00 sec)mysql> insert into xtr.t2 values(88);Query OK, 1 row affected (0.00 sec)mysql> insert into xtr.t2 values(77);Query OK, 1 row affected (0.00 sec)mysql> select * from xtr.t2;+------+| id   |+------+|   12 ||   11 ||    4 ||    3 ||    0 ||    0 ||   99 ||   88 ||   77 |+------+9 rows in set (0.00 sec) mysql> delete from xtr.t2 where id = 0;Query OK, 2 rows affected (0.03 sec) mysql> select * from xtr.t2;+------+| id   |+------+|   12 ||   11 ||    4 ||    3 ||   99 ||   88 ||   77 |+------+7 rows in set (0.00 sec)

现在需要闪回insert的操作,id=99,id=99,id=77的全部的闪回

 

mysql> show master logs;+------------+-----------+| Log_name   | File_size |+------------+-----------+ || bin.000036 |      1759 || bin.000037 |       749 || bin.000038 |      1771 || bin.000039 |       217 || bin.000040 |      2979 |+------------+-----------+17 rows in set (0.00 sec) mysql> flush logs;Query OK, 0 rows affected (0.08 sec) ./flashback --binlogFileNames=/data/mysql/bin.000040 --sqlTypes='INSERT' --start-position=1851 --stop-position=2462 --outBinlogFileNameBase=insert mysqlbinlog insert.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock mysql> select * from xtr.t2;+------+| id   |+------+|   12 ||   11 ||    4 ||    3 |+------+4 rows in set (0.00 sec)

insert 闪回完成

 

可以用mysqlbinlog查看insert.flashback文件:

### DELETE FROM `xtr`.`t2`### WHERE###   @1=77 /* INT meta=0 nullable=1 is_null=0 */# at 207#180327 21:20:37 server id 11  end_log_pos 251 CRC32 0xb6c9ac45         Table_map: `xtr`.`t2` mapped to number 268# at 251#180327 21:20:37 server id 11  end_log_pos 291 CRC32 0x3efac7b3         Delete_rows: table id 268 flags: STMT_END_F BINLOG 'NVO6WhMLAAAALAAAAPsAAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAUWsybY=NVO6WiALAAAAKAAAACMBAAAAAAwBAAAAAAEAAgAB//5YAAAAs8f6Pg=='/*!*/;### DELETE FROM `xtr`.`t2`### WHERE###   @1=88 /* INT meta=0 nullable=1 is_null=0 */# at 291#180327 21:20:34 server id 11  end_log_pos 335 CRC32 0xe10122fd         Table_map: `xtr`.`t2` mapped to number 268# at 335#180327 21:20:34 server id 11  end_log_pos 375 CRC32 0x9943c01c         Delete_rows: table id 268 flags: STMT_END_F BINLOG 'MlO6WhMLAAAALAAAAE8BAAAAAAwBAAAAAAEAA3h0cgACdDIAAQMAAf0iAeE=MlO6WiALAAAAKAAAAHcBAAAAAAwBAAAAAAEAAgAB//5jAAAAHMBDmQ=='/*!*/;### DELETE FROM `xtr`.`t2`### WHERE###   @1=99 /* INT meta=0 nullable=1 is_null=0 */SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;DELIMITER ;# End of log file/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

生成还是binlog文件,把二进制文件一行一行的读出来,反向解析了

问题:

安装报错:

[root@mysql MyFlash]# gcc -w  `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback

Package glib-2.0 was not found in the pkg-config search path.

Perhaps you should add the directory containing `glib-2.0.pc'

to the PKG_CONFIG_PATH environment variable

No package 'glib-2.0' found

 

解决:

yum -y install  glib2-devel

 

导入报错

[root@mysql binary]# mysqlbinlog binlog_output_base.flashback |mysql -uroot -p'123' -S /tmp/mysql_3306.sock

mysql: [Warning] Using a password on the command line interface can be insecure.

ERROR 1782 (HY000) at line 17: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.

 

根据官方建议加入--skip-gtids

[root@mysql binary]# mysqlbinlog binlog_output_base.flashback --skip-gtids |mysql -uroot -p'123' -S /tmp/mysql_3306.sock

mysql: [Warning] Using a password on the command line interface can be insecure.

ERROR 1032 (HY000) at line 36: Can't find record in 't2'    t2是我需要回滚的表 

但加上这个参数还是会报错,但在数据库里查询此时数据已经回滚进去了,第二天在测试就没有这个问题了?

 

问题:

833034f973971294ef108abbea35c038b9a8674b

这是因为找错了position点的位置

转载地址:http://hydxx.baihongyu.com/

你可能感兴趣的文章
K8S使用Ceph RBD作为后端存储
查看>>
Centos yum的配置与使用
查看>>
Linux 文件内容查看工具介绍-cat,less,more,tail,head
查看>>
linux lsof 命令
查看>>
AD 总结
查看>>
在windows中将QString 转化为宽字节
查看>>
Jquery ajax异步提交
查看>>
MySQl的意外断电后无法启动
查看>>
如何防止表单重复提交
查看>>
真是因为忙才加班吗
查看>>
磁盘FAT型转NTFS
查看>>
多线程访问网页+高并发测试网站
查看>>
使用nlite制作集成驱动windows安装光盘及实践心得
查看>>
Linux安装oracle出现过的问题和处理参考资料
查看>>
HTML5游戏开发-Box2dWeb应用(二)-碰撞以及各种连接
查看>>
SVG to Canvas在线转换工具
查看>>
我的友情链接
查看>>
python使用递归实现目录遍历
查看>>
android/java模拟登录正方教务系统
查看>>
iOS通过http post上传图片
查看>>