在前面的文章中我们介绍了MySQL误操作后数据恢复(update,delete忘加where条件),大 概操作是通过sed命令把binlog中相关SQL误操作给逆向回来,然后导入SQL文件来恢复错误操作,sed相关命令也比较复杂。如果没有正则基础的 同学肯定搞不清楚在干嘛。今天无意中发现淘宝的大神(翻译高性能mysql第三版的作者之一)开发了一个补丁,该补丁能够模拟Oracle的闪回操作,这 样以来我们的MySQL也可以实现闪回咯。真是给力。注意:同样binlog格式需要是ROW

项目主页:http://mysql.taobao.org/index.php/Patch_source_code#Add_flashback_feature_for_mysqlbinlog

测试过程 

1.给mysql打补丁,该补丁是针对mysql 5.5.18的版本,我测试的mysql 5.5.25版本也可以。(也可以使用我编译好了的,64位平台下的,在文中最后会有下载地址)

wget http://mysql.taobao.org/images/0/0f/5.5.18_flashback.diff
cd /usr/local/src/mysql-5.5.25a/
patch -p0 < /root/5.5.18_flashback.diff cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql make && make install

2.检查补丁是否应用成功,如果mysqlbinlog命令多了-B选项,那么就ok了。

[root@yayun-mysql-server ~]# mysqlbinlog --help | grep '\-B'-B, --flashback     Flashback data to start_postition or start_datetime.
[root@yayun-mysql-server ~]# 

3.模拟误操作(update忘记加where条件)

(root@yayun-mysql-server) [test]> select * from tb1; +------+--------+ | id | name | +------+--------+ | 1 | yayun | | 2 | atlas | | 3 | dyy | | 4 | nginx | | 5 | apache | +------+--------+ 5 rows in set (0.00 sec) (root@yayun-mysql-server) [test]> update tb1 set name='yayun'; Query OK, 4 rows affected (0.03 sec) Rows matched: 5 Changed: 4 Warnings: 0 (root@yayun-mysql-server) [test]> select * from tb1; +------+-------+ | id | name | +------+-------+ | 1 | yayun | | 2 | yayun | | 3 | yayun | | 4 | yayun | | 5 | yayun | +------+-------+ 5 rows in set (0.00 sec) (root@yayun-mysql-server) [test]> 

4.开始恢复

(1)首先需要找出错误的操作语句以及position点。

(root@yayun-mysql-server) [test]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000023 | 364 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) (root@yayun-mysql-server) [test]> 

可见现在正在使用的是mysql-bin.000023这个binlog

[root@yayun-mysql-server mysql]# mysqlbinlog -vv mysql-bin.000023 |egrep -i -C 20 'update|tb1' # Warning: this binlog is either in use or was not closed properly. BINLOG ' RgZoUw8BAAAAZwAAAGsAAAABAAQANS41LjI1YS1sb2cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 107 #140506 5:45:21 server id 1 end_log_pos 175 Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1399326321/*!*/; SET @@session.pseudo_thread_id=3/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 175 # at 220 #140506 5:45:21 server id 1 end_log_pos 220 Table_map: `test`.`tb1` mapped to number 35 #140506 5:45:21 server id 1 end_log_pos 337 Update_rows: table id 35 flags: STMT_END_F BINLOG ' cQZoUxMBAAAALQAAANwAAAAAACMAAAAAAAEABHRlc3QAA3RiMQACAw8CPAAD cQZoUxgBAAAAdQAAAFEBAAAAACMAAAAAAAEAAv///AIAAAAFYXRsYXP8AgAAAAV5YXl1bvwDAAAA A2R5efwDAAAABXlheXVu/AQAAAAFbmdpbnj8BAAAAAV5YXl1bvwFAAAABmFwYWNoZfwFAAAABXlh eXVu '/*!*/; ### UPDATE test.tb1 ### WHERE ### @1=2 /* INT meta=0 nullable=1 is_null=0 */ ### @2='atlas' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### SET ### @1=2 /* INT meta=0 nullable=1 is_null=0 */ ### @2='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### UPDATE test.tb1 ### WHERE ### @1=3 /* INT meta=0 nullable=1 is_null=0 */ ### @2='dyy' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### SET ### @1=3 /* INT meta=0 nullable=1 is_null=0 */ ### @2='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### UPDATE test.tb1 ### WHERE ### @1=4 /* INT meta=0 nullable=1 is_null=0 */ ### @2='nginx' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### SET ### @1=4 /* INT meta=0 nullable=1 is_null=0 */ ### @2='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### UPDATE test.tb1 ### WHERE ### @1=5 /* INT meta=0 nullable=1 is_null=0 */ ### @2='apache' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### SET ### @1=5 /* INT meta=0 nullable=1 is_null=0 */ ### @2='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ # at 337 #140506 5:45:21 server id 1 end_log_pos 364 Xid = 40 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

