开源数据闪回工具—binlog2sql介绍
一、binlog2sql介绍
binlog2sql是国内MySQL大佬danfengcao使用python开发,许多MySQL爱好者参与改进的一款MySQL binlog解析软件。根据不同选项,可以得到原始SQL、回滚SQL、去除主键的SQL等。
github地址为:https://github.com/danfengcao/binlog2sql
该工具主要用于:
- 数据快速回滚(闪回);
- 从binlog生成标准SQL;
适用MySQL版本:MySQL5.6 、MySQL5.7
二、安装binlog2sql
# 安装git
shell> yum install -y git
# 安装pip工具
shell> yum install -y epel-release
shell> yum install -y python-pip
# 安装binlog2sql
shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt
三、使用前提
基于最小侵入原则,我们一般在管理节点执行操作,只需把binlog2sql安装在管理节点机器即可。
要使用binlog2sql,MySQL服务器需要设置以下参数:
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
四、使用方式
需要创建一个用户并授权
用户:binlog2sql
管理节点IP:192.168.1.1
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'binlog2sql'@'192.168.1.1' identified by 'xxxxx';
例如:
python binlog2sql.py -h ip -ubinlog2sql -pxxxx -P3306 -d db -t t1 t2 --sql-type='delete' --start-file='mysql-bin.000104' --start-datetime='2020-07-16 16:46:57' --stop-datetime='2020-07-16 17:00:29' -B > rollback.sql
五、参数说明:
[root@localhost binlog2sql]# python binlog2sql.py --help
usage: binlog2sql.py [-h HOST] [-u USER] [-p [PASSWORD [PASSWORD ...]]]
[-P PORT] [--start-file START_FILE]
[--start-position START_POS] [--stop-file END_FILE]
[--stop-position END_POS] [--start-datetime START_TIME]
[--stop-datetime STOP_TIME] [--stop-never] [--help]
[-d [DATABASES [DATABASES ...]]]
[-t [TABLES [TABLES ...]]] [--only-dml]
[--sql-type [SQL_TYPE [SQL_TYPE ...]]] [-K] [-B]
[--back-interval BACK_INTERVAL]
MySQL链接配置参数
-h host; –p password; –u user ; -P port
解析模式参数:
--stop-never : 持续解析binlog,同步至执行命令时最新的binlog位置,默认false。
-K , --no-primary-key :对insert语句去除主键,默认false。
-B , --flashback : 生成回滚SQL,可解析大文件,不受内存限制,默认false。与stop-never或no-primary-key不能同时添加。
--back-interval :在-B模式下,每打印1000条回滚SQL,SLEEP多少秒,默认为1。
范围控制参数:
--start-file :起始解析文件,只需文件名,无需全路径。必需参数。
--stop-file / --end-file : 终止解析文件,默认为start-file同一个文件,若解析模式为stop-never,则该参数失效。
--start-position / --start-pos : 起始解析位置,默认start-file文件起始位置。
--stop-position / --stop-pos : 终止解析位置,默认stop-file终点位置。
--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 : 只解析目标表的sql,多张表用空格隔开,如:-t table1 table2。
--only-dml :只解析DML,忽略DDL。
--sql-type : 只解析指定类型,支持INSERT,UPDATE,DELETE。多个类型用空格隔开,如--sql-type INSERT UPDATE,默认全解析。
六、案例
经常有研发上线没经过测试,或者测试不规范,造成线上多余数据被误删除或更改,如下是一个典型案例:
如果没有备份,只能通过解析binlog恢复,另外如果binlog还不是row模式,那估计真的要丢失了。
如果没有工具,只能通的mysqlbinlog命令,解析出来的结果中含有大量无关的信息,只有当时操作的记录,还需要反向拼接,对排查的增加了难度。
市面上也有一些其他开源工具,原理都差不多,但使用效率上binlog2sql更胜一筹,通过binlog2sql可以很容易搞定:
python binlog2sql.py
-h ip #指定目标ip,建议从库
-u binlog2sql #指定数据库用户
-p xxxx #指定密码
-P 3306 #指定数据库端口
-d db #指定库名
-t t1 t2 #需要恢复的表,多个用空格分隔
--sql-type='delete' #需要恢复的类型
--start-file='mysql-bin.000104' #指定binlog文件
--start-datetime='2020-07-16 16:46:57' #开始时间
--stop-datetime='2020-07-16 17:00:29' #结束时间
-B #生成反向拼接sql
> rollback.sql #追加到文件
拿到sql文件后不要直接恢复,一定让研发确认下没问题后在恢复,恢复前对数据进行下备份。养成备份的好习惯,千万不要偷懒。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 还在从零开始搭建项目?手撸了款快速开发脚手架!
- Node.js 中的 require 是如何工作的?
- Ajax请求携带Cookie
- 关于kubernetes垃圾回收那点事
- 强化学习笔记11:工程师看强化学习
- 强化学习笔记10:经典游戏示例 classic games
- RL实践3——为Agent添加Policy、记忆功能
- 强化学习仿真环境搭建入门Getting Started with OpenAI gym
- 数据分析与数据挖掘 - 04科学计算
- SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值
- JavaScript 启动性能瓶颈分析与解决方案
- 大白话理解Vuex
- 【Java面试总结】计算机网络
- volatile关键字 Krains 2020-08-26
- synchronized关键字 Krains 2020-08-25