[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情况
[MySQL]-数据库恢复工具之binlog2sql_第1张图片
delete语句删除数据
[MySQL]-数据库恢复工具之binlog2sql_第2张图片

查看当前binlog文件
[MySQL]-数据库恢复工具之binlog2sql_第3张图片

使用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

在这里插入图片描述

恢复完成如下

[MySQL]-数据库恢复工具之binlog2sql_第4张图片

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

三、总结


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

你可能感兴趣的:(MySQL,数据库,python,开发语言,mysql,binlog)