binlog2sql的安装及使用
binlog2sql是大众点评开源的一款用于解析binlog的工具,在测试环境试用了下,还不错。
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据。此法费时费力,甚至需要停机维护,并不适合快速回滚。也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能。现在有不少好用而且效率又高的开源闪回工具如binlog2sql、mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练。
binlog2sql的用途:
- 数据快速回滚(闪回)
- 主从切换后数据不一致的修复
- 从binlog生成标准SQL,带来的衍生功能
安装binlog2sql前先安装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
MySQL的配置要开启以下选项:
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
要授权一个用户有以下权限:
SELECT, REPLICATION SLAVE, REPLICATION CLIENT
权限说明:
- select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
- super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表
- replication slave:通过BINLOG_DUMP协议获取binlog内容的权限
内网环境如何使用该工具呢?
该工具的使用依赖以下三个包:
PyMySQL==0.7.8
wheel==0.24.0
mysql-replication==0.9
其中,每个包又会依赖其它包,所以安装这些包是一个比较麻烦的事情。
如果是在外网的环境下,可直接通过pip install安装,它会自动下载并安装依赖包的。
在内网环境下,可手动安装这些包,目前,这些包已下载打包,并上传到百度云盘中,大家可自行下载。
http://pan.baidu.com/s/1qYQ2PPy
安装教程:
# tar xvf binlog2sql.tar.gz
# cd binlog2sql/binlog2sql_dependencies/
# tar xvf setuptools-0.6c11.tar.gz
# cd setuptools-0.6c11
# python setup.py install
# cd ..
# tar xvf pip-9.0.1.tar.gz
# cd pip-9.0.1
# python setup.py install
# cd ..
# pip install *.whl mysql-replication-0.9.tar.gz
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop
support for Python 2.6Processing ./mysql-replication-0.9.tar.gz
Processing ./argparse-1.4.0-py2.py3-none-any.whl
Processing ./linecache2-1.0.0-py2.py3-none-any.whl
Requirement already satisfied: PyMySQL==0.7.8 from file:///root/binlog2sql/binlog2sql_dependencies/PyMySQL-0.7.8-py2-none-any.whl in
/usr/lib/python2.6/site-packagesProcessing ./six-1.10.0-py2.py3-none-any.whl
Processing ./traceback2-1.4.0-py2.py3-none-any.whl
Processing ./unittest2-1.1.0-py2.py3-none-any.whl
Processing ./wheel-0.24.0-py2.py3-none-any.whl
Installing collected packages: argparse, linecache2, six, traceback2, unittest2, wheel, mysql-replication
Running setup.py install for mysql-replication ... done
Successfully installed argparse-1.4.0 linecache2-1.0.0 mysql-replication-0.9 six-1.10.0 traceback2-1.4.0 unittest2-1.1.0 wheel-0.24.0
至此,所有依赖包安装完毕。
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。可选。默认为空。
root@localhost:mysql3306.sock [hch]>select * from hch;
+----+-------+
| id | cname |
+----+-------+
| | hch |
| | tom |
| | jerry |
+----+-------+
rows in set (0.00 sec)
# 删除表里的数据
root@localhost:mysql3306.sock [hch]>delete from hch;
Query OK, rows affected (0.12 sec) root@localhost:mysql3306.sock [hch]>select * from hch;
Empty set (0.00 sec)
# 查看binlog位置
root@localhost:mysql3306.sock [hch]>show master status;
+------------------+----------+--------------+------------------+--------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+--------------------------------------------+
| mysql-bin. | | | | 7c91060d--11e8-a036-000c2930f871:- |
+------------------+----------+--------------+------------------+--------------------------------------------+
row in set (0.00 sec)
下面我们使用binlog2sql进行格式为ROW的binlog生成hch库hch表的标准SQL
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 > 1.sql
[root@hch binlog2sql]# cat 1.sql
USE hch;
create table hch(id int not null auto_increment, cname varchar(32), primary key(id));
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 480 end 643 time 2018-03-04 17:59:25
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 739 end 902 time 2018-03-04 17:59:29
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 998 end 1163 time 2018-03-04 17:59:34
DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`=1 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`=2 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`=3 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
我们可以看到,刚刚执行过的sql都生成出来了。
我们现在对hch这个库的所有操作生成反向SQL,这个时候需要在上面语句的基础上带一个-B参数,就是flashback闪回的意思:
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin. -B
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', ); #start end time -- ::
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', ); #start end time -- ::
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', ); #start end time -- ::
DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`= LIMIT ; #start end time -- ::
DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`= LIMIT ; #start end time -- ::
DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`= LIMIT ; #start end time -- ::
可以看到生成了跟上面标准SQL相反的SQL了,通过这些反向SQL可以进行误操的数据恢复。
比如我们想恢复delete命令之前的数据。
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin. --start-pos= --stop-pos= -B > roll_1.sql
[root@hch binlog2sql]# cat roll_1.sql
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', ); #start end time -- ::
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', ); #start end time -- ::
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', ); #start end time -- ::57
[root@hch binlog2sql]# mysql -uroot -pmysql123 <roll_1.sql
查看数据已经恢复
root@localhost:mysql3306.sock [hch]>select * from hch;
+----+-------+
| id | cname |
+----+-------+
| | hch |
| | tom |
| | jerry |
+----+-------+
rows in set (0.00 sec)
参考
binlog2sql之MySQL数据闪回实践 - GoogSQL - 博客园
https://www.cnblogs.com/xuanzhi201111/p/6602489.html
binlog2sql使用总结 - iVictor - 博客园
http://www.cnblogs.com/ivictor/p/6418409.html
送给mysql dba们一颗速效救心丸,闪回之binlog2sql - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412654
原创工具binlog2sql:从MySQL binlog得到你要的SQL - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412895
MySQL误操作后如何快速恢复数据 - arun_yh - 博客园
http://www.cnblogs.com/itcomputer/articles/6184454.html
binlog2sql的安装及使用的更多相关文章
- 【MySQL】binlog2sql
binlog2sql 1.安装 shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlo ...
- 一次基于innobackupex备份及binlog的单表恢复操作
[环境介绍] 系统环境:Red Hat Enterprise Linux Server release 7.0 (Maipo) + Server version: 5.7.18-log MySQL C ...
- mysql误操作后通过binlog恢复,同时解决tmp目录满的问题
注意: 本文的恢复,并不是基于恢复某个时间点的全量备份后的增量恢复,而是指在现有数据库基础上基于binlog的恢复.适用于较小的数据误操作. 提取日志文件为sql语句: /usr-ext/local/ ...
- binlog2sql安装
3.pip安装 3.1 首先安装setuptools软件包: (1)下载setuptools包 wget https://pypi.python.org/packages/source/s/setup ...
- Binlog2sql+CentOS7 离线安装
Binlog2sql+CentOS7 离线安装 目录 Binlog2sql+CentOS7 离线安装 1. 环境 2. 下载 3.1 Pip 安装 3.2 PyMySQL/mysql-replicat ...
- binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能.原理不难理解,基于MySQL的 ...
- binlog2sql之MySQL数据闪回实践
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...
- Mysql 之闪回技术 binlog2sql
1.下载 https://github.com/danfengcao/binlog2sql http://rpmfind.net Search: python-pip pip 是一个Python包管理 ...
- 使用binlog2sql针对mysql进行数据恢复
MySQL闪回原理与实战 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法 ...
随机推荐
- 以webService为客户端获取List泛型结果集
首先搭建好webService,添加XFire1.2Core Libraries 和XFire1.2HTTP Client Libraries,连接上数据库,下例以oracle为数据库. 连接Oral ...
- 80C51存储器与C51内存优化
80C51在物理结构上有四个存储空间:片内程序存储器.片外程序存储器.片内数据存储器和片外数据存储器.但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地 ...
- CF 1070J Streets and Avenues in Berhattan
DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了... 题意是把一堆字母分别分配到行和列. 分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和" ...
- Cat VS Dog HDU - 3829 (最大独立集 )
Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...
- NOIP2018初赛提高组复习提纲(By HGOI LJC)
Download:https://pan.baidu.com/s/16khhFf_0RsUjJLETreb20w (PDF) https://pan.baidu.com/s/1BVZqLs3q1clZ ...
- luogu2375 动物园 (kmp)
首先求出fail数组,如果没有不重叠的限制的话,我们可以在求fail的时候递推出个数cnt[i]=cnt[fail[i]]+1(这个cnt是算上自己本身==自己本身的) 然后如果是要求不重叠的话,就是 ...
- 4.Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)
搜狗输入法安装可以参考这个:http://www.cnblogs.com/dunitian/p/6662374.html 1.kali默认是没有中午输入法的,需要自己安装一下 2.首先我们先获取roo ...
- linux c 编程 ------ 串口编程
http://blog.csdn.net/specialshoot/article/details/50707965 对于串口的打开操作,必须使用O_NOCTTY参数.O_NOCTTY如果路径名指向终 ...
- 鸟哥的Linux私房菜——第十三章:Vim编译器
视频链接: 土豆: B站:http://www.bilibili.com/video/av9891085/ 本章的细节还是挺多的,可是我懒啊~~
- Spark记录-Scala数组/List/Map/Set
import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...