Analysisbinlog 分析及回滚操作介绍

Analysisbinlog是我在学习binlog event结构及存储的时候,为了更深入理解写的一个对binlog的分析工具,基于python2.7开发,相较于mysqlbinlog工具显示简化很多,可以分析可以对row数据生成回滚语句,可定位组合有下面几个:

Thread_id

Position范围

时间范围

GTID

Position 范围 + thread_id/gtid

时间范围 + thread_id/gtid

显示效果如图:

精简了对我们没多大用的数据,只显示执行语句、GTID、POSITION、thread_id、库表名及对应行数据等记录,如一个事务修改多条记录,那么这几条变更的记录都会在GTID和XID中间显示,行数据内容顺序和字段顺序相对应

我们DBA在工作中有可能会遇到应用发布时出错需要回滚数据或者眼花错删数据这种奇葩情况,这工具也可以对binlog生成回滚语句,打印出的sql语句相对binlog是倒叙的,再也不用怕事务顺序影响回滚了(哈哈....),生成回滚语句的方式也有几个可供选择:

全文件生成回滚语句(需要回滚全文件的可以直接删库跑路了)

Position范围

GTID

Position 范围 + GTID/thread_id

显示效果如图:

生成的回滚语句上分会有对应的GTID号,可以利用它对生成的语句进行校验,我对update_rows_event和insert_rows_event数据的表结构做了判断,如果有primary key字段就使用primary key字段作为where条件,减少了数据内容。

下载地址:https://github.com/wwwbjqcom/scripts.git

使用帮助:

下载到本地后在scripts文件夹里有个Analysisbinlog.py的文件,先安装python的MySQLdb模块,生成回滚语句需要获取表结构时要用到,先添加可执行权限

> chmod +x Analysisbinlog.py

> ./Analysisbinlog.py -h  #显示所有参数项,如下图

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001  #只添加文件参数将分析binlog整个文件内容

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001 --start-position 2221 --stop-position 2786   #打印某个position范围内的内容

其余参数组合可以自己测试,如果positon和datetime范围都有指定,优先position范围分析

由于生成回滚语句需要提取表结构,所以必须提供连接数据库的参数项

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001 -r --user ‘root‘ --passwd ‘root‘ --host ‘localhost‘ --port 3306

-r : 打开回滚模式

后面的--user、--passwd、--host、--port都是必须项,下图我操作的是对position范围生成回滚语句

该工具我没有对set、bit两个字段类型做分析,因为我觉得这两个字段使用的几率很小,如果有需求的话可以联系做添加,如果自己能添加最好,可以深入的对binlog及数据存储做了解,可以参考一下我之前发的<binlog详细解读>,还有一点我在取结构时没有取enum字段的值,所以有该字段类型的回滚语句会有问题,binlog中是存储的索引值,并不是enum设置的值,这个需注意,在使用该工具的时候推荐使用position范围做组合,可以提升定位效率

ps: mysql技术交流qq群479472450,我个人公众号也会发一些研究整理的文章,多多关注



时间: 2024-10-13 08:54:56

Analysisbinlog 分析及回滚操作介绍的相关文章

Git撤销&amp;回滚操作

开发过程中,你肯定会遇到这样的场景: 场景一: 糟了,我刚把不想要的代码,commit到本地仓库中了,但是还没有做push操作! 场景二: 彻底完了,刚线上更新的代码出现问题了,需要还原这次提交的代码! 场景三: 刚才我发现之前的某次提交太愚蠢了,现在想要干掉它! 撤销 上述场景一,在未进行git push前的所有操作,都是在"本地仓库"中执行的.我们暂且将"本地仓库"的代码还原操作叫做"撤销"! 情况一:文件被修改了,但未执行git add操作

jenkins实现生产环境部署文件的回滚操作

由于dotnet项目的生产环境环境部署工具比较少,所以我使用jenkins作为生产环境的自动化部署工具. 既然有回滚操作,那么就会有部署操作:要实现回滚,先要实现部署的操作,我在jenkins搭建了一键从测试环境发布到正式环境的工具,部署的大致思路如下(详细的操作点这里,有详细节点配置和部署配置): 前提:安装jenkins的环境为master,每一个生产环境为slave,slave是实时连接到master的. 1.测试环境上使用了CCNET进行每次的代码变更编译部署,在测试环境上进行编译的版本

K8S的名称空间创建&amp;&amp;版本的升级、回滚操作(回滚到指定版本)

创建一个私有仓库. #运行一个registry容器 [[email protected] ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest #在所有需要使用私有仓库的的节点上进行以下配置: [[email protected] ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H un

SQL的事务回滚操作带案例分析

SET XACT_ABORT on BEGIN TRAN INSERT INTO [PDA_Action] VALUES ('采购入库1') INSERT INTO [PDA_Action] VALUES ('采购入库2') SELECT 1/0  /* 除数为0错误 */ INSERT INTO [PDA_Action] VALUES ('采购入库3') INSERT INTO [PDA_Action] VALUES ('采购入库4') COMMIT TRAN 对于有select的语句的回滚,

C#代码启用事务锁Transaction进行一系列提交回滚操作

一.前言 因为很多人一般进行一系列相关数据库操作都是在存储过程里面,而且在存储过程用锁的写法也是很简单的,在这篇文章主要介绍一下C#后台代码用锁进行一系列事务操作,我建立一个简单的winform程序,然后做一个事务:修改指定ID的用户信息,然后新增一名用户信息,操作成功就提交事务,程序异常和数据库执行不成功都必须回滚事务! 二.存储过程的事务 写得比较简单,我想大家都知道怎么使用了,不懂的可以问我. 三.C#代码的事务 1.封装一个事务类,里面有事务的创建.提交事务.回滚事务和销毁事务的方法 p

git回滚操作

git log查找历史记录 注意: 使用前7位数字 git reset --hard commit_id 回滚至commit_id对应的代码 从回滚状态拉取最新的代码 git pull

sourceTree回滚操作

1.点击log的回滚提交 会回滚选中的记录(本地和git上都会回滚) 见下图 2.重置到当前分支:目前研究出来的结果为修改的是本地的分支,回滚完成后点击拉取等于没有回滚(git远程没有回滚),该方法适用于没有本地回滚即没有提交到远程服务器的回滚 见下图

不小心merge后的回滚操作

虽然有四个方法,但我们项目中使用方法一和二比较合适,不会产生新的commit,并且简单粗暴 方法一,新分支覆盖 ①首先两步保证当前工作区是干净的,并且和远程分支代码一致方法一,删除远程分支再提交 $ git co currentBranch $ git pull origin currentBranch $ git co ./ ②备份当前分支(如有必要) $ git branch currentBranchBackUp ③恢复到指定的commit hash $ git reset --hard

manjaro系统的回滚操作

作为linux系统的爱好者,自从使用linux后,就喜欢追求新的软件,连系统都换成了滚动升级的版本.manjaro基于arch linux,同时也是kde的支持系统,升级非常频繁.使用了几年,很少碰到升级系统刮掉的情形,但是这次升级后出现了: [developDss nication]# pacman -Syyu:: 正在同步软件包数据库... core 151.7 KiB 353 KiB/s 00:00 [########################] 100% extra 1782.6