利用binlog2sql快速闪回误删除数据 - 别拿豆包不当干粮
各位兄弟们,好久不见了!最近一直忙于新书的创作,所以一直没有时间更新博客。不知道这段时间大家学习得怎么样,希望大家通过看我的文章给大家带来帮助。
老张我也花费了大量时间录制一些数据库的视频课程,大家要是感兴趣,也可以去学习,不要错过啊!
今儿抽出时间,给大家分享一篇利用binlog2sql闪回工具,来恢复误删除的数据。我们都知道binlog的作用是备份恢复和完成MySQL的主从复制功能。利用mysqlbinlog工具可以进行基于时间点或者位置偏移量的数据恢复工作,在生产环境中遇到误删除,改错数据的情况,那是常有的事儿。我们都知道Oracle数据库有闪回功能,而MySQL本身没有自带闪回,但我们可以使用binlog2sql来完成这项工作。
我们都知道binlog是以event作为单位,来记录数据库变更的数据信息,闪回就是可以帮助我们重现这些变化数据信息之前的操作。也就是说对于insert操作,会生成delete语句,反之delete操作,会生成insert语句。对于update操作,也会生成相反的update语句。这款工具只能使用在binlog格式为row模式下。
下面进行实战演练:
binlog2sql工具的下载地址: https://github.com/danfengcao/binlog2sql
第一步:环境准备安装各种依赖的工具包列表
python-pip , PyMySQL , python-mysql-replication, wheel argparse
第二步:解压binlog2sql软件,命令如下
unzip binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt
第三步:通过python binlog2sql.py --help命令,来查看重要参数的使用;
-B, --flashback 生成回滚语句 --start-file 需要解析的binlog文件 --start-position 解析binlog的起始位置 --stop-position解析binlog的结束位置 --start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime --stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime -d, --databases 只输出目标db的sql -t, --tables 只输出目标tables的sql
第四步:开始模拟数据删除
首先删除掉zs库下,t表中的数据
root@db 14:26: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec) root@db 14:26: [zs]> delete from t; Query OK, 5 rows affected (0.04 sec) root@db 14:27: [zs]> select * from t; Empty set (0.00 sec)
第五步:需要创建一个闪回用户
create user 'zs_test'@'%' identified by '123456'; grant select,replication slave,replication client on *.* to 'zs_test'@'%' ; flush privileges;
第六步:确定当前binlog文件和position位置
root@db 14:41: [zs]> show master status; +---------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------------+----------+--------------+------------------+------------------------------------------+ | mysql-binlog.000002 | 2091 | | | e10f0ead-d595-11e7-82cb-080027cd683a:1-8 | +---------------------+----------+--------------+------------------+------------------------------------------+
可以看到当前binlog是:mysql-binlog.000002
位置偏移量:2091
第七步:需要预估下时间,误操作的时间范围应该在下午2点20分到2点30分之间。命令如下:python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-datetime='2017-11-30 14:20:00' --stop-datetime='2017-11-30 14:30:00'
输出结果:
DELETE FROM zs
.t
WHERE address
='bj' AND id
=1 AND name
='aaa' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='sh' AND id
=2 AND name
='bbb' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='gz' AND id
=3 AND name
='ccc' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='sy' AND id
=4 AND name
='ddd' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='fj' AND id
=5 AND name
='eee' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
从解析结果中我们了解到,误操作sql的位置是在1214~1427之间;这样就可以进一步过滤,使用flashback模式生成回滚sql;
命令如下:python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-position=1214 --stop-position=1427 -B >t_rollback.sql
查看闪回导出文件:
[root@node3 binlog2sql]# cat t_rollback.sql INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('fj', 5, 'eee'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sy', 4, 'ddd'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('gz', 3, 'ccc'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sh', 2, 'bbb'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('bj', 1, 'aaa'); #start 1214 end 1427 time 2017-11-30 14:27:46
第八步:应用回滚文件,恢复数据。命令如下:/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql
第九步:检验恢复数据是否成功
root@db 15:09: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec)
验证恢复数据成功!
工具虽小,但功能很强大,我们要善于发现周围的资源,利用这些武器,来帮助我们学习MySQL数据库!今后老张会继续分享新的干货,供大家学习参考!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何最接近rpm的安装方式去编译安装最新的php-fpm
1 前言 笔者非常不喜欢某些人编译安装的软件,维护起来非常缺乏rpm安装的那种规范感觉,于是笔者参阅官方的编译安装教程以及对比分析rpm安装的目录布置结构,完成以下安装。 2 安装PHP-FPM 2.1 环境配置 2.1.1 安装解压工具 yuminstall-ybzip2 2.1.2 配置编译环境 yum-yinstallgccgcc-c++makeexpat-devel 2.1.3 下载php二进制安装包 cd~ wgethttp://cn2.php.net/distributions/php-7.1.12.tar.bz2 注:具体的下载页面请参阅 http://sg2.php.net/downloads.php 2.1.4 创建运行用户 groupadd-g48apache useradd-u48-g48-d/usr/share/httpd-s/sbin/nologinapache 2.1.5 预建目录 mkdir/var/log/php-fpm/ mkdir/run/php-fpm/ 2.1.6 配置防火墙 firewall-cmd --permanent --add-port...
- 下一篇
101个shell脚本
本文用于记录学习和日常中使用过的shell脚本 【脚本1】打印形状 打印等腰三角形、直角三角形、倒直角三角形、菱形 #!/bin/bash # 等腰三角形 read -p "Please input the length: " n for i in `seq 1 $n` do for ((j=$n;j>i;j--)) do echo -n " " done for m in `seq 1 $i` do echo -n "* " done echo done # 倒直角三角形 read -p "Please input the length: " len for i in `seq 1 $len` do for j in `seq $i $len` do echo -n "* " done echo done # 直角三角形 read -p "Please input the length: " len for i in `seq 1 $len` do for((j=1;j<=$i;j++)) do echo -n "* " done echo done # 菱形 read ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS关闭SELinux安全模块
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长