当前位置: 首页 > news >正文

借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能

借用binlog2sql工具轻松解析MySQL的binlog文件

    • 简介
    • 依赖配置
    • 用户权限
    • 选项配置
    • 案例:误UPDATE表数据回滚
    • binlog2sql VS mysqlbinlog

看腻文章了就来听听视频演示吧:https://www.bilibili.com/video/BV1Zj411k7VW/

简介

binlog2sql是美团大众点评开源的一款用于解析binlog的工具。可用于提取操作的SQL及生成回滚SQL。

依赖配置

github项目:
https://github.com/danfengcao/binlog2sql

github打不开可去gitee下载:
https://gitee.com/damned_gentleness/binlog2sql/tree/master/

unzip binlog2sql-master.zip 
cd binlog2sql-master/
# 需要安装的Python依赖
[root@db01 binlog2sql-master]# cat requirements.txt
PyMySQL==0.7.11
wheel==0.29.0
mysql-replication==0.13
# 指定使用阿里云的镜像(能连网的方式)
pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
  1. 阿里云:http://mirrors.aliyun.com/pypi/simple/
  2. 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
  3. 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
  4. 中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/

MySQL server必须设置以下参数:

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

用户权限

最小权限集合:

  • select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
  • super/replication client:两个权限都可以,需要执行’SHOW MASTER STATUS’, 获取server端的binlog列表
  • replication slave:通过BINLOG_DUMP协议获取binlog内容的权限
-- 授权语句
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO xxoo;

由于是伪装成slave来获取主的二进制事件,故无需对binlog有可读权限。

先切进python脚步文件(binlog2sql.py)所在目录

[root@dba binlog2sql-master]# cd binlog2sql
[root@dba binlog2sql]# ll
total 36
-rwxr-xr-x 1 root root  7747 Oct 12  2018 binlog2sql.py
-rwxr-xr-x 1 root root 11581 Oct 12  2018 binlog2sql_util.py
-rw-r--r-- 1 root root    92 Oct 12  2018 __init__.py

选项配置

解析出标准SQL

[root@dba binlog2sql]# python binlog2sql.py -h127.0.0.1 -P3306 -uroot -proot -dmdb -t t_student --start-file='mysql-bin.000011'
USE mdb;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `t_view` AS select * from heartbeat;
USE mdb;
create table test2 (id int,name text);
USE mdb;
DROP TABLE `test2` /* generated by server */;
USE db_test;
create table tblpky(id int primary key auto_increment,name text);
USE mdb;
create table t_student(id int,name varchar(18),class int,score varchar(18));
INSERT INTO `mdb`.`t_student`(`class`, `score`, `id`, `name`) VALUES (1, '66', 1, 'a'); #start 2418 end 2638 time 2023-02-23 02:22:10
INSERT INTO `mdb`.`t_student`(`class`, `score`, `id`, `name`) VALUES (1, '58', 2, 'b'); #start 2418 end 2638 time 2023-02-23 02:22:10
INSERT INTO `mdb`.`t_student`(`class`, `score`, `id`, `name`) VALUES (2, '86', 3, 'c'); #start 2418 end 2638 time 2023-02-23 02:22:10
INSERT INTO `mdb`.`t_student`(`class`, `score`, `id`, `name`) VALUES (2, '78', 4, 'd'); #start 2418 end 2638 time 2023-02-23 02:22:10
UPDATE `mdb`.`t_student` SET `class`=2, `score`='89', `id`=3, `name`='c' WHERE `class`=2 AND `score`='86' AND `id`=3 AND `name`='c' LIMIT 1; #start 2734 end 2927 time 2023-02-23 02:28:38
DELETE FROM `mdb`.`t_student` WHERE `class`=1 AND `score`='58' AND `id`=2 AND `name`='b' LIMIT 1; #start 3023 end 3201 time 2023-02-23 02:28:55
INSERT INTO `mdb`.`t_student`(`class`, `score`, `id`, `name`) VALUES (1, '48', 5, 'e'); #start 3297 end 3475 time 2023-02-23 02:29:32

参数选项

python binlog2sql.py --help解析模式:
--stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。
-K, --no-primary-key 对INSERT语句去除主键。可选。默认False
-B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。
--back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。解析范围控制:
--start-file 起始解析文件,只需文件名,无需全路径 。必须。
--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。
--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。
--start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
--stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。对象过滤:
-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。
-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。
--only-dml 只解析dml,忽略ddl。可选。默认False。
--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

案例:误UPDATE表数据回滚

忘带where条件的误UPDATE整张表

