[MySQL]-数据库恢复工具之binlog2sql

[MySQL]-数据库恢复工具之binlog2sql

森格 | 2022年12月

本文主要介绍工具binlog的使用,它可以帮助我们快速解析出原始SQL、回滚SQL、去除主键的INSERT SQL等。


一、工具介绍

1.1 概述

我们可以去设想,当开发人员使用了delete语句误删除了某表的数据,这时候需要进行数据恢复,我们如何快速的去进行恢复呢?

这就要提到我们今天介绍的工具了 ,binlog2sql,一款基于python开发的开源工具,是由大众点评团队的DBA使用python开发出来的。其功能有:

  • 数据快速回滚(闪回)
  • 主从切换后新master丢失数据的恢复
  • 从binlog生成标准SQL,带来的衍生功能

1.2 工具安装

GitHub地址:https://github.com/danfengcao/binlog2sql

百度网盘下载(防止网络无法进入GitHub):

链接:https://pan.baidu.com/s/16tKMyZaYLcVUn9oDGhTkBA
提取码:u4n9

首先安装git及pip

yum -y install epel-release 
yum -y install git python-pip

安装binlog2sql

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

1.3 数据库要求

配置要求,开启以下参数

[mysqld]
server_id = xxx
logbin = mysql-bin.xxxxx
max_binlog_size = xx
binlog_format = row 
binlog_row_image = full

用户权限要求

# 至少要有一个用户有以下权限
select,replication slave,replication client
# 官方建议授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO xx;

三种权限说明

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

注:以上权限说明来自GitHub官方说明。

1.4 工具使用

语句格式

(安装目录的binlog2sql/的目录下执行)

python binlog2sql.py -h${host} -P${port} -u${username} -p${password} [parameter...]

参数介绍如下:

解析模式

–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。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

二、场景模拟


当前chart.users情况
在这里插入图片描述
delete语句删除数据
在这里插入图片描述

查看当前binlog文件
在这里插入图片描述

使用binlog2sql

python ./binlog2sql.py -h${host} -P${port} -u${username} -p${password} -dchart -tusers --start-file='mysql-bin.000001' --start-datetime='2022-12-16 17:20:00' --stop-datetime='2022-12-16 17:30:00'

正向解析如下

在这里插入图片描述
逆向解析如下

python ./binlog2sql.py -h${host} -P${port} -u${username} -p${password} -dchart -tusers --start-file='mysql-bin.000001' --start-datetime='2022-12-16 17:00:00' --stop-datetime='2022-12-16 17:10:00' -B

在这里插入图片描述

恢复完成如下

在这里插入图片描述

至此,我们已经对删除的数据的准确定位的还原,这种方法相对来说还是比较高效的。

三、总结


对于该工具在使用上面是比较简单的,在恢复速度上也是比较快速,而对于运维人员来说,不用再去跑到binlog中去查找删除的信息,掌握一款这样的工具在特定的恢复场景中还是十分有必要的。如果错误之处,欢迎各位大佬提出改正建议。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用MySQL JDBC驱动解析MySQL binlog,可以使用下面的步骤: 1.添加MySQL JDBC驱动:在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2.编写代码:使用JDBC连接到MySQL数据库,并获取binlog事件流。可以使用以下示例代码: ```java import java.io.IOException; import java.sql.*; import com.github.shyiko.mysql.binlog.BinaryLogClient; import com.github.shyiko.mysql.binlog.event.*; public class BinlogParser { public static void main(String[] args) throws IOException { BinaryLogClient client = new BinaryLogClient("localhost", 3306, "username", "password"); client.registerEventListener(event -> { EventData data = event.getData(); if (data instanceof WriteRowsEventData) { WriteRowsEventData writeRowsEventData = (WriteRowsEventData) data; System.out.println(writeRowsEventData.getRows()); } else if (data instanceof UpdateRowsEventData) { UpdateRowsEventData updateRowsEventData = (UpdateRowsEventData) data; System.out.println(updateRowsEventData.getRows()); } else if (data instanceof DeleteRowsEventData) { DeleteRowsEventData deleteRowsEventData = (DeleteRowsEventData) data; System.out.println(deleteRowsEventData.getRows()); } }); client.connect(); } } ``` 3.运行代码:启动应用程序并运行binlog事件监听器。这将输出所有写入、更新和删除事件的行数据。 以上就是使用MySQL JDBC驱动解析MySQL binlog的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森格的博

创作不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值