在前面的文章中我们介绍了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位平台下的,在文中最后会有下载地址)

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

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

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

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

  1. (root@yayun-mysql-server) [test]> select * from tb1;
  2. +------+--------+
  3. | id | name |
  4. +------+--------+
  5. | 1 | yayun |
  6. | 2 | atlas |
  7. | 3 | dyy |
  8. | 4 | nginx |
  9. | 5 | apache |
  10. +------+--------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. (root@yayun-mysql-server) [test]> update tb1 set name='yayun';
  14. Query OK, 4 rows affected (0.03 sec)
  15. Rows matched: 5 Changed: 4 Warnings: 0
  16.  
  17. (root@yayun-mysql-server) [test]> select * from tb1;
  18. +------+-------+
  19. | id | name |
  20. +------+-------+
  21. | 1 | yayun |
  22. | 2 | yayun |
  23. | 3 | yayun |
  24. | 4 | yayun |
  25. | 5 | yayun |
  26. +------+-------+
  27. 5 rows in set (0.00 sec)
  28.  
  29. (root@yayun-mysql-server) [test]>

4.开始恢复

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

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

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

  1. [root@yayun-mysql-server mysql]# mysqlbinlog -vv mysql-bin. |egrep -i -C 'update|tb1'
  2. # Warning: this binlog is either in use or was not closed properly.
  3. BINLOG '
  4. RgZoUw8BAAAAZwAAAGsAAAABAAQANS41LjI1YS1sb2cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  5. AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
  6. '/*!*/;
  7. # at 107
  8. #140506 5:45:21 server id 1 end_log_pos 175 Query thread_id=3 exec_time=0 error_code=0
  9. SET TIMESTAMP=/*!*/;
  10. SET @@session.pseudo_thread_id=/*!*/;
  11. SET @@session.foreign_key_checks=, @@session.sql_auto_is_null=, @@session.unique_checks=, @@session.autocommit=/*!*/;
  12. SET @@session.sql_mode=/*!*/;
  13. SET @@session.auto_increment_increment=, @@session.auto_increment_offset=/*!*/;
  14. /*!\C utf8 *//*!*/;
  15. SET @@session.character_set_client=,@@session.collation_connection=,@@session.collation_server=/*!*/;
  16. SET @@session.lc_time_names=/*!*/;
  17. SET @@session.collation_database=DEFAULT/*!*/;
  18. BEGIN
  19. /*!*/;
  20. # at
  21. # at
  22. # :: server id end_log_pos Table_map: `test`.`tb1` mapped to number
  23. #140506 5:45:21 server id 1 end_log_pos 337 Update_rows: table id 35 flags: STMT_END_F
  24. BINLOG '
  25. cQZoUxMBAAAALQAAANwAAAAAACMAAAAAAAEABHRlc3QAA3RiMQACAw8CPAAD
  26. cQZoUxgBAAAAdQAAAFEBAAAAACMAAAAAAAEAAv///AIAAAAFYXRsYXP8AgAAAAV5YXl1bvwDAAAA
  27. A2R5efwDAAAABXlheXVu/AQAAAAFbmdpbnj8BAAAAAV5YXl1bvwFAAAABmFwYWNoZfwFAAAABXlh
  28. eXVu
  29. '/*!*/;
  30. ### UPDATE test.tb1
  31. ### WHERE
  32. ### @= /* INT meta=0 nullable=1 is_null=0 */
  33. ### @='atlas' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  34. ### SET
  35. ### @= /* INT meta=0 nullable=1 is_null=0 */
  36. ### @='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  37. ### UPDATE test.tb1
  38. ### WHERE
  39. ### @= /* INT meta=0 nullable=1 is_null=0 */
  40. ### @='dyy' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  41. ### SET
  42. ### @= /* INT meta=0 nullable=1 is_null=0 */
  43. ### @='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  44. ### UPDATE test.tb1
  45. ### WHERE
  46. ### @= /* INT meta=0 nullable=1 is_null=0 */
  47. ### @='nginx' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  48. ### SET
  49. ### @= /* INT meta=0 nullable=1 is_null=0 */
  50. ### @='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  51. ### UPDATE test.tb1
  52. ### WHERE
  53. ### @= /* INT meta=0 nullable=1 is_null=0 */
  54. ### @='apache' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  55. ### SET
  56. ### @= /* INT meta=0 nullable=1 is_null=0 */
  57. ### @='yayun' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
  58. # at
  59. # :: server id end_log_pos Xid =
  60. COMMIT/*!*/;
  61. DELIMITER ;
  62. # End of log file
  63. ROLLBACK /* added by mysqlbinlog */;
  64. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

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

  1. [root@yayun-mysql-server mysql]# mysqlbinlog -vv --start-position= mysql-bin.
  2. /*!40019 SET @@session.max_insert_delayed_threads=0*/;
  3. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
  4. DELIMITER /*!*/;
  5. # at
  6. # :: server id end_log_pos Start: binlog v , server v 5.5.25a-log created ::
  7. # Warning: this binlog is either in use or was not closed properly.
  8. BINLOG '
  9. RgZoUw8BAAAAZwAAAGsAAAABAAQANS41LjI1YS1sb2cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  10. AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
  11. '/*!*/;
  12. # at 337
  13. #140506 5:45:21 server id 1 end_log_pos 364 Xid = 40
  14. COMMIT/*!*/;
  15. DELIMITER ;
  16. # End of log file
  17. ROLLBACK /* added by mysqlbinlog */;
  18. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  19. [root@yayun-mysql-server mysql]#

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

  1. [root@yayun-mysql-server mysql]# mysqlbinlog -B -vv --start-position= --stop-position= mysql-bin. | mysql
  2. [root@yayun-mysql-server mysql]#

