Mysql数据闪回的奇技淫巧(binlog2sql)

一、概述

binlog2sql是一个开源项目,应用于大众点评线上环境。类似于ORACLE中的闪回功能,binlog2sql可以基于时间点或者位置偏移量进行数据恢复。从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。也就是对于insert操作会生成对应的delete语句,反之delete操作会生出对应的insert语句,update操作会生成相反的语句。

关于binlog2sql的闪回详细介绍可参考闪回原理与实战。我也是偶然间看到一个大神关于这个神器的介绍,猛然心动,决心要动手演练一把。

我的测试环境介绍

l Python 2.6

l MySQL 5.1.73

二、binlog2sql安装

binlog2sql工具可以自己下载 https://github.com/danfengcao/binlog2sql

下面这些包都要装全,否则执行脚本会报错

python-pip

PyMySQL

python-mysql-replication

argparse

Linux机器下载并安装binlog2sql

[[email protected] binlog2sql-master]# wget  https://codeload.github.com/danfengcao/binlog2sql/zip/master
[[email protected] install_page]# unzip binlog2sql-master.zip 
Archive:  binlog2sql-master.zip
bb09b8f9079ca4d3cacd0186f35ddf4b3e1cfa7e
   creating: binlog2sql-master/
  inflating: binlog2sql-master/.gitignore  
  inflating: binlog2sql-master/LICENSE  
  inflating: binlog2sql-master/README.md  
   creating: binlog2sql-master/binlog2sql/
  inflating: binlog2sql-master/binlog2sql/__init__.py  
  inflating: binlog2sql-master/binlog2sql/binlog2sql.py  
  inflating: binlog2sql-master/binlog2sql/binlog2sql_util.py  
   creating: binlog2sql-master/example/
  inflating: binlog2sql-master/example/mysql-flashback-priciple-and-practice.md  
  inflating: binlog2sql-master/requirements.txt  
   creating: binlog2sql-master/tests/
  inflating: binlog2sql-master/tests/test_binlog2sql_util.py  
[[email protected] install_page]# ls
binlog2sql-master  binlog2sql-master.zip  
[[email protected] binlog2sql-master]# cd binlog2sql-master #下面脚本执行的时候也要在这么路径下
[[email protected] binlog2sql-master]# pip install -r requirements.txt 
Downloading/unpacking PyMySQL==0.7.11 (from -r requirements.txt (line 1))
  Downloading PyMySQL-0.7.11.tar.gz (71kB): 71kB downloaded
  Running setup.py egg_info for package PyMySQL
Downloading/unpacking wheel==0.29.0 (from -r requirements.txt (line 2))
  Downloading wheel-0.29.0.tar.gz (54kB): 54kB downloaded
  Running setup.py egg_info for package wheel
    no previously-included directories found matching 'wheel/test/*/dist'
    no previously-included directories found matching 'wheel/test/*/build'
Downloading/unpacking mysql-replication==0.13 (from -r requirements.txt (line 3))
  Downloading mysql-replication-0.13.tar.gz
  Running setup.py egg_info for package mysql-replication
Installing collected packages: PyMySQL, wheel, mysql-replication
  Running setup.py install for PyMySQL
  Running setup.py install for wheel
    no previously-included directories found matching 'wheel/test/*/dist'
    no previously-included directories found matching 'wheel/test/*/build'
    Installing wheel script to /usr/bin
  Running setup.py install for mysql-replication
Successfully installed PyMySQL wheel mysql-replication
Cleaning up...

三、Mysql环境要求

1、 MySQL server必须设置以下参数:

[mysqld]
server-id=160
log-bin=mysql-binlog
max_binlog_size=1G
binlog_format=row

2、 创建一个闪回用户

[email protected] test1 19:48:06> create user [email protected]'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
[email protected] test1 19:49:06>grant select,replication slave,replication client on *.* to t[email protected]'%';
Query OK, 0 rows affected (0.00 sec)
 
