MySQL数据误删除的总结

1. 使用delete语句

恢复方式:使用binlog,利用Flashback工具恢复,Flashback的原理是修改binlog拿到原库里回放,这个方案的前提是binlog_format=row 并且binlog_row_image=full

单个事务的处理:1.insert 对应的 write_row event 改成delete_row event
2.delete 对应的 delete_row event 改成write_row event
3.update binlog中记录了修改前和修改后的值,对掉位置就可以了

多个事务的处理注意调整事务的顺序,说完事后处理,下面说下事前预防:1.将sql_safe_updates设置为on,这样delete和update中无where子句的语句就会报错,生产如果要执行整表删除可以用truncate或者where 1=1。2.上线,必须做sql审计,至少也要在测试环境完成验证。

2. 使用drop、truncate删除表以及drop删除库

恢复方式:全量备份+binlog恢复,这里无法使用Flashback工具,原因是drop tabletruncate table 即使用的是binlog_format=row但在binlog中记录还是statement格式

恢复的技巧:因为使用mysqlbinlog无法指定表恢复,可以将全量恢复出的临时库做为主库的备库,然后指定表恢复,可以加快恢复速度。恢复方式:使用延迟复制的备库,5.6以后的功能通过change master to master_delay=N,N的单位是秒。

change master to master_delay=N