误删数据怎么办??
误删数据分为以下几种:
1.使用delete语句误删
2.使用drop table或者truncate table语句误删
3.使用drop database误删
4.使用rm命令误删整个MySQL实例(rm命令是Unix和Linux操作的命令,表示强制删除文件)
误删行
若使用了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中包含了修改前和修改后的值,将其对调即可
如果误删多个比如:
(A)delete....
(B)insert...
(C)update....
使用Flashback解析binlog后写回主库命令
(reverse C)update...
(reverse B)delete...
(reverse A)insert...
若涉及到多个事务,需要将事务顺序调过来执行
但是不建议在主库上面执行挫折,对于单独恢复的这几行数据,未加确认可能会对数据进行二次破坏,建议在备库上使用,确认后再回复到主库当中。
事前预防操作:将sql_safe_update设为on,若是忘记在delete和Update语句当中写where条件,where条件无索引字段的时候,这条语句就会执行报错,并且代码上线前需要经过SQL审计。
注意:若是将sql_safe_updatas设置为on,要删除全表的时候,需要确定删除操作没问题,可以在delete语句当中加入where条件,比如where id>=0
delete全表是很慢的,需要生成回滚日志,优先考虑drop /truncate table命令,但是使用delete删除可以使用Flashback恢复,使用drop /truncate table命令不可以恢复,因为即使让binlog格式为row,记录的仍然是statement格式,所以没办法恢复。
-
误删库、表
这种情况喜爱,要回复数据,就得使用全量备份,加赠量日志的方式,这种方案需要使用定期的全量备份,并且实时备份binlog。
这两种情况齐全的情况下:1.取最近的一次全量备份,假设为一天一备份
2.使用备份恢复一个临时库
3.从binlog当中取出0点以后的文件,除去误删的操作语句,全部应用到临时库当中即可。
注意几点:
1.为了加速数据恢复,如果这个临时库上有多个数据表,可以使用mysql binlog命令的时候加上一个-database参数,用于指定误删表所在的库,这样就避免了回复日志的时候应用其他库日志的情况。
2.在应用日志的时候需要跳过12点的binlog语句:
- 原实例无GTID模式,只能在应用到12.的binlog文件时候先使用-stop-position参数执行到误操作之前的日志,再使用-start-position从误操作之后的日志执行。
- 使用了GTID模式,假设操作命令的GTID为gtid1,只需要set gtid_next=gtid1;begin;commit即可,先将这个GTID加到临时实例的GTID集合,之后按照顺序执行binlog时候,就会自动跳过这个误操作的语句
使用mysql binlog方法恢复不够快,因为mysql binlog攻击并不能只解析一个表的日志,使用mysql binlog为单线程,并行复制不可用。
对于这种情况,我们可以在start slave之前 先 change replication filter replicate_do_table(table_name)让临时库只同步误操作的表,这样做也可以加入并行复制的技术加速复制。
binlog备库到线上备库在由于时间太久会删除。临时需要写的binlog实例可以从binlog备份当中找到下载。
假如需要的binlog是从master.005开始的,但是我们在备库上执行show binlogs后,显示的最早的binlog为master.007,这意味这master.005和master.006丢失,我们就需要去binlog备份当中下载,在下载完成后,打开日志目录下的master.index文件,在文件开头加入“/.master.005”“/.master.006”重启即可。
延迟复制备库
库的备份巨大或者操作时间和上一个备份的时间节点过大,这样误操作之后就算是进行并行复制需要的时间也是巨大的,若是有十分核心的业务,不允许太长时间,就会出现问题,我们可以通过change master to master_delay=N,这样操作下,可以指定备库保证跟主库有N秒的延迟,这样会恢复下只需要恢复N秒当中的操作即可。
RM删除数据
对于一个高可用的mysql集群,rm删除数据若只是删除了一个节点的数据,HA系统就会自动选择一个新主库来保持正常运行,是自动的。