[email protected] test1 19:49:50>flush privileges;
Query OK, 0 rows affected (0.00 sec)

注:user需要的最小权限集合:

select, super/replication client, replication slave

权限说明

select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表
replication slave:通过BINLOG_DUMP协议获取binlog内容的权限

3、 模拟一次生产事故,误删数据

test1库tb1表原有数据

[email protected] test1 20:08:52>select * from tb1;
+-------+------+
| name  | age  |
+-------+------+
| kobe  |   21 |
| james |   22 |
| jack  |   23 |
| mike  |   24 |
| bob   |   25 |
+-------+------+
5 rows in set (0.01 sec)
 
[email protected] test1 20:08:59>delete from tb1 where age <23;
Query OK, 2 rows affected (0.00 sec)
 
[email protected] test1 20:09:03>select * from tb1;
+-------+------+
| name  | age  |
+-------+------+
| jack  |   23 |
| mike  |   24 |
| bob   |   25 |
+-------+------+
3 rows in set (0.01 sec)

四、恢复数据步骤

1、登录mysql,查看目前的binlog文件

[email protected] test1 20:09:59>show master status;
+---------------------+----------+--------------+------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| mysql-binlog.000002 |      341 |              |                  |
+---------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

最新的binlog文件是mysql-binlog.000002,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。

2、 接下来就该这个神器登场了。

先来介绍一下binlog2sql参数

--stop-never 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。
-K, --no-primary-key 对INSERT语句去除主键。可选。
-B, --flashback 生成回滚语句,可解析大文件,不受内存限制,每打印一千行加一句SELECT SLEEP(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。可选。默认为空。

3、 根据预估时间,执行下面命令找出对应的position

[[email protected] binlog2sql]# python binlog2sql.py -h 192.168.221.160 -utest -p123456 -dtest1 -ttb1 --start-file='mysql-binlog.000002' --start-datetime='2017-12-04 20:00:00' --stop-datetime='2017-12-04 20:10:00' 
DELETE FROM `test1`.`tb1` WHERE `age`=21 AND `name`='kobe' LIMIT 1; #start 4 end 271 time 2017-12-04 20:08:59
DELETE FROM `test1`.`tb1` WHERE `age`=22 AND `name`='james' LIMIT 1; #start 4 end 271 time 2017-12-04 20:08:59

我们得到了误操作sql的准确位置在4-271之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确(注:真实环境下,此步经常会进一步筛选出需要的sql。结合grep、编辑器等)

4、 使用flashback模式生成回滚sql

[[email protected] binlog2sql]# python binlog2sql.py -h 192.168.221.160 -utest -p123456 -dtest1 -ttb1 --start-file='mysql-binlog.000002' --start-position=4 --stop-position=271 -B > tb1_rollback.sql

查看闪回导出的文件

[[email protected] binlog2sql]# cat tb1_rollback.sql 
INSERT INTO `test1`.`tb1`(`age`, `name`) VALUES (22, 'james'); #start 4 end 271 time 2017-12-04 20:08:59
INSERT INTO `test1`.`tb1`(`age`, `name`) VALUES (21, 'kobe'); #start 4 end 271 time 2017-12-04 20:08:59

5、 确认回滚sql正确,执行回滚语句。登录mysql确认,数据回滚成功。

[[email protected] binlog2sql]# mysql -uroot test1 -p123456 <tb1_rollback.sql 
Enter password:

6、登录数据库检验数据完整性

[email protected] test1 20:18:04>select * from tb1;
+-------+------+
| name  | age  |
+-------+------+
| kobe  |   21 |
| james |   22 |
| jack  |   23 |
| mike  |   24 |
| bob   |   25 |
+-------+------+
5 rows in set (0.00 sec)

可以看到,之前删除的两条数据又回来了

五、结语

binlog2sql是属于纯Python开发,安装与使用都很简单,易于上手,可操作性强,解析为标准SQL,方便理解、调试。但仍存在一些缺点,比如只能在mysql开启的状态下运行,不能离线操作,数据量较大时会暴露出解析速度慢的问题。总体来说,仍不失成为一个很NICE的工具。

时间: 2024-10-27 16:10:19

Mysql数据闪回的奇技淫巧(binlog2sql)的相关文章

binlog2sql之MySQL数据闪回

DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护,并不适合快速回滚.也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能.现在有不少好用而且效率又高的开源闪回工具如binlog2sql.mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练. bin

Mysql闪回工具之binlog2sql的原理及其使用

生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成本也大. 当然还有其他的一些操作方法,我们今天有主角. MySQL 闪回工具 --   binlog2sql 用途 数据回滚 主从切换后数据不一致的修复 从 binlog 生成标准 SQL,带来的衍生功能 闪回原理简析 开始之前,先说说闪回.我们都知道 MySQL binlog 以 event 为单

MySQL Flashback 闪回功能详解

阅读目录 1. 简介 2. 闪回原理 3. flashback安装 4. 使用简介 5. Flashback工具使用注意点 回到顶部 1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带where条件的update.delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速.简单. 目前My

oracle flashback——oracle数据闪回实战,及恢复数据到指定的时间戳——timestamp

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\ckz>sqlplus zzjd/[email protected]/orcl as sysdba; SQL*Plus: Release 11.2.0.1.0 Production on 星期三 5月 13 17:00:46 2015 Copyright (c) 1982, 2010, Oracle. All rights re

mysql&quot;闪回&quot;技术恢复误删除误更改的数据

相信很多人都遇到过忘带where条件或者where条件漏写了一个和写错了的情况,结果执行了delete/update后把整张表的数据都给改了.传统的解决方法是:利用最近的全量备份+增量binlog备份,恢复到误操作之前的状态,但是此方法有一个弊端,那就是随着表的记录增大,binlog的增多,恢复起来会很费时费力. 现在有一个简单的方法,可以恢复到误操作之前的状态.听起来这方法似乎利用的是Oracle的闪回功能,但MySQL目前(包括最新的V5.7版本与MariaDB10.1分支版本)还不具有这样

Oracle闪回技术详解

概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEGMENT) 在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段.因为大部分闪回技术