mysql> select * from t_student;
+------+------+-------+-------+
| id   | name | class | score |
+------+------+-------+-------+
|    1 | a    |     1 | 66    |
|    3 | c    |     2 | 89    |
|    4 | d    |     2 | 78    |
|    5 | e    |     1 | 48    |
+------+------+-------+-------+
4 rows in set (0.00 sec)mysql> update t_student set score='failure';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0mysql> select * from t_student;
+------+------+-------+---------+
| id   | name | class | score   |
+------+------+-------+---------+
|    1 | a    |     1 | failure |
|    3 | c    |     2 | failure |
|    4 | d    |     2 | failure |
|    5 | e    |     1 | failure |
+------+------+-------+---------+
4 rows in set (0.00 sec)

找到误操作记录的binlog文件

mysql> show master status\G
*************************** 1. row ***************************File: mysql-bin.000011Position: 3899Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 0ee6241a-f240-11ec-9388-080027be95b2:1-169719
1 row in set (0.00 sec)

根据误操作人提供的大致误操作时间过滤数据

[root@dba binlog2sql]# python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root' -dmdb -tt_student --start-file='mysql-bin.000011' --start-datetime='2023-02-23 02:36:17' --stop-datetime='2023-02-23 02:38:17'UPDATE `mdb`.`t_student` SET `class`=1, `score`='failure', `id`=1, `name`='a' WHERE `class`=1 AND `score`='66' AND `id`=1 AND `name`='a' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=2, `score`='failure', `id`=3, `name`='c' WHERE `class`=2 AND `score`='89' AND `id`=3 AND `name`='c' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=2, `score`='failure', `id`=4, `name`='d' WHERE `class`=2 AND `score`='78' AND `id`=4 AND `name`='d' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=1, `score`='failure', `id`=5, `name`='e' WHERE `class`=1 AND `score`='48' AND `id`=5 AND `name`='e' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27

可以知道误操作的位置点在3571-3868之间和时间点,再用flashback模式( -B )生成回滚sql,检查回滚sql是否正确

[root@dba binlog2sql]# python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root' -dmdb -tt_student --start-file='mysql-bin.000011' --start-datetime='2023-02-23 02:36:17' --stop-datetime='2023-02-23 02:38:17' -B > tb_student_rb.sql[root@dba binlog2sql]# cat tb_student_rb.sql UPDATE `mdb`.`t_student` SET `class`=1, `score`='48', `id`=5, `name`='e' WHERE `class`=1 AND `score`='failure' AND `id`=5 AND `name`='e' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=2, `score`='78', `id`=4, `name`='d' WHERE `class`=2 AND `score`='failure' AND `id`=4 AND `name`='d' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=2, `score`='89', `id`=3, `name`='c' WHERE `class`=2 AND `score`='failure' AND `id`=3 AND `name`='c' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27
UPDATE `mdb`.`t_student` SET `class`=1, `score`='66', `id`=1, `name`='a' WHERE `class`=1 AND `score`='failure' AND `id`=1 AND `name`='a' LIMIT 1; #start 3571 end 3868 time 2023-02-23 02:36:27

确认回滚sql语句无误并回滚。登录mysql确认,检查数据回滚成功。

mysql> select * from t_student;
+------+------+-------+---------+
| id   | name | class | score   |
+------+------+-------+---------+
|    1 | a    |     1 | failure |
|    3 | c    |     2 | failure |
|    4 | d    |     2 | failure |
|    5 | e    |     1 | failure |
+------+------+-------+---------+
4 rows in set (0.00 sec)mysql> source /root/binlog2sql-master/binlog2sql/tb_student_rb.sql
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from t_student;
+------+------+-------+-------+
| id   | name | class | score |
+------+------+-------+-------+
|    1 | a    |     1 | 66    |
|    3 | c    |     2 | 89    |
|    4 | d    |     2 | 78    |
|    5 | e    |     1 | 48    |
+------+------+-------+-------+
4 rows in set (0.00 sec)

binlog2sql VS mysqlbinlog

限制:

  • mysql server必须开启,离线模式下不能解析
    – 基于BINLOG_DUMP协议来获取binlog内容
    – 需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
  • 参数 binlog_row_image 必须为FULL,暂不支持MINIMAL
  • 解析速度不如mysqlbinlog

优点:

  • 纯Python开发,安装与使用都很简单
  • 自带flashback、no-primary-key解析模式,无需再装补丁
  • flashback模式下,更适合闪回实战
  • 解析为标准SQL,方便理解、筛选
  • 代码容易改造,可以支持更多个性化解析

参考链接:https://www.cnblogs.com/ivictor/p/6418409.html

相关文章:

借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能

借用binlog2sql工具轻松解析MySQL的binlog文件 简介依赖配置用户权限选项配置案例:误UPDATE表数据回滚binlog2sql VS mysqlbinlog 看腻文章了就来听听视频演示吧:https://www.bilibili.com/video/BV1Zj411k7VW/ 简介 binlog2sql是美团大众点评开源的一…...

一次解决Pytorch训练时损失和参数出现Nan或者inf的经历

目前在做实验,参考了一个新的网络架构之后发现训练时损失出现Nan,参数了出现了inf的情况,先说说我的排查经历。 首先肯定是打印损失,损失是最容易出现Nan的,有各种原因,网上也有很多解决办法,我…...

