MySQL模拟Oralce闪回操作

在前面的文章中我们介绍了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了。

[[email protected] ~]# mysqlbinlog --help | grep ‘\-B‘
  -B, --flashback     Flashback data to start_postition or start_datetime.
[[email protected] ~]# 

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

[[email protected] 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 [email protected]_COMPLETION_TYPE*/;

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

[[email protected] mysql]# mysqlbinlog -vv --start-position=337 mysql-bin.000023
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @[email protected]@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 [email protected]_COMPLETION_TYPE*/;
[[email protected] mysql]# 

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

[[email protected] mysql]# mysqlbinlog -B -vv --start-position=107 --stop-position=364 mysql-bin.000023 | mysql
[[email protected] 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

时间: 2024-10-10 13:47:53

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

oracle 表误更新 (flashback )闪回操作

--oracle  表误更新  闪回操作 测试环境 --select * from v$database; --select * from v$version; 操作第一步 1.如下命令启用行迁移 alter table test_a enable row movement; 2.如下命令闪回到某时间点 flashback table test_a to timestamp to_timestamp('2012-05-31 16:20:30', 'yyyy-mm-dd hh24:mi:ss');

Mysql闪回工具之binlog2sql的原理及其使用

生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成本也大. 当然还有其他的一些操作方法,我们今天有主角. MySQL 闪回工具 --   binlog2sql 用途 数据回滚 主从切换后数据不一致的修复 从 binlog 生成标准 SQL,带来的衍生功能 闪回原理简析 开始之前,先说说闪回.我们都知道 MySQL binlog 以 event 为单

Oracle的闪回技术--闪回错误的DML操作

提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在还原段中的时间:但是这也并不能完全保证指定的时间的数据一定能够被恢复,还原表空间没有足够的时间时,仍会覆盖要求保留的磁盘空间. 查看undo_retention的当前值: SQL> show parameter undo_retention NAME TYPE VALUE -------------

Flashback Database 闪回数据库

一.  Flashback Database 说明 Flashback Database 功能非常类似与 RMAN 的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于 Flashback log 日志. 比RMAN 更快速和高效. 因此 Flashback Database 可以看作是不完全恢复的替代技术. 但它也有某些限制:(1)Flashback Database 不能解决 Media Failure, 这种错误 RMAN 恢复仍是唯一选择.(2)如果删除了数据文

Oracle闪回技术详解

概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEGMENT) 在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段.因为大部分闪回技术

[转]Oracle DB执行闪回数据库

? 配置闪回数据库 ? 执行闪回数据库操作 ? 监视闪回数据库 闪回数据库 闪回数据库操作: ? 作用类似于数据库的倒带按钮 ? 可以在用户造成了逻辑数据损坏的情况下使用 闪回数据库 使用闪回数据库,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到那个时间的状态.因为不需要还原备份,所以此操作速度很快.可以使用此功能还原导致逻辑数据损坏的更改. 使用闪回数据库时,Oracle DB 可使用过去的块映像回退对数据库的更改.在正常数据库操作期间,Oracle DB 会不定期地将这些块

实验-闪回数据库

一.打开闪回数据库 1.确保数据库处于归档模式,如果为非归档模式,将数据库转换成归档模式 SQL> select name,log_mode from v$database; NAME LOG_MODE --------- ------------ ORCL NOARCHIVELOG SQL> select flashback_on from v$database; FLASHBACK_ON ------- NO 设置为归档模 Connected to Oracle Database 10g

ORACLE 10G 闪回建议

Flashback Tips The following tips and restrictions apply to using flashback features. Flashback Tips – Performance For better performance, generate statistics on all tables involved in a Flashback Query by using the DBMS_STATS package, and keep the s

PLSQL_闪回删除FlashBack Delete表误删除如何进行恢复(案例)

2014-07-02 BaoXinjian 一.摘要 在PLSQL开发时,有时候会遇到对表中数据的误删除,其实遇到这种情况不需要紧张,如果问题较大,请DBA帮忙,如果只是小问题,只需自己处理,利用flashback闪回操作即可,可可将表进行恢复 在删除中数据时,系统会自动记录一个SCN和时间戳,按SCN和时间戳就可以查询出被误删除的资料 1.SCN 概念 SCN是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字.Oracle数据库中一共有4种SCN分别为 系统检查点SCN: 系