误删mysql某表数据,通过binlog2sql工具数据恢复
一次执行sql 没加事务的血案:
delete from base_menu;
insert into base_menu ***;
insert into base_menu ***;
insert into base_menu ***;
.....
1.导读
binlog2sql是大众点评开源的一款用于解析binlog的工具,在测试环境试用了下,还不错。
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据。此法费时费力,甚至需要停机维护,并不适合快速回滚。也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能。现在有不少好用而且效率又高的开源闪回工具如binlog2sql、mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练。
2.用途
binlog2sql的用途:
- 数据快速回滚(闪回)
- 主从切换后数据不一致的修复
- 从binlog生成标准SQL,带来的衍生功能
3.环境准备
安装binlog2sql前先安装git和pip:
yum -y install epel-release yum -y install git python-pip
4.安装binlog2sql:
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sqlpip install -r requirements.txt
5. mysql相关:
5.1 mysql 需要开启binlog;mysql8默认开启
5.2 操作用户需要一下权限
SELECT, REPLICATION SLAVE, REPLICATION CLIENT
权限说明:
- select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
- super/replication client:两个权限都可以,需要执行’SHOW MASTER STATUS’, 获取server端的binlog列表
- replication slave:通过BINLOG_DUMP协议获取binlog内容的权限
6. 参数说明
binlog2sql的使用参数说明:
mysql连接配置
-h host; -P port; -u user; -p password
解析模式
–stop-never 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。
-K, --no-primary-key 对INSERT语句去除主键。可选。
-B, --flashback 生成回滚语句,可解析大文件,不受内存限制,每打印一千行加一句SLEEP SELECT(1)。可选。与stop-never或no-primary-key不能同时添加。
解析范围控制
–start-file 起始解析文件。必须。
–start-position/–start-pos start-file的起始解析位置。可选。默认为start-file的起始位置。
–stop-file/–end-file 末尾解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
–stop-position/–end-pos stop-file的末尾解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。
–start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime,如’2016-11-11 11:11:11’。可选。默认不过滤。
–stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime,如’2016-11-11 11:11:11’。可选。默认不过滤。
对象过滤
-d, --databases 只输出目标db的sql。可选。默认为空。
-t, --tables 只输出目标tables的sql。可选。默认为空。
7. 实战
下面我们使用binlog2sql进行格式为ROW的binlog生成hsp-base库base_menu表的标准SQL
7.1 正向sql:
[root@hch binlog2sql]# python /root/binlog2sql/binlog2sql/binlog2sql.py -h 172.***.205 -u root -p 123456 -d hps-base -t base_menu --start-file binlog.000004 --start-datetime '2025-10-14 15:00:00' --stop-datetime '2025-10-14 15:25:00' > /root/application/a.txt
7.2 反向sql:–flashback:生成回滚sql
python /root/binlog2sql/binlog2sql/binlog2sql.py -h 172.***.205 -u root -p 123456 -d hps-base -t base_menu --start-file binlog.000004 --flashback --start-datetime '2025-10-14 15:00:00' --stop-datetime '2025-10-14 15:25:00' > /root/application/a_bak.txt
7.2 执行sql进行恢复
1.下载文件a_bak.txt
2.确认找到 需要恢复的sql,注意这里是回滚sql,拿到可以直接执行的
3.通过平时用的sql工具进行sql恢复