之前我们如果要撤销某个操作,可能需要使用一个 备份 + 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 掉的位置。

-- By 许望(RHCA、OCM、VCP)
最后修改:2019 年 12 月 24 日 08 : 14 PM
如果觉得我的文章对你有用,请随意赞赏