oracle闪回查询和闪回数据库

oracle闪回查询和闪回数据库 区别: 数据闪回查询,只需要启用撤销表空间自动管理回滚信息. 使用闪回删除技术和闪回数据库技术,需要启动回收站,闪回恢复区.(归档模式使用) 具体设置: ---cmd sqlplus nolog sys as sysdba hanatech 具体设置----数据闪回查询的设置: 查看撤销表信息undo: show parameter undo; 设置撤销表信息: alter system set undo_managerment=auto;设置为auto才可以使

Oracle学习(15)【DBA向】:闪回

闪回Flashback 什么是闪回 l在Oracle的操作工程中,会不可避免地出现操作失误或者用户失误,例如不小心删除了一个表等,这些失误和错误可能会造成重要数 据的丢失,最终导致Oracle数据库停止. l在传统意义上,当发生数据丢失.数据错误问题时,解决的主要办法是数据的导入导出.备份恢复技术,这些方法都需要在发生错误 前,有一个正确的备份才能进行恢复. l为了减少这方面的损失,Oracle提供了闪回技术.有了闪回技术,就可以实现数据的快速恢复,而且不需要数据备份. 闪回的好处 恢复中,闪回

专题实验 oracle 闪回特性

在 oracle 9i 之前的版本中, 如果用户因为误操作 delete 或 update 并提交了, 那么恢复这些用户的操作错误是极其低效的. 为此, oracle 提供了闪回功能, 通过回退, 我们可以找回正确的数据. oracle 闪回查询特性 通过闪回查询我们可以按照时间戳或SCN来向前查询, 获取修改之前的数据镜像, 再通过insert等操作就可以恢复数据. 闪回查询一来于回滚段中存储的数据前镜像, 在oracle9i以前的版本中, 通常只要事务提交后, 前镜像数据就可以被覆盖, 空间