参考:http://wubx.net/?s=mysqlbinlog
mysql官方的mysqlbinlog没有回滚的功能,淘宝大牛对官方代码进行了修改使之能够将binlog中的DML操作变成互逆的语句,比如delete变为insert,update的set和where的互换。不过注意前提是binlog的格式必须是binlog_format=ROW
另外注意导入回滚数据较多时,需要调整超时时间和最大package的大小:
binlog_format=ROW
max_allowed_packet=1024M
#max_allow_packet大小不够时报错如下:
ERROR 1153 (08S01) at line 403133: Got a packet bigger than ‘max_allowed_packet’ bytes
重构代码
http://mysql.taobao.org/index.php/Patch_source_code#Add_flashback_feature_for_mysqlbinlog
有三个版本,测试percona5518版本可以使用5.5.18_flashback_all.diff,mysql官方版本只能使用5.5.18_flashback.diff。
http://mysql.taobao.org/images/5/53/5.5.18_flashback_all.diff
http://mysql.taobao.org/images/0/0f/5.5.18_flashback.diff
percona5.5.18版本的下载链接:
mysql5.5.18
http://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.18.tar.gz
cd mysql-5.5.18/ wget http://mysql.taobao.org/images/0/0f/5.5.18_flashback.diff patch -p0 < 5.5.18_flashback.diff
## 编译成功无报错即可,无特殊编译参数要求
编译完成后,开始测试:
[root@server1 /]# /percona5518/bin/mysqlbinlog --help
在说明中多了
-B, --flashback Flashback data to start_postition or start_datetime.
然后可以用一个binlog文件做测试
mysql> select count(1) from t1; +----------+ | count(1) | +----------+ | 16 | +----------+ 1 row in set (0.00 sec) mysql> select * from t1 where id<5; +----+------+------+ | id | a | b | +----+------+------+ | 1 | aaaa | bbbb | | 2 | aaaa | bbbb | | 3 | aaaa | bbbb | | 4 | aaaa | bbbb | +----+------+------+ 4 rows in set (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.11 sec) mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000010 Position: 108 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) mysql> update t1 set a='XXXX',b='SSSS' where id<5; Query OK, 4 rows affected (0.04 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> flush logs; Query OK, 0 rows affected (0.09 sec)