检查是否恢复成功:

  1. (root@yayun-mysql-server) [test]> select * from tb1;
  2. +------+--------+
  3. | id | name |
  4. +------+--------+
  5. | 1 | yayun |
  6. | 2 | atlas |
  7. | 3 | dyy |
  8. | 4 | nginx |
  9. | 5 | apache |
  10. +------+--------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. (root@yayun-mysql-server) [test]>

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

总结:

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

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

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

MySQL模拟Oralce闪回操作的更多相关文章

  1. MySQL的binlog2sql闪回

    从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途=========== * 数据快速回滚(闪回)* 主从切换后新m ...

  2. PLSQL_闪回操作4_Flashback Drop

    2014-06-25 Created By BaoXinjian

  3. PLSQL_闪回操作1_Flashback Query

    2014-07-02 Created By BaoXinjian

  4. oralce闪回

    Oracle闪回操作 1. 记录当前时间或SCN 在数据库变动前记录时间或SCN SQL> select  to_char(sysdate,'YYYY-MM-DD HH24:mi:ss') fr ...

  5. Oracle闪回操作

    Oracle闪回操作 1. 记录当前时间或SCN 在数据库变动前记录时间或SCN SQL> select  to_char(sysdate,'YYYY-MM-DD HH24:mi:ss') fr ...

  6. MYSQL工具之binlog2sql闪回操作

    文档结构: 在生产环境中如果遇到误删,改错数据的情况,利用mysql闪回工具binlog2sql,可以实现数据的快速回滚,从binlog中提取SQL,并能生成回滚SQL语句.Binlog以event作 ...

  7. PLSQL_闪回操作6_Flashback Database

    2014-12-09 Created By BaoXinjian

  8. PLSQL_闪回操作5_Flashback Table

    2014-12-09 Created By BaoXinjian

  9. Oracle的闪回操作

    Oracle10g中引入了闪回技术,但这并不意味着所有的表都能闪回成功,当没有足够的磁盘空间,Oracle将使用回收站中的磁盘空间,而且位图连接索引和引用完整性约束也不受回收站的保护. recycle ...

随机推荐

  1. spark2.2jdbc写入mysql 的两种方法(append,Overriedwrite)-不用Mysql建表

    import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{SQLContext, SaveMode} ...

  2. 利用Backtrace来捕获段错误堆栈信息

    具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280 测试Demo: #include <execinfo.h> #i ...

  3. 同样的so,放到不同的project中,就会报错

    网上看到的帖子,笔记一下 最近在看蓝斯的一篇文章基于Platinum库的DMS实现(android) 把其中的so文件直接拷贝到了另外一个project中,jin文件也一样,唯一不同的是包名. 运行报 ...

  4. Nginx-nginx和反向代理

    使用版本:nginx-1.10.2(windows环境使用稳定版本) 下载地址:http://nginx.org 什么是nginx? Nginx (engine x) 是一款轻量级的Web 服务器 . ...

  5. 实现调用Android手机的拍照功能

    很简单,直接上示例吧 1 xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  6. WP8.1学习系列(第二十七章)——ListView和GridView入门

    快速入门:添加 ListView 和 GridView 控件 (XAML)   在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图 ...

  7. libuv示例代码

    https://github.com/nikhilm/uvbook/tree/master/code

  8. Arduino数字引脚作为GPIO的使用

    引脚与GPIO的关系 引脚(pin)是对芯片的外部物理接口的一个称呼,它是在不把这个物理接口投入到具体应用场合下的称呼.例如,我们可以说,某某芯片的P1.5引脚可以作为数字输出驱动外部数字设备,也可以 ...

  9. modbus调试工具

    1,简介 网站地址:http://www.modbustools.com/ 该网站提供了几个软件工具,可以运行于windows 2000/XP/Vista/7环境下,用来测试和仿真Modebus设备. ...

  10. iOS - 富文本直接设置文字的字体大小和颜色

    富文本效果图: 富文本实现代码: UILabel *orderSureLabel = [Common lableFrame:CGRectZero title:] textColor:[UIColor ...