mysql 5.7 binlog回滚_GitHub - percyzhang/binlog_rollback: mysql binlog rollback | flashback | redo | d...

binlog_rollback是一个用于MySQL 5.7的工具,能实现基于row格式binlog的回滚和闪回功能,帮助快速恢复误操作数据,同时支持解释binlog生成SQL、统计分析等功能。它适用于不停机恢复、故障排查和性能监控,支持多种过滤条件、输出格式和MySQL/MariaDB版本。
摘要由CSDN通过智能技术生成

简介

binlog_rollback实现了基于row格式binlog的回滚闪回功能,让误删除或者误更新数据,可以不停机不使用备份而快速回滚误操作。

binlog_rollback也可以解释binlog(支持非row格式binlog)生成易读的SQL,让查找问题如什么时个某个表的某个字段的值被更新成了1,或者找出某个时间内某个表的所有删除操作等问题变得简单。

binlog_rollback可以按配置输出各个表的update/insert/delete统计报表, 也会输出大事务与长事务的分析, 应用是否干了坏事一目了然, 也会输出所有DDL。

binlog_rollback通过解释mysql/mariadb binlog/relaylog实现以下三大功能:

1)flashback/闪回/回滚, DML回滚到任意时间或者位置。

生成的文件名为rollback.xxx.sql或者db.tb.rollback.xxx.sql

生成的SQL形式如下

```sql

begin

DELETE FROM `danny`.`emp` WHERE `id`=1

# datetime=2017-10-23_00:14:28 database=danny table=emp binlog=mysql-bin.000012 startpos=417 stoppos=575

commit

```

2)前滚,把binlog/relaylog的DML解释成易读的SQL语句。

*支持非row格式的binlog, 默认不解释非row格式的DML, 需要指定参数-stsql

生成的文件名为forward.xxx.sql或者db.tb.forward.xxx.sql

生成的SQL形式如下

```sql

begin

# datetime=2017-10-23_00:14:28 database=danny table=emp binlog=mysql-bin.000012 startpos=417 stoppos=575

INSERT INTO `danny`.`emp` (`id`,`name`,`sr`,`icon`,`points`,`sa`,`sex`) VALUES (1,'张三1','华南理工大学&SCUT',X'89504e47',1.1,1.1,1)

commit

```

3)统计分析, 输出各个表的DML统计, 输出大事务与长事务, 输出所有的DDL

DML统计结果文件:binlog_stats.txt

大事务与长事务结果文件:big_long_trx.txt

DDL结果文件:ddl_info.txt

15ef2293128ede6c68c0676ae76b35d7.png

efdc8dacbe79488dfa9321dc0504ad74.png

8030556fedac60129e42cc22c8c3dac9.png

4) 输出row格式下的原始SQL(5.7)

结果文件名为original_sql.binlogxxx.sql

163a6f5f92266eec2db1cefff2d8189f.png

*以上功能均可指定任意的单库多库, 单表多表, 任意时间点, 任意binlog位置。

*支持mysql5.5及以上,也支持mariadb的binlog, 支持传统复制的binlog, 也支持GTID的binlog。

*支持直接指定文件路径的binlog, 也支持主从复制, binlog_rollback作为从库从主库拉binlog来过解释。

*也支持目标binlog中包含了DDL(增加与减少表字段, 变化表字位置)的场景。

限制

*使用回滚/闪回功能时,binlog格式必须为row,且binlog_row_image=full, 其它功能支持非row格式binlog

*只能回滚DML, 不能回滚DDL

*支持V4格式的binlog, V3格式的没测试过,测试与使用结果显示,mysql5.1,mysql5.5, mysql5.6与mysql5.7的binlog均支持

*支持指定-tl时区来解释binlog中time/datetime字段的内容。开始时间-sdt与结束时间-edt也会使用此指定的时区,

但注意此开始与结束时间针对的是binlog event header中保存的unix timestamp。结果中的额外的datetime时间信息都是binlog event header中的unix timestamp

*decimal字段使用float64来表示, 但不损失精度

*所有字符类型字段内容按golang的utf8(相当于mysql的utf8mb4)来表示

常用场景

1)数据被误操作, 需要把某几个表的数据不停机回滚到某个时间点

2)数据异常, 帮忙从binlog中找出这个表的某些数据是什么时间修改成某些值的

3)IO高TPS高, 帮忙查出那些表在频繁更新

4)需要把这个表从昨晚1点到3点的更新提供给开发查问题

5)帮忙找出某个时间点数据库是否有大事务或者长事务

特点

1)速度快。 解释512MB的binlog:

注意CPU的负载, 如果IO不是瓶颈, 会使用满几个核, 请按需调整线程数

1.1)生成回滚的SQL只需要1分26秒(6线程)

d4705f748705feadd745778cea1e0062.png

1.2)生成前滚的SQL只需要1分26秒(6线程)

9feb0c8a65ce144ccf41ab2ff16d2ac1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值