知识点:什么是数据库的闪回
闪回功能是oracle的功能,允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,如Word中的"撤消"操作,可以不利用备份就快速的实现基于时间点的恢复。mysql本身不支持,前淘宝的楼方鑫 通过反转binlog记录(binlog为row格式),模拟了这功能,给mysqlbinlog命令打patch 增加了一个 -B选项来实现。
打过补丁的mysqlbinlog下载地址:http://pan.baidu.com/s/1nutwWg5 (mysql 5.6的版本)
本地下载地址为:mysqlbinlog下载
要精确恢复的话,使用--start-position=N 和--stop-position=N,确定 start-position和stop-position的方法,可以这么来快速定位,在客户端工具中,如:Navicat 中,连接上数据库,执行
show binlog events in 'master-bin.000001' 通过搜索表的名称快速定位如图:第一条可以从一个事务开始算起:

然后找到紧邻的最后一个高亮的位置下面的COMMIT 的 end_log_pos

最终mysql 精准 flash back 的命令如下:/root/mysqlbinlog -B --skip-gtids --start-position=454691 --stop-position=467616 master-bin.000001 |mysql -u root -p hyd
如果binglog日志很大的话(通常如此),使用上面这种方法可能会很慢,就不太合适,可以先通过 mysqlbinlog -v master-bin.000001 >pure.txt 然后通过vim打开pure.txt 搜索关键字
定位到start-position,然后再根据要恢复数据的条目数,定位到stop-position,主要的时候可能就花在了log pos的定位上面了
还有一点必须要注意,恢复的时候,一定要加上--skip-gtids ,去除gtid的干扰,当然如果你没有开启gtid ,就可以忽略了,如果开启了gtid的时候,必须加上,否则数据恢复是不成功的。这个地方一定切记
附加:快速定位误删的--start-position 和 --stop-position 是能否快速恢复的关键,这两个位置定位还需要有点技巧的
1,首先通过mysqlbinlog 根据时间定位出大致误删时间段的操作,还原出文本日志,然后在此文本中查找start-position 和stop-position,比如:
mysqlbinlog --base64-output=DECODE-ROWS -d demo --start-datetime='2018-06-22 10:20:00' --stop-datetime='2018-06-22 11:00:00' -v mysql-bin.000138>plain.txt
2,在plain.txt 中搜索 误删表的名称,定位到误删开始处,如图:

上一个事务结束标志xid=866323074 后面的at 757481064 即为此次误删操作的start-position
3,搜索结束start-position 可以做么做,光标定位在at 757481064 往下搜索DELETE 关键字,可以定位到第一个误删表数据的开始处,
上面元数据里面 end_log_pos 803525649 就是我们删表数据的最后一个position.
4,我们通过上面最后一条表数据的位置803525649 来搜索,这个数据的下面一个position就是我们要的stop-position

上面Xid=856323315 就是我们要的,通过这样可以比较快速的定位要恢复误删数据的起始和结束位置
总结
通过mysqlbinlog的B参数,生成相反的sql语句,实现mysql的部分闪回,可以尽量减少对生产环境的影响。
闪回的过程,可以总结为:
1. 通过命令"show binlog events in 'binlog'"确定闪回的start position和stop position。如果不确定选择的区间是否正确,可以通过mysqlbinlog命令查看解析的sql是否是自己需要的
2. 闪回之前,最好对线上的环境进行备份,防止出现因闪回不当,造成的其他数据损失
3. 确认好闪回区间后,执行命令:mysqlbinlog -v -B --start-position=0 --stop=position=1 /home/mysqll/binlog|mysql test对数据库进行闪回
注:闪回功能只支持闪回insert update 和delete
连接: