binlogAL(binlog analysis)

利用自己学习rust语言的时间,重构了以前python写的部分工具。

功能

  1. 可直接命令行执行sql语句
  2. 可以对binlog进行解析、过滤 、统计
  3. 可以反转binlog为回滚日志
  4. 可以提取binlog数据为sql语句

使用方法

可以使用--help查看所有参数选项, 在release下可获取linux的可执行文件,也可直接下载源码自行编译

必配项:

user: 连接mysql的用户名
password: mysql密码
host: mysql地址端口
runtype: 设置工具模式,必须选一个进行设置 所有数据分析都会利用到表结构,所以必须连接到对应数据库才能运行

replication模式(--runtype=repl):

gtid: 利用gtid进行注册拉取binlog, gtid优先级高于position配置
binlogfile: 通过postion同步注册使用的binlog文件
position: position位置信息
threadid: 想提取某个线程id产生的数据时,配置该选项
greptbl: 提取某个表或者某些表产生的数据,格式见--help
getsql: 提取为sql语句
statiac: 统计每个事务大小
直接从mysql拉取binlog只支持对库表信息、连接id信息进行提取,下面可以看到用gtid进行注册的使用方法

mm:debug xxxxx$ ./mytest -uroot -proot -h 127.0.0.1:3306 --runtype repl --gtid '1886928a-ce21-11e9-bee2-50edb3ba887e:1-11' RotateLog { binlog_file: "bin.000001" }  
GtidEvent     gtid:1886928a-ce21-11e9-bee2-50edb3ba887e, gno_id:12, last_committed:2818, sequence_number:3072  
QueryEvent    thread_id:1511, database:xz_test, command:BEGIN  
TableMap      database_name:xz_test, table_name:t8  
ROW_VALUE  
 id: 1, id1: 3, a: b, b: 2, c: 0x36333633,XidEvent      xid:3089  
GtidEvent     gtid:1886928a-ce21-11e9-bee2-50edb3ba887e, gno_id:13, last_committed:3074, sequence_number:3328  
QueryEvent    thread_id:1519, database:xz_test, command:BEGIN  
TableMap      database_name:xz_test, table_name:t8  
ROW_VALUE  
 id: 1, id1: 4, a: bb, b: 2, c: 0x36333634,
XidEvent      xid:3114  
GtidEvent     gtid:1886928a-ce21-11e9-bee2-50edb3ba887e, gno_id:14, last_committed:3330, sequence_number:3584  
QueryEvent    thread_id:1511, database:xz_test, command:BEGIN  
TableMap      database_name:xz_test, table_name:t6  
ROW_VALUE  
 id: 1, a: a, b: 2, c: 1, d: 0x3742,e: abc, 
XidEvent      xid:3116  
mm:debug xxxxx$ ./mytest -uroot -proot -h 127.0.0.1:3306 --runtype repl --gtid '1886928a-ce21-11e9-bee2-50edb3ba887e:1-11' --threadid 1511 --greptbl '{"xz_test":["t8"]}' --getsql  
-- GTID: 1886928a-ce21-11e9-bee2-50edb3ba887e:12  
use xz_test;  
BEGIN;  
-- Insert Row Value  
INSERT INTO xz_test.t8(id,id1,a,b,c) VALUES(1,3,'b',2,0x36333633);  
COMMIT;

读取binlog文件(--runtype=file):

file: 指定binlog文件
startposition: 从那个postion开始读取
stopposition: 停止位置
startdatetime: 提取时间范围的binlog时,开始时间
stopdatetime: 停止时间
getsql: 提取为sql语句
threadid: 提取某个线程id产生的数据
greptbl: 提取某些表产生的数据
gtid: 在该模式下配置gtid,则为提取对于gtid的数据
statiac: 统计每个事务大小
配置项可以多种搭配方式,比如我想统计某个positon范围中某个thread_id产生的某个表的信息

mm:debug xxxxx$ ./mytest -uroot -proot -h 127.0.0.1:3306 --runtype file --file 'bin.000001' --startposition 3636 --threadid 1511 --greptbl '{"xz_test":"all"}'  
从binlog文件提取数据  
GtidEvent     gtid:1886928a-ce21-11e9-bee2-50edb3ba887e, gno_id:12, last_committed:2818, sequence_number:3072  
QueryEvent    thread_id:1511, database:xz_test, command:BEGIN  
TableMap      database_name:xz_test, table_name:t8  
ROW_VALUE  
 id: 1, id1: 3, a: b, b: 2, c: 0x36333633,
XidEvent      xid:3089  
GtidEvent     gtid:1886928a-ce21-11e9-bee2-50edb3ba887e, gno_id:14, last_committed:3330, sequence_number:3584  
QueryEvent    thread_id:1511, database:xz_test, command:BEGIN  
TableMap      database_name:xz_test, table_name:t6  
ROW_VALUE  
 id: 1, a: a, b: 2, c: 1, d: 0x3742,e: abc, 
XidEvent      xid:3116

回滚:

1、只能从binlog文件获取
2、默认以1G做为单个文件最大值,可以通过配置项自行修改
3、事务顺序倒叙生成
4、可直接使用mysqlbinlog进行操作恢复也可以直接用工具提取sql恢复
5、提取配置参数同读取binlog文件方式,全部通用
6、支持8.0及以下版本

回滚使用方法:

参数可以同文件读取一样任意搭配,比如我想把上面文件读取打印的binlog进行回滚只需要加个--rollback就行, 执行完成会在当前目录产生以rollback开头的日志文件

mm:debug xxxxx$ ./mytest -uroot -proot -h 127.0.0.1:3306 --runtype file --file 'bin.000001' --startposition 3636 --threadid 1511 --greptbl '{"xz_test":"all"}' --rollback  
从binlog文件提取数据  
failed to fill whole buffer  
mm:debug xxxxx$ ./mytest -uroot -proot -h 127.0.0.1:3306 --runtype file --file 'rollback-1.log' --getsql 
从binlog文件提取数据  
-- GTID: 1886928a-ce21-11e9-bee2-50edb3ba887e:14  
use xz_test;  
BEGIN;  
-- Insert Row Value  
INSERT INTO xz_test.t6(id,a,b,c,d,e) VALUES(1,'a',2,1,0x3742,'abc');  
COMMIT;  
-- GTID: 1886928a-ce21-11e9-bee2-50edb3ba887e:12  
use xz_test;  
BEGIN;  
-- Delete Row Value  
DELETE FROM xz_test.t8  WHERE id=1 AND id1=3;  
COMMIT;

可以看到已经把数据反转为对应的回滚语句, 可以直接使用mysqlbinlog进行操作,也可以直复制提取的sql进行执行,如果使用mysqlbinlog操作方式如下

bin/mysqlbinlog rollback-1.log --skip-gtids | bin/mysql -uroot -proot -h 127.0.0.1

语句执行(--runtype=command):

连接mysql未使用开源框架,是直接通过socket连接实现mysql协议的,所以这里弄了一个语句执行的模式来验证,通过-c参数直接指定sql语句, 可以使用-D进行默认库指定,如果不指定则在sql中需要写明

./mytest -uroot -proot -h 127.0.0.1:3306 --runtype command -D information_schema -c 'select * from tables'