使用bin-log恢复误删数据

  1. 错误执行update或者delete语句,造成整个表变化,传统使用全量备份+binlog增量备份恢复到删除以前的状态,如果数据量比较大的话,会造成恢复过程很复杂。
  2. 如果binlog-format是ROW的话,会有一种相对简单的方式来进行

0准备

0.1修改binlog-format为ROW

修改/etc/my.cnf
binlgo-format=ROW

0.2查看数据库中内容

我们模拟没有加where条件,直接删除tb_a中的数据


1.查看binlog相关内容

mysqlbinlog --base64-output=decode-rows -v -v --start-datetime=‘2016-08-25 15:30:00‘ mysql-bin.000004| grep -B 50‘### DELETE FROM `test_db`.`tb_a`‘| more


红色部分可以看到删除时用到的数据,其中@1、@2表示我们测试表中第一个和第二个字段

2.我们关心中间delete的部分,使用如下命令将中间部分保存下来

mysqlbinlog --base64-output=decode-rows -v -v --start-datetime=‘2016-08-25 15:30:00‘ mysql-bin.000004|sed -n ‘/end_log_pos 418/,/COMMIT/p‘|tail -n +2> recovery.binlog

3.查看recover.binlog内容

4.从binlog中反向整理出可执行的sql语句

cat recovery.binlog | sed -n ‘/###/p‘| sed ‘s/### //g;s/\/\*.*/,/g;s/DELETE FROM/\nREPLACE INTO/g;s/WHERE/SELECT/g‘|sed -r ‘s/(@2.*),/\1;/g‘|sed ‘s/@[1-9].*=//g‘>recory.sql

:@2表示最后一个字段


5.执行sql文件

source /data/mysql/recovery.sql

6查看执行结果

感谢贺春旸,思路和代码都来自他的文章,根据自己的实际情况,做了一次测试,非常成功。
再次感谢。

时间: 2024-11-01 02:23:31

使用bin-log恢复误删数据的相关文章

转 --- 恢复误删数据

曾经想实现Log Explorer for SQL Server的功能,利用ldf里面的日志来还原误删除的数据 这里有一篇文章做到了,不过似乎不是所有的数据类型都支持 以下为译文:http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/ 在我使用SQLSERVER的这些年里面,大部分人都会问我一个问题:“能不能恢复被删除的数据??” 现在,从SQLSERVER2005 或以上版本能很容易能够恢复被删除的数据

顺丰删库工程师遭开除,难道他不会恢复误删数据?

以下内容仅代表个人观点 顺丰删库事件回顾: 据悉,顺丰科技数据中心的一位邓某因误删生产数据库,导致某项服务无法使用并持续590分钟.事发后,顺丰将邓某辞退,且在顺丰科技全网通报批评.真实地玩了一把"从删库到跑路".毫无疑问地,我们又突然象被打了鸡血般,整了整衣领,挺了挺胸,存在感立马爆棚,拉个小板凳,就着中秋节的月光,絮絮叨叨地讲讲想当年. 好汉要提当年勇,回忆我们的牛X岁月 想当年,我国那啥机构,设备升级改造,生产库在线热迁,脚本写错,rm掉了,然后,我们XXX,全部恢复所有数据(此

mysqlbinlog恢复误删数据

概述 代码bug,在处理上传出现异常时执行了DELETE FROM t_resource WHERE resource_id = ? OR parent_id = ?因为OR条件导致用户的上传的所有数据被清空了. show 查看是否有开启log-bin备份 show variables like 'log_bin' 欣慰的是,已经开启了二进制日志备份.那接下来就简单多了,找到这个二进制日志,找到这个节点,去恢复它.执行这个命令,查看正在写入的二进制日志是哪个文件 show master stat

恢复ECS误删数据的最佳实践

1.1 背景知识 Linux删除说明 在 Linux 系统下,通过命令 rm -rf 可以将任何数据直接从硬盘删除,并且没有任何提示,同时 Linux 下也没有与 Windows 下回收站类似的功能,也就意味着,数据在删除后通过常规的手段是无法恢复的,因此使用这个命令要非常慎重.在使用 rm 命令的时候,比较稳妥的方法是: 1)把命令参数放到后面,这样有一个提醒的作用. 2)将要删除的东西通过 mv 命令移动到系统下的 /tmp 目录下,然后写个脚本定期执行清除操作 如上做法可以在一定程度上降低

Oracle- 查询误删数据

使用flashback table能恢复误删数据. flashback table CONTAINER_CONTENT to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss'); select * from CONTAINER_CONTENT as of timestamp (systimestamp - interval '900' minute) where article_no='2215507A31

linux下误删数据文件恢复

linux下文件被删除可以用很多工具进行恢复,例如undelete(适合ext2,ext3).giis(不能恢复安装giis之前的文件).ext3grep(仅限ext3).R-linux(支持ext3,但是需要操作系统是32位的).还有testdisk等等就不一一介绍了.需要注意的是,我们误删文件后,最好保持现场. 下面不用工具来恢复误删的数据文件: [email protected]>select * from zbdba; select * from zbdba * ERROR at lin

恢复MySQL数据到误删的表之前的数据

一.演示环境说明: 系统CentOS Linux release 7.2.1511 (Core) X_86 64位最小化安装mysql版本是官方二进制版本5.7.22-22,mysql采用的是二进制安装,单机上开启2个mysql实例,mysql实例要开启定时器event_scheduler=ON. 而且2个mysql实例都要开启Gtidxtrabackup 采用的是rpm包安装,版本是version 2.4.13 MySQL备份方式采用每天一次全量备份和binlog增量备份 二.模拟删除库,进行

CentOS 恢复 rm -rf * 误删数据(转)

一. 将磁盘分区挂载为只读 这一步很重要,并且在误删除文件后应尽快将磁盘挂载为只读.越早进行,恢复的成功机率就越大. 1.  查看被删除文件位于哪个分区 [root@localhost  ~]# mount /dev/mapper/VolGroup-lv_root on / type ext4(rw) /dev/mapper/VolGroup-lv_home on /home type ext4(rw) 2.  尝试将对应目录重新挂载为只读 [root@localhost  ~]#  mount

oracle 误删数据的恢复

误删数据的恢复 oracle恢复删除的数据 分为两种方法:scn和时间戳两种方法恢复. 一.通过scn恢复删除且已提交的数据 1.获得当前数据库的scn号 select current_scn from v$database; (切换到sys用户或system用户查询) 查询到的scn号为:1499223 2.查询当前scn号之前的scn select * from 表名 as of scn 1499220; (确定删除的数据是否存在,如果存在,则恢复数据:如果不是,则继续缩小scn号) 3.恢