开始的起点以107为准,因为107下面紧跟着BEGIN,结束的点以end_log_pos 337下一个点为准.

[root@yayun-mysql-server mysql]# mysqlbinlog -vv --start-position=337 mysql-bin.000023
/*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #140506 5:44:38 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.25a-log created 140506 5:44:38 # Warning: this binlog is either in use or was not closed properly. BINLOG ' RgZoUw8BAAAAZwAAAGsAAAABAAQANS41LjI1YS1sb2cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 337 #140506 5:45:21 server id 1 end_log_pos 364 Xid = 40 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; [root@yayun-mysql-server mysql]# 

上面蓝色字体显示的很清楚了,那么结束的点就是364,因为下面紧跟着COMMIT。现在我们已经找到了日志开始起点为107,结束点为364,下面开始恢复。

[root@yayun-mysql-server mysql]# mysqlbinlog -B -vv --start-position=107 --stop-position=364 mysql-bin.000023 | mysql
[root@yayun-mysql-server mysql]# 

检查是否恢复成功:

(root@yayun-mysql-server) [test]> select * from tb1; +------+--------+ | id | name | +------+--------+ | 1 | yayun | | 2 | atlas | | 3 | dyy | | 4 | nginx | | 5 | apache | +------+--------+ 5 rows in set (0.00 sec) (root@yayun-mysql-server) [test]> 

可见数据已经成功恢复。其实原理和我们前面通过sed操作binlog进行恢复是一样的。只是这个更简单。对于delete忘记添加where条件,恢复方法是一样的。这里不再重复。

总结:

binlog格式非常重要,无论是数据恢复还是主从复制,ROW格式都非常的给力。当然也有缺点,复制会占用过多带宽,消耗大量磁盘空间。

已经应用补丁的mysqlbinlog下载地址(64位平台,直接替换原来的即可)

http://pan.baidu.com/s/1o6jXt14

http://www.cnblogs.com/gomysql/p/3713134.html

转载于:https://www.cnblogs.com/seasonzone/p/4159472.html

MySQL模拟Oralce闪回操作相关推荐

  1. oracle10G 错误删除数据或者表 闪回功能帮你忙。。。闪回操作例子

    闪回查询 (1).查询闪回 例如: 1)在删除员工smith记录后,希望查询到删除该行记录前的值,则可以查询emp在'2007-02-11 23:34:05'时的数据,查询方法如下: select * ...

  2. oracle数据误操作恢复【flashback闪回操作】

    几张表的数据全部执行了delete * 操作. 接到问题立刻知道了事件的严重性,立即开始研究解决办法. 了解到数据库是oracle 10G. 经查询可以使用flashback闪回操作进行恢复,这下放心 ...

  3. ORACLE 各种闪回操作

    1.Flashback Database(利用闪回日志恢复) Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一 ...

  4. oracle中闪回和回滚,oracle闪回操作详解

    Oracle的闪回 oracle中为什么会有闪回呢!它的作用是什么呢?我们来学习一下闪回吧!闪回和回滚异曲同工之妙. 一闪回的介绍 (1)在Oracle的操作工程中,会不可避免地出现操作失误或者用户失 ...

  5. oracle 闪回操作(flashback)

    234390216 的留下学习 原文地址 http://haohaoxuexi.iteye.com/blog/1594391 Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的 ...

  6. mysql binlog2sql_MySQL数据闪回 binlog2sql

    相比于全备+binlog恢复,flashback 是动作更小的恢复方式.简单来说就是通过工具解析 binlog 生成与误操作相反的SQL,比如 delete 则反向生成 insert,再执行一遍即可恢 ...

  7. 2012 12 12 (109)闪回操作

    找回数据库表中误删除的数据   如果数据库中误删除了一个表中的记录,例如删除了一个非常重要的雇员信息,并且该事务已经提交了,如何快速找回误删除的数据呢? 这种情况下可以利用数据库的闪回功能实现找回丢失 ...

  8. Oracle数据库中的锁,闪回操作(二)

    目录 1.锁机制 2.闪回 (1)查询闪回 (2)表闪回 (3)删除闪回 (4)回收站管理 (5)数据库闪回 (6)归档闪回 3.Undo表空间 (1)undo表空间管理的优点 (2)undo表空间管 ...

  9. oracle中闪回概念,Oracle数据库的闪回操作

    通过DELETE删除数据后相当于放入回收站,一般情况下可以找回:通过UPDATE更新数据后数据库也会保留数据快照.闪回就是恢复指定时间的数据快照以达到恢复数据的目的. 根据步骤一查询出数据快照,恢复数 ...

最新文章

  1. java aws访问授权 实例_java – 使用IAM身份验证和Spring JDBC访问AWS ...
  2. 程序员入错行怎么办?
  3. fedora18装一些软件及配置
  4. mysql+installer+community+5.7.9_win10系统,mysql-installer-community-5.7.19.0.msi安装
  5. oracle dynamic set,Oracle Dynamically Listener(动态监听)
  6. 【Android基础】android shape详解
  7. 卷积神经网络训练准确率突然下降_从MobileNet看轻量级神经网络的发展
  8. BIO,NIO,AIO总结
  9. 05-基础widgets
  10. 人工智能python实战代码_人工智能------基于Python实战注疏
  11. 华为悦盒ec6108v9修改mac、sn、stbid修改实现移植到性能好的设备
  12. 【论文笔记】Data Shapley: Equitable Valuation of Data for Machine Learning
  13. 赠与今年的大学毕业生 - 胡适
  14. 新闻字幕条制作,一款不错的ae字幕模板
  15. 智能语音计算器(三)
  16. 【节能、绿色、高效】数据中心发展正迈入“高算力”时代
  17. 手机qq保存的文件路径
  18. 如何利用GitHub搜索敏感信息
  19. Java数据库基础--以SQL Server为例
  20. TLS双向认证之生成双端证书信息

热门文章

  1. 机器学习(MACHINE LEARNING)MATLAB进行概率统计分析
  2. java 区块链使用_使用Java创建第一个区块链
  3. 请概述可视化卷积神经网络的中间输出的基本思想。_卷积神经网络为什么能称霸计算机视觉领域?...
  4. qt designer 插入图片_高清免版权免费图片素材哪里找?
  5. 怎么做网络营销在网站优化中能快速提升搜索引擎信任的方法!
  6. 企业网络推广方法教你如何精准避免网站过度优化问题?
  7. 网站长尾词布置需要注意什么事项?
  8. linux查询引脚功能复用,Linux:使用pinctrl子系统动态切换复用pin脚的功能
  9. mysql sql with_mysql5.7 查询sql 出错: with sql_mode=only_full_group_by
  10. java 重定向到某个页面并弹出消息_Java开发面试宝典之网络通信篇