使用 row 格式 binlog 撤销操作

MySQL 在使用 row 格式,并使用默认的 binlog_row_image=full 的时候,binlog 中记录了完整的更新前后的数据镜像。因此,根据 row 格式 binlog 进行撤销操作是可行的。我就试着做了这么个工具

[GitHub 页面] [linux 二进制文件]

例如

./binlog_undo -f /data/mysql/log-bin.000004 -p 3958 -o binlog.out

会扫描 /data/mysql/log-bin.000004 从位置 3958 到末尾的所有事务,倒转其中所有事务顺序和每个事务中的语句顺序,并反向所有的操作,把 WRITE 和 DELETE 反转,把 UPDATE 的前后镜像互换,然后将生成后的 binlog 文件写入 binlog.out 中。之后就可以用 mysqlbinlog 工具来回放这个 binlog 来撤销操作了。

这个工具可以用于在主备切换后,撤销掉原主上未同步到备的操作,避免完全重建;也可以作为误操作的后悔药。

3 thoughts on “使用 row 格式 binlog 撤销操作

  1. andy October 27, 2016 / 7:42 pm

    这个工具5.7.16下无法使用!~
    [root@xxxx binlog_undo.linux.x86_64]# ./binlog_undo -f /bak/mysql/3306/binlog/mysql-bin.000001 -p 123 -o binlog.out
    scanning events
    @4 FORMAT_DESCRIPTION_EVENT(15) size: 119; next pos: 123
    @123 PREVIOUS_GTIDS_LOG_EVENT(35) size: 31; next pos: 154
    meet unexepted binlog event type

    • 神仙 November 8, 2016 / 2:43 pm

      试试最新的 release 0.1.4

  2. oliver November 25, 2016 / 3:30 pm

    如果可以分别指定 start-position stop-position 就好了.

Leave a comment