mysql闪回工具--binlog2sql实践
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内容的权限
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。可选。默认为空。
进行用户授权操作(这里只是举例子):
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashuser'@'127.0.0.1' identified by 'flash123';
Query OK, 0 rows affected (0.00 sec)
我们可以看看现在有的数据:
mysql> show global variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec) mysql>
mysql> show master status;
+---------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-binlog.000003 | 17724 | | | 8eacaa05-ef11-11e9-89cd-5254007d488a:1-56 |
+---------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from tb1;
mysql> select * from stu;
+----+----------+
| id | name |
+----+----------+
| 0 | lisi |
| 1 | lili |
| 2 | zhangsan |
+----+----------+
3 rows in set (0.00 sec)
mysql>
我们现在进行数据的DML操作:
mysql> insert into stu values(3, 'wangwu');
Query OK, 1 row affected (0.04 sec)
mysql> insert into stu values(4, 'zhaoliu');
Query OK, 1 row affected (0.03 sec)
mysql> insert into stu values(5, 'xiexun');
Query OK, 1 row affected (0.12 sec)
mysql> insert into stu values(6, 'beifang');
Query OK, 1 row affected (0.03 sec)
mysql> select * from stu;
+----+----------+
| id | name |
+----+----------+
| 0 | lisi |
| 1 | lili |
| 2 | zhangsan |
| 3 | wangwu |
| 4 | zhaoliu |
| 5 | xiexun |
| 6 | beifang |
+----+----------+
7 rows in set (0.00 sec)
mysql>
下面我们使用binlog2sql进行格式为ROW的binlog生成标准SQL,带个-d的参数指定库名:
[root@master ~]# cat test01.sql
USE test01;
INSERT INTO `test01`.`stu`(`id`, `name`) VALUES (3, 'wangwu'); #start 7253 end 7484 time 2019-10-16 09:46:14
INSERT INTO `test01`.`stu`(`id`, `name`) VALUES (4, 'zhaoliu'); #start 7580 end 7813 time 2019-10-16 09:46:28
INSERT INTO `test01`.`stu`(`id`, `name`) VALUES (5, 'xiexun'); #start 7909 end 8140 time 2019-10-16 09:46:41
INSERT INTO `test01`.`stu`(`id`, `name`) VALUES (6, 'beifang'); #start 8236 end 8469 time 2019-10-16 09:46:52
[root@master ~]#
我们可以看到,刚刚执行过的sql都生成出来了。
我们现在对test01这个库的所有操作生成反向SQL,这个时候需要在上面语句的基础上带一个-B参数,就是flashback闪回的意思:
[root@db_server_xuanzhi ~]#python binlog2sql.py -uflashuser -h127.0.0.1 -pflash123 -dxuanzhi --start-file='mysql-bin.000107' -B > rollback_xuanzhi.sql
[root@master ~]# python /tmp/binlog2sql/binlog2sql/binlog2sql.py -uglon -h192.168.7.141 -pglon123456 -dtest01 --start-file='mysql-binlog.000003' -B > rollback_test01.sql
[root@master ~]# cat rollback_test01.sql
DELETE FROM `test01`.`stu` WHERE `id`=6 AND `name`='beifang' LIMIT 1; #start 8236 end 8469 time 2019-10-16 09:46:52
DELETE FROM `test01`.`stu` WHERE `id`=5 AND `name`='xiexun' LIMIT 1; #start 7909 end 8140 time 2019-10-16 09:46:41
DELETE FROM `test01`.`stu` WHERE `id`=4 AND `name`='zhaoliu' LIMIT 1; #start 7580 end 7813 time 2019-10-16 09:46:28
DELETE FROM `test01`.`stu` WHERE `id`=3 AND `name`='wangwu' LIMIT 1; #start 7253 end 7484 time 2019-10-16 09:46:14
[root@master ~]#
可以看到生成了跟上面标准SQL相反的SQL了,通过这些反向SQL可以进行误操的数据恢复。
下面我们模拟对线上数据进行误操及恢复的过程:
模拟一:误操把一个表的某些重要记录删除了,进行恢复
我们把tb1的id>=3的数据删除:
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec) mysql> delete from tb1 where id >= 3;
Query OK, 2 rows affected (0.00 sec) mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
+----+------+
2 rows in set (0.00 sec) mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000109 | 329 | | | |
+------------------+----------+--------------+------------------+-------------------+
现在通过binlog2sql进行生成反向SQL,binlog2sql可以指定生成那个库的那个表的标准SQL或者反向SQL,带一个-t的选择:
[root@db_server_xuanzhi ~]# python binlog2sql.py -uflashuser -h127.0.0.1 -pflash123 -dxuanzhi -ttb1 --start-file='mysql-bin.000109' -B > rollback_tb1.sql
[root@db_server_xuanzhi ~]# cat rollback_tb1.sql
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (4, 'dd'); #start 4 end 298 time 2017-03-23 12:39:20
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (3, 'cc'); #start 4 end 298 time 2017-03-23 12:39:20
我们可以看刚刚对tb1进行误删的操作,都生成了反向的SQL语句也就是INSERT INTO,我们进行导入操作,看数据能否正常恢复
[root@db_server_xuanzhi ~]#mysql -uroot -p123456 <./rollback_tb1.sql
Warning: Using a password on the command line interface can be insecure.
[root@db_server_xuanzhi ~]#
登录查看一下数据:
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec) mysql>
可以看到数据可以正常的恢复。
模拟二:误操作把一个表的数据删除了,经常出现的就是delete没带where条件
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec) mysql> delete from tb1;
Query OK, 4 rows affected (0.00 sec) mysql> select * from tb1;
Empty set (0.00 sec) mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000110 | 345 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec) mysql>
我们用bin2log对这个表进行恢复:
[root@db_server_xuanzhi ~]# python binlog2sql.py -uflashuser -h127.0.0.1 -pflash123 -dxuanzhi -ttb1 --start-file='mysql-bin.000110' -B > rollback_tb1.sql
[root@db_server_xuanzhi ~]# cat rollback_tb1.sql
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (4, 'dd'); #start 4 end 314 time 2017-03-23 13:37:29
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (3, 'cc'); #start 4 end 314 time 2017-03-23 13:37:29
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (2, 'bb'); #start 4 end 314 time 2017-03-23 13:37:29
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (1, 'aa'); #start 4 end 314 time 2017-03-23 13:37:29
[root@db_server_xuanzhi ~]# mysql -uroot -p123456 <./rollback_tb1.sql
Warning: Using a password on the command line interface can be insecure.
再查询一下,数据是否把数据恢复了:
mysql> select * from tb1;
Empty set (0.00 sec) <Slave_1>[xuanzhi]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000110 | 345 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec) mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec) mysql>
可以看到可以正常恢复,但值得注意的是drop table 和truncate table 是无法生成反向SQL的,所以建议线上程序账号只给insert,upfate,select,delete权限。
参考文章:
https://www.cnblogs.com/xuanzhi201111/p/6602489.html
https://github.com/danfengcao/binlog2sql
https://github.com/danfengcao/binlog2sql/blob/master/example/mysql-flashback-priciple-and-practice.md
总结:一、线上要对程序做好最小化权限控制,这样可以减少很多不必要的麻烦。
二、现在开源比较好用的数据闪回工具有mysqlbinlog_flashback和binlog2sql,给DBA日常维护带来了许多帮助。
mysql闪回工具--binlog2sql实践的更多相关文章
- MySQL 闪回工具之 binlog2sql
生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...
- Mysql闪回工具之binlog2sql的原理及其使用
生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成 ...
- MySQL闪回工具之myflash 和 binlog2sql
MySQL闪回工具之:binlog2sql https://github.com/danfengcao/binlog2sql MYSQL Binglog分析利器:binlog2sql使用详解 :h ...
- MySQL闪回工具之binlog2sql
一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...
- (4.11)mysql备份还原——mysql闪回技术(基于binlog)
0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...
- binlog2sql闪回工具的使用
binlog2sql闪回工具的使用 一.下载安装依赖的python yum install openssl-devel bzip2-devel expat-devel gdbm-devel readl ...
- MySQL闪回原理与实战
本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...
- mysql 闪回原理
利用MySQL闪回技术恢复误删除误更改的数据 笔者相信很多人都遇到过忘带where条件或者where条件漏写了一个和写错了的情况,结果执行了delete/update后把整张表的数据都给改了.传统的解 ...
- Mysql 之闪回技术 binlog2sql
1.下载 https://github.com/danfengcao/binlog2sql http://rpmfind.net Search: python-pip pip 是一个Python包管理 ...
随机推荐
- linux中的bash
一.bash的简介 操作系统都是需要通过shell跟内核来交互的,常见的shell有GUI.KDE.sh.csh.bash.tsh.zsh等. 而linux中最常用的shell就是bash. 二.ba ...
- NKOJ3768 数列操作
问题描述 给出N个正整数数列a[1..N],再给出一个正整数k,现在可以重复进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次 ...
- Base64编码与解码原理
Base64编码是使用64个可打印ASCII字符(A-Z.a-z.0-9.+./)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途. base64索引表 base64编码与解码的基 ...
- Light of future-测试总结
目录 1.描述项目的测试工作安排 2.测试工具选择和运用 3.测试用例文档pdf的github链接地址 4.测试体会 5.项目测试评述 发布界面 后台CRUD 归属班级 →2019秋福大软件工程实践Z ...
- win下youtube-dl 【ERROR: requested format not available】选下载视频质量的坑--【值得一看】
需求说明(bug出处): 简单说:下载youtube的视频,嵌入翻译好的中文字幕. 详细说(可略过): 阿里的海外服务器需要布一个Web Service---用以接收国内(本地服务器)的请求, 然后用 ...
- Exchange 2016 OWA登陆异常
今天,收到脚本的告警信息,有一台Exchange服务器OWA无法登陆! 手动进行了一下测试,发现确实存在问题,报错信息如下: 检查了一下该台服务器的日志,找到了如下信息 1.访问OWA的请求在HTTP ...
- 如何利用 githob 上传自己的网站
如何搭建自己的网页是每个学前端伙伴不可缺少的一个过程,特意去看过很多如何搭建的教程,但都看不懂觉得很麻烦, 在慢慢的学习中接触到githob,发现了一个大宝藏(如果一个code都不认识githob 那 ...
- AJ学IOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题
AJ分享,必须精品 一:效果 二:项目代码 这个Demo用的几个控制器分别画了不通的xib,随便拖拽了几个空间,主要是几个按钮的切换,主要代码展示下: // // NYViewController.m ...
- 【Tool】使用IDEA创建简单的Java项目
IDEA创建简单的Java项目 打开IDEA进入首页面,点击 Create New Project 点选第一项就是了,SDK就是我们的JDK,,这里我已经装好了JDK和JDK的环境变量 IDEA就能自 ...
- Python 应用领域及学习重点
笔者认为不管学习什么编程语言,首先要知道:学完之后在未来能做些什么? 本文将浅谈 Python 的应用领域及其在对应领域的学习重点.也仅是介绍了 Python 应用领域的"冰山一角" ...