MyFlash MySQL闪回工具

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 由于运维、DBA的误操作或是业务bug,我们在操作中时不时会出现误删除数据情况。早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管那种,都非常费时费力,而且容易出错。

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

https://tech.meituan.com/MySQL_flashback%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E5%AE%9E%E6%88%98.html


安装:

环境要求:

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

2仅支持5.65.7

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

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

 

安装:


unzip MyFlash-master.zip

mv 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_F

BINLOG '

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 = 230

COMMIT/*!*/;

# at 959

#180326 21:42:04 server id 11  end_log_pos 1024 CRC32 0xe7e195c8         GTID        last_committed=3        sequence_number=4

SET @@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=0

SET 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 = 231

COMMIT/*!*/;

# 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点的位置


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
842 4
|
9天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
51 11
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库-概括与常用图形管理工具
MySQL数据库-概括与常用图形管理工具
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
97 3
|
3月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
3月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
471 4
|
4月前
|
SQL 监控 关系型数据库
使用 pt-query-digest 工具分析 MySQL 慢日志
【8月更文挑战第5天】使用 pt-query-digest 工具分析 MySQL 慢日志
111 3
使用 pt-query-digest 工具分析 MySQL 慢日志
|
4月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 数据备份工具有哪些?
在Linux中,mysql 数据备份工具有哪些?
|
4月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
4月前
|
关系型数据库 MySQL 数据库
MySQL回滚工具:binlog 闪回工具 MyFlash工具
MySQL回滚工具:binlog 闪回工具 MyFlash工具