先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想固然的我没有在测试平台上测试,直接操做了正式系统(的确是我不严谨),致使好多数据异常,页面展现错乱了。因而我想到的第一个就是进行备份还原。项目进行了7天的备份,天天凌晨自动备份,可是凌晨到如今的数据就会丢失了,这但是重大问题啊。我顿时慌了,因而只能寻求DBA的帮助。这边省略五百字。。。mysql
最后问题解决了,让我对数据恢复产生了兴趣,听DBA讲用的方法是Flashback闪回工具,也简单,因而我也自学了一下,这边作个介绍。sql
flashback能够把数据库恢复到之前某个时间点(或者说某个binlog的某个pos)。好比忘了带where条件的update、delete操做,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。这里有个注意点,DDL语句是不支持进行flashback的,谨慎操做。数据库
先讲讲所谓的闪回是什么意思,了解他的原理是什么。安全
其实很简单,至关于回滚,MySQL的binlog以event的形式,记录了MySQL中全部的变动状况,利用binlog咱们就可以重现所记录的全部操做。flashback工具(-B 参数)可对rows格式的binlog能够进行逆向操做,将已执行的delete语句反向生成insert语句,将update语句生成反向update语句,将insert语句反向生成delete语句。这里提一句,binlog是有三种格式的:函数
注意:使用mysqlbinlog flashback 工具必须设置:binlog_format = row。若是误操做的事务是由多个event组成的,那么必须将整个事务倒序恢复,即从最后一个event恢复到第一个event。工具
使用方法:测试
第一步:安装flashbackui
MySQL自己是不自带flashback的,咱们须要进行本身安装。下载地址:https://pan.baidu.com/s/1U33OO79RjBMJPSi0dDpKdgspa
将mysqlbinlog文件移至mysql安装路径的bin目录下,执行mysqlbinlog --help(自行解决报错),无任何报错后再执行mysqlbinlog -V,看是否mysql是否版本发生了变化,且多了一个 -B 参数,这样就装完了。日志
第二步:测试效果
随便建一张表,好比叫frame_ou
create table frame_ou(
ouguid varchar(50) not null,
ouname varchar(20),
oulevel int(5)
)
咱们往里面插入一条数据,insert into frame_ou values('111','组织部',1);
看下binlog里面,能够看到这句插入语句mysqlbinlog -vv mysql-bin.000004
1 ### INSERT INTO `test`.`frame_ou` 2 ### SET 3 ### @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0 */ 4 ### @ouname='组织部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */ 5 ### @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */
而后执行下flashback mysqlbinlog -vv mysql-bin.000004 -B,而后就会发现
### DELETE FROM `test`.`frame_ou` ### WHERE ### @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0 */ ### @ouname='组织部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */ ### @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */
同理,delete操做将会被转换为insert,update被转换为反向的update;若在一个事务中既有insert、update、delete语句,经过使用-B参数后,不只三种DML语句完成了逆向转换,而且语句顺序也会发生颠倒。
在binlog中找到误操做的pos变化区间后,使用mysqlbinlog -B 恢复:
# mysqlbinlog -B --start-position=431 --stop-position=509 mysql-bin.000004 | mysql -uroot -p
注意事项:
1) binlog_format=row
2) 只支持insert、update、delete
3) 不支持drop 、truncate、alter等DDL语句