binlog2sql 恢复工具使用

一:使用binlog2sql 回滚工具的前提条件

1.mysql server必须开启,离线模式下不能解析(通过BINLOG_DUMP协议获取binlog内容,而不是直接解析离线的binlog日志文件,所以如果要解析的binlog文件已经被清除,则无法恢复,需要replication slave权限)
2.参数 binlog_format 必须设置为 row; binlog_row_image 必须为FULL,暂不支持MINIMAL
3.解析速度不如mysqlbinlog
4.解析用户最小权限需要为SELECT, REPLICATION SLAVE, REPLICATION CLIENT
5.目前测试Python 2.7, 3.4+ MySQL 5.6, 5.7, 8.0该工具都能使用(在polardb 上使用必须用高权限用户,并且当前实例开启binlog)

二:安装

1.安装依赖包
yum -y install gcc automake autoconf libtool make libffi-devel zlib-devel

2.安装 binlog2sql
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt

三:使用

1.通过大致时间区间正向解析出某时间段的操作

python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00' --stop-datetime='2016-12-13 20:30:00'
输出:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, '小李'); #start 317 end 487 time 2016-12-13 20:26:26
UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='小李' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 514 end 701 time 2016-12-13 20:27:07
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`='小赵' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05

##通过正向解析出来的binlog内容我们可以精确的定位到需要回滚的sql的 start_postion 和 stop_position,通过指定position得到真正的回滚语句
##NOTE1:如果是一个大事务,那么操作多少行,上面的解析就会输出多少行,但是对于该大事务的每行记录 start(事务start_position)不变,但是end(事务stop_position)是变化的,该end值取得是binlog中每个event 的end_log_pos。如下图,对于这样的大事务,者我们自己去分析该大事务的 start_position 和 stop_position,或者我们要找到最后一个delete语句的end值(最后一条语句的end值,取的是commit之前的第一个at 值,不能用于作为mysqlbinlog 解析位点解析binlog动作同步,否则binlog中会被自动加上rollback语句(因为没有解析到commit关键字,所以自动回滚))

 

2.输出回滚语句

python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'rootxxx' -dtest_shao -ttest1 --start-file='3306-bin.000015' --start-position=3981 --stop-position=4335 -B > rollback.sql

#-B 参数指定输出回滚语句,-d只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空,-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空

猜你喜欢

转载自blog.csdn.net/shaochenshuo/article/details/127490949