MySQL深入——21

误删数据怎么办??

误删数据分为以下几种:

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格式,所以没办法恢复。

  1. 误删库、表

这种情况喜爱,要回复数据,就得使用全量备份,加赠量日志的方式,这种方案需要使用定期的全量备份,并且实时备份binlog。

这两种情况齐全的情况下:1.取最近的一次全量备份,假设为一天一备份

2.使用备份恢复一个临时库

3.从binlog当中取出0点以后的文件,除去误删的操作语句,全部应用到临时库当中即可。

注意几点:

1.为了加速数据恢复,如果这个临时库上有多个数据表,可以使用mysql binlog命令的时候加上一个-database参数,用于指定误删表所在的库,这样就避免了回复日志的时候应用其他库日志的情况。

2.在应用日志的时候需要跳过12点的binlog语句:

  1. 原实例无GTID模式,只能在应用到12.的binlog文件时候先使用-stop-position参数执行到误操作之前的日志,再使用-start-position从误操作之后的日志执行。
  2. 使用了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系统就会自动选择一个新主库来保持正常运行,是自动的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下水道程序员

你的鼓励将是我奋斗的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值