【python入门篇】列表简介及操作(2)

列表是什么? 列表是由一系列按特定顺序排列的元素组成。你可以创建包含字母表中的所有字母、数字 0~9 或所有家庭成员的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表指定一…...

数据结构与算法——19.红黑树

这篇文章我们来讲一下红黑树。 目录 1.概述 1.1红黑树的性质 2.红黑树的实现 3.总结 1.概述 首先,我们来大致了解一下什么是红黑树 红黑树是一种自平衡的二叉查找树,是一种高效的查找树。红黑树具有良好的效率,它可在 O(logN) 时间内完…...

js题解(三)

文章目录 柯里化模块乘法改变上下文 柯里化 已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件: 1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数) 2、调用 a 之后&a…...

CompletableFuture异步回调

CompletableFuture异步回调 CompletableFutureFuture模式CompletableFuture详解1.CompletableFuture的UML类关系2.CompletionStage接口3.使用runAsync和supplyAcync创建子任务4.设置子任务回调钩子5.调用handle()方法统一处理异常和结果6.线程池的使用 异步任务的串行执行thenA…...

Python中匹配模糊的字符串

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库,它允许我们在python中进行模糊字符串匹配。 此外,我们将学习如何使用process 模块,该模块允许我们在模糊…...

PHP图片文件管理功能系统源码

文件图库管理单PHP源码直接解压就能用,单文件,indexm.php文件可以重新命名,上传到需要访问的目录中, 可以查看目录以及各个文件,图片等和下载及修改管理服务。 源码下载:https://download.csdn.net/downloa…...

(枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G

Problem - G - Codeforces 题意: 思路: 首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,思考的方向一定是枚举 如果去…...

websocket逆向【python实现websocket拦截】

python实现websocket拦截 前言一、拦截的优缺点优点:缺点:二、实现方法1.环境配置2.代码三、总结前言 开发者工具F12,筛选ws后,websocket的消息是这样显示的,如何获取这里面的消息呢? 以下是本篇文章正文内容 一、拦截的优缺点 主要讲解一下websocket拦截的实现,现在…...

软件测试自动化的成本效益分析

随着软件测试技术的发展,人们已经从最初的手工测试转变为手工和自动化技术相结合的测试方法。目前,人们更多的是关心自动化测试框架、自动化测试工具以及脚本研究等技术方面,而在软件自动化测试方案的效益分析方面涉及较少。 软件测试的目的是…...

【Java】状态修饰符 final static

目录 final 修饰我们的成员方法、成员变量、类 示例代码: final 修饰的局部变量 示例代码: static 示例代码: static 访问特点: 示例代码: static关键字的用途 示例代码: static 修饰常量 示例…...

笔试编程ACM模式JS(V8)、JS(Node)框架、输入输出初始化处理、常用方法、技巧

目录 考试注意事项 先审完题意,再动手 在本地编辑器(有提示) 简单题515min 通过率0%,有额外log 常见输入处理 str-> num arr:line.split( ).map(val>Number(val)) 初始化数组 new Array(length).fill(v…...

learn掩码张量

目录 1、什么是掩码张量 2、掩码张量的作用 3、代码演示 (1)、定义一个上三角矩阵,k0或者 k默认为 0 (2)、k1 (3)、k-1 4、掩码张量代码实现 (1)、输出效果 &…...

激活函数介绍

介绍 神经网络当中的激活函数用来提升网络的非线性,以增强网络的表征能力。它有这样几个特点:有界,必须为非常数,单调递增且连续可求导。我们常用的有sigmoid或者tanh,但我们都知道这两个都存在一定的缺点&#xff0c…...

docker方式启动一个java项目-Nginx本地有代码,并配置反向代理

文章目录 案例导入说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启 2.导入SQL3.导入Demo工程3.1.分页查询商品(仔细看代码,很多新的MP编程技巧)3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id…...

前端和后端是Web开发选哪个好?

前端和后端是Web开发中的两个不同的领域,哪一种更适合学习?前景更广呢? 一、引言 Web前端开发就像装饰房间的小瓦匠,勤勤恳恳,仔仔细细,粉饰墙壁,妆点家具。会 HTML,CSS,懂点 JS。…...

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…...

idea配置文件属性提示消息解决方案

在项目文件路径下找到你没有属性提示消息的文件 选中,ok即可 如果遇到ok无法确认的情况: 在下图所示位置填写配置文件名称即可...

EdgeView 4 for Mac:重新定义您的图像查看体验

您是否厌倦了那些功能繁杂、操作复杂的图像查看器?您是否渴望一款简单、快速且高效的工具,以便更轻松地浏览和管理您的图像库?如果答案是肯定的,那么EdgeView 4 for Mac将是您的理想之选! EdgeView 4是一款专为Mac用户…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...