设为首页 收藏本站
查看: 1601|回复: 0

[经验分享] Mysql数据闪回的奇技淫巧(binlog2sql)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-6 10:43:33 | 显示全部楼层 |阅读模式
一、概述
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[iyunv@DB binlog2sql-master]# wget  https://codeload.github.com/danfengcao/binlog2sql/zip/master
[iyunv@DB 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  
[iyunv@DB install_page]# ls
binlog2sql-master  binlog2sql-master.zip  
[iyunv@DB binlog2sql-master]# cd binlog2sql-master #下面脚本执行的时候也要在这么路径下
[iyunv@DB 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必须设置以下参数:
1
2
3
4
5
[mysqld]
server-id=160
log-bin=mysql-binlog
max_binlog_size=1G
binlog_format=row




2、 创建一个闪回用户
1
2
3
4
5
6
7
root@localhost test1 19:48:06> create user test@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
root@localhost test1 19:49:06>grant select,replication slave,replication client on *.* to test@'%';
Query OK, 0 rows affected (0.00 sec)

root@localhost test1 19:49:50>flush privileges;
Query OK, 0 rows affected (0.00 sec)



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





3、 模拟一次生产事故,误删数据
test1库tb1表原有数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@localhost 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)

root@localhost test1 20:08:59>delete from tb1 where age <23;
Query OK, 2 rows affected (0.00 sec)

root@localhost 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文件

1
2
3
4
5
6
7
root@localhost 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参数
1
2
3
4
5
6
7
8
9
10
11
--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
1
2
3
[iyunv@DB 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
1
[iyunv@DB 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



查看闪回导出的文件
1
2
3
[iyunv@DB 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确认,数据回滚成功。
1
2
[iyunv@DB binlog2sql]# mysql -uroot test1 -p123456 <tb1_rollback.sql
Enter password:




6、登录数据库检验数据完整性
1
2
3
4
5
6
7
8
9
10
11
root@localhost 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的工具。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421159-1-1.html 上篇帖子: mysql5.7主从复制遇到的坑 下篇帖子: MySQL的FEDERATED引擎实现类Oracle的DBlink
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表