||
闪回的业务价值是,在DBA执行错误的数据提交操作之后,还能把数据恢复还原到之前某个时刻的状态,最大程度地挽回损失。
在MySQL中,binlog文件主要用于主从同步二进制数据日志。当主服务器数据发生变更时,会把变动明细持久化到binlog文件中,此时从服务器通过拉取并解析binlog文件,实现数据的同步。正是由于binlog文件中记录了数据变更的信息,因此MySQL的闪回是基于binlog文件来实现的。
说的更准确一点,如果要在MySQL中实现闪回,则必须要求binlog文件日志格式是binlog_format=row
,并且binlog_row_image=full
。通过指定binlog文件的日志格式,就能在binlog中完整记录数据变化的轨迹和具体的操作行为(增删改)的前后差异。
基于上述前提,我们可以解析并处理binlog文件中的事件,然后反序遍历。同时对增删改进行反转逆操作,即插入映射成删除、删除映射成插入、更新交换新旧数据区间。最后输出对应数据回滚的binlog文件,将其再次导入mysql,即完成对增删改数据的回滚还原。
binlog是一个二进制文件,具体存放的路径,可以通过在mysql的客户端执行:show variables like '%datadir%'
,这个SQL语句来查看。这时结合上面的路径信息,在终端中可以输入:
# binlog文件存放路径 cd /home/mysql-server/bld_debug/install_debug/data/ # binlog.000006指要查看的binlog文件名 hexdump -C binlog.000006|more。
结果示例如下:
00000000 fe 62 69 6e ad 10 15 61 0f 01 00 00 00 79 00 00 |.bin...a.....y..| 00000010 00 7d 00 00 00 00 00 04 00 38 2e 30 2e 32 35 2d |.}.......8.0.25-| 00000020 31 35 2d 64 65 62 75 67 00 00 00 00 00 00 00 00 |15-debug........| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000040 00 00 00 00 00 00 00 00 00 00 00 ad 10 15 61 13 |..............a.| 00000050 00 0d 00 08 00 00 00 00 04 00 04 00 00 00 61 00 |..............a.| 00000060 04 1a 08 00 00 00 08 08 08 02 00 00 00 0a 0a 0a |................| 00000070 2a 2a 00 12 34 00 0a 28 01 ea d7 cf 01 ad 10 15 |**..4..(........| 00000080 61 23 01 00 00 00 1f 00 00 00 9c 00 00 00 80 00 |a#..............| ......
前面的4个字节fe 62 69 6e是魔数,标识文件类型是binlog。后面的二进制数据则表示事件,binlog中记录的事件类型主要有:
Enjoy GreatSQL :)
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com