传统的高可用架构是不能预防误删数据的,因为主库的一个drop table命令,会通过binlog传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。
虽然我们之前遇到的大多数的数据被删,都是运维同学或者DBA背锅的。但实际上,只要有数据操作权限的同学,都有可能踩到误删数据这条线。
今天我们就来聊聊误删数据前后,我们可以做些什么,减少误删数据的风险,和由误删数据带来的损失。
为了找到解决误删数据的更高效的方法,我们需要先对和MySQL相关的误删数据,做下分类:
-
使用delete语句误删数据行;
-
使用drop table或者truncate table语句误删数据表;
-
使用drop database语句误删数据库;
-
使用rm命令误删整个MySQL实例。
误删行
如果是使用delete语句误删了数据行,可以用Flashback工具通过闪回把数据恢复回来。
Flashback恢复数据的原理,是修改binlog的内容,拿回原库重放。而能够使用这个方案的前提是,需要确保binlog_format=row 和 binlog_row_image=FULL。
具体恢复数据时,对单个事务做如下处理:
-
对于insert语句,对应的binlog event类型是Write_rows event,把它改成Delete_rows event即可;
-
同理,对于delete语句,也是将Delete_r