在第24篇文章中,我们提到如果是使用delete语句误删了数据行,可以用Flashback工具通过闪
回把数据恢复回来。
Flashback恢复数据的原理,是修改binlog的内容,拿回原库重放。而能够使用这个方案的前提
是,需要确保binlog_format=row 和 binlog_row_image=FULL。
具体恢复数据时,对单个事务做如下处理:
1. 对于insert语句,对应的binlog event类型是Write_rows event,把它改成Delete_rows event
即可;
2. 同理,对于delete语句,也是将Delete_rows event改为Write_rows event;
3. 而如果是Update_rows的话,binlog里面记录了数据行修改前和修改后的值,对调这两行的
位置即可。
如果误操作不是一个,而是多个,会怎么样呢?比如下面三个事务:
现在要把数据库恢复回这三个事务操作之前的状态,用Flashback工具解析binlog后,写回主库
的命令是:
也就是说,如果误删数据涉及到了多个事务的话,需要将事务的顺序调过来再执行。
需要说明的是,我不建议你直接在主库上执行这些操作。需要说明的是,我不建议你直接在主库上执行这些操作。
恢复数据比较安全的做法,是恢复出一个备份,或者找一个从库作为临时库,在这个临时库上执
行这些操作,然后再将确认过的临时库的数据,恢复回主库。
为什么要这么做呢?
这是因为,一个在执行线上逻辑的主库,数据状态的变更往往是有关联的。可能由于发现数据问
题的时间晚了一点儿,就导致已经在之前误操作的基础上,业务代码逻辑又继续修改了其他数
据。所以,如果这时候单独恢复这几行数据,而又未经确认的话,就可能会出现对数据的二次破
评论