之前我们如果要撤销某个操作,可能需要使用一个 备份 + binlog 的方式(前滚的方式)。但是很可能我们仅仅需要撤销的是几分钟前的操作,采用前滚的方式恢复是比较耗时间的。
处理这种问题我们可以使用 Flashback(闪回)技术。MySQL官方版本中并不提供Flashback(闪回)的功能,所以这里我们使用网易的 innosql 版本中的 mysqlbinlog -B 的功能,来实现 Flashback(与原版 mysqlbinlog 完全兼容,但提供了 -B 选项对日志进行反向解析以支持闪回)。
示例:
# mysqlbinlog -vv -B bin.000014 --start-position=316 | mysql
mysqlbinlog -B 只能对 DML 语句进行闪回,MySQL 如果要支持闪回 DDL,需要修改源码。innosql 中的闪回DDL操作是通过 Recycle Bin Tablespace 的方式实现的(可以简单理解为回收站)。
在主从 MySQL 中,假设 Master 宕机了,切到了 Slave,假如主有部分数据没有传输到从,Master 恢复后,主重做了事务,那我们就需要将主的部分数据 Flashback,那 Flashback 开始的位置就很重要了,这个位置一般以 Slave 上 SQL 线程最终回放完的位置为准。
mysql> show slave status\G
Relay_Master_Log_File: bin.000003 <-- 回放到的对应的文件
Exec_Master_Log_Pos: 425 <-- 回放到的文件对应的位置
在等待 Slave 回放完以后,通过 Relay_Master_Log_File 和 Exec_Master_Log_Pos 的值,就可以知道 Master 上需要 Flashback 掉的位置。