注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

使用binlog2sql恢复MySQL增删改误操作  

2017-01-05 10:55:08|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


一. 安装
https://github.com/danfengcao/binlog2sql 下载binlog2sql-master.zip,解压到/root
[root@biee2 binlog2sql-master]# /usr/local/python2.7/bin/pip install -r requirments.txt


二. 删除表
(system@localhost) [(none)]> use testdb

(system@localhost) [testdb]> select * from user;
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
| username                       | sex  | birth | address | phoneno | salary | email           | email2 |
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国            | NULL   |
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国我爱你      | NULL   |
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国我爱你      | NULL   |
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
3 rows in set (0.00 sec)

(system@localhost) [testdb]> delete from user;
Query OK, 3 rows affected (0.04 sec)


三. 恢复
1. 登录mysql,查看目前的binlog文件
(system@localhost) [testdb]> flush logs;
Query OK, 0 rows affected (0.18 sec)

(system@localhost) [testdb]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000013 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


2. 解析出标准SQL binlog文件是mysql-bin.000012,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。
[root@biee2 binlog2sql]# /usr/local/python2.7/bin/python binlog2sql.py -h127.0.0.1 -P3305 -usystem -p'123456' -dtestdb -t user --start-file='mysql-bin.000012' --start-datetime='2016-12-14 17:00:00' --stop-datetime='2016-12-14 17:30:00'
DELETE FROM `testdb`.`user` WHERE `username`='中华人民共和国万岁万' AND `salary` IS NULL AND `sex` IS NULL AND `birth` IS NULL AND `address` IS NULL AND `email2` IS NULL AND `email`='中国' AND `phoneno` IS NULL LIMIT 1; #start 4 end 430 time 2016-12-14 17:09:44
DELETE FROM `testdb`.`user` WHERE `username`='中华人民共和国万岁万' AND `salary` IS NULL AND `sex` IS NULL AND `birth` IS NULL AND `address` IS NULL AND `email2` IS NULL AND `email`='中国我爱你' AND `phoneno` IS NULL LIMIT 1; #start 4 end 430 time 2016-12-14 17:09:44
DELETE FROM `testdb`.`user` WHERE `username`='中华人民共和国万岁万' AND `salary` IS NULL AND `sex` IS NULL AND `birth` IS NULL AND `address` IS NULL AND `email2` IS NULL AND `email`='中国我爱你' AND `phoneno` IS NULL LIMIT 1; #start 4 end 430 time 2016-12-14 17:09:44

3. 解析出回滚SQL 得到了误操作sql的准确位置在4-430之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确
[root@biee2 binlog2sql]# /usr/local/python2.7/bin/python binlog2sql.py --flashback -h127.0.0.1 -P3305 -usystem -p'123456' -dtestdb -t user --start-file='mysql-bin.000012' --start-pos=4 --end-pos=430
INSERT INTO `testdb`.`user`(`username`, `salary`, `sex`, `birth`, `address`, `email2`, `email`, `phoneno`) VALUES ('中华人民共和国万岁万', NULL, NULL, NULL, NULL, NULL, '中国我爱你', NULL); #start 4 end 430 time 2016-12-14 17:09:44
INSERT INTO `testdb`.`user`(`username`, `salary`, `sex`, `birth`, `address`, `email2`, `email`, `phoneno`) VALUES ('中华人民共和国万岁万', NULL, NULL, NULL, NULL, NULL, '中国我爱你', NULL); #start 4 end 430 time 2016-12-14 17:09:44
INSERT INTO `testdb`.`user`(`username`, `salary`, `sex`, `birth`, `address`, `email2`, `email`, `phoneno`) VALUES ('中华人民共和国万岁万', NULL, NULL, NULL, NULL, NULL, '中国', NULL); #start 4 end 430 time 2016-12-14 17:09:44

4. 执行回滚语句。登录mysql确认,数据回滚成功。
[root@biee2 binlog2sql]# /usr/local/python2.7/bin/python binlog2sql.py -h127.0.0.1 -P3305 -usystem -p'123456' -dtestdb -t user --start-file='mysql-bin.000012' --start-pos=4 --end-pos=430 -B | mysql -h127.0.0.1 -P3305 -usystem -p'123456' 
Warning: Using a password on the command line interface can be insecure.

(system@localhost) [(none)]> use testdb;
Database changed
(system@localhost) [testdb]> select * from user;
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
| username                       | sex  | birth | address | phoneno | salary | email           | email2 |
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国我爱你      | NULL   |
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国我爱你      | NULL   |
| 中华人民共和国万岁万           | NULL | NULL  | NULL    | NULL    |   NULL | 中国            | NULL   |
+--------------------------------+------+-------+---------+---------+--------+-----------------+--------+
3 rows in set (0.00 sec)
  评论这张
 
阅读(102)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017