森格 | 2022年12月
本文主要介绍工具binlog的使用,它可以帮助我们快速解析出原始SQL、回滚SQL、去除主键的INSERT SQL等。
我们可以去设想,当开发人员使用了delete语句误删除了某表的数据,这时候需要进行数据恢复,我们如何快速的去进行恢复呢?
这就要提到我们今天介绍的工具了 ,binlog2sql,一款基于python开发的开源工具,是由大众点评团队的DBA使用python开发出来的。其功能有:
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
配置要求,开启以下参数
[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;
三种权限说明
注:以上权限说明来自GitHub官方说明。
语句格式
(安装目录的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。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。
使用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中去查找删除的信息,掌握一款这样的工具在特定的恢复场景中还是十分有必要的。如果错误之处,欢迎各位大佬提出改正建议。