热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql执行delete操作后如何恢复_MySQL【Delete误操作】数据恢复【转】

前言:操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和binlog差来恢复,等不了,很费时。这里先说明下因为Delete操作的恢

前言:操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和binlog差来恢复,等不了,很费时。这里先说明下因为Delete 操作的恢复方法:主要还是通过binlog来进行恢复,前提是binlog_format必须是Row格式,否则只能通过备份来恢复数据了。

方法:

条件:开启Binlog,Format为Row。

步骤:

1.通过MySQL自带工具mysqlbinlog 指定导出操作的记录:

mysqlbinlog --no-defaults --start-datetime='2017-03-16 14:56:00' --stop-datetime='2017-03-16 14:57:00' -vv mysql-bin. > /tmp/restore/binlog.txt

2.数据取出来之后,需要把数据解析反转,原始数据:

### DELETE FROM test.me_info

### WHERE

### @= /* INT meta=0 nullable=0 is_null=0 */

### @='1984:03:17' /* DATE meta=0 nullable=1 is_null=0 */

### @=NULL /* DATE meta=765 nullable=1 is_null=1 */

### @=-- :: /* DATETIME meta=0 nullable=0 is_null=0 */

### @='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */

### @= /* TINYINT meta=0 nullable=1 is_null=0 */

### @='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */

### @=- () /* INT meta=0 nullable=1 is_null=0 */

### @= /* MEDIUMINT meta=0 nullable=1 is_null=0 */

### @=NULL /* MEDIUMINT meta=0 nullable=1 is_null=1 */

### @= /* TINYINT meta=0 nullable=1 is_null=0 */

### @= /* TINYINT meta=0 nullable=1 is_null=0 */

### @='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */

### @='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */

### @= /* MEDIUMINT meta=0 nullable=1 is_null=0 */

### @= /* INT meta=0 nullable=1 is_null=0 */

……………………

……………………

……………………

Row格式的binlog记录的格式如上面所示,需要做的工作就是吧Delete的操作转换成Insert操作,发上面的都是有一定规律的,并且需要注意的是:

1、字段类型 DATETIME 日期。在日志中保存的格式为 @4=2017-03-16 00:00:00,需要将2017-03-16 00:00:00加上引号。

2、负数。在日志中保存的格式为 @1=-1 (4294967295), -2(4294967294),-3(4294967293),需要将括号里面的数据去掉,只保留@1=-1。

3、转义字符集。如:'s,\,等。

上面3点清楚之后,可以写一个脚本(水平有限,在提升中,写的不好看):

#!/bin/env python

# -*- encoding: utf-8 -*-

#-------------------------------------------------------------------------------

# Name: restore_insert.py

# Purpose: 通过Binlog恢复Delete误操作数据

#-------------------------------------------------------------------------------

def read_binlog(file,column_num):

f=open(file)

num = '@'+str(column_num)

while True:

lines = f.readline()

if lines.strip()[0:3] == '###':

lines=lines.split(' ',3)

if lines[1] == 'DELETE' and lines[2] =='FROM': #该部分替换Delete为Insert

lines[1] = "INSERT"

lines[2] = 'INTO'

lines[-1] = lines[-1].strip()

if lines[1].strip() == 'WHERE':

lines[1] = 'VALUES ('

if ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] <> num: #num为列数,要是小于最大的列数,后面均加,

lines[3] = lines[3].split('=',1)[-1].strip()

if lines[3].strip('\'').strip().find('\'') <> -1:

lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','\\\\').replace('\'','\\\'') #这里过滤掉转义的字符串

lines[3] = '\'' + lines[3] + '\','

elif lines[3].find('INT meta') <> -1: #过滤Int类型的字段为负数后带的(),正数不受影响

lines[3] = lines[3].split('/*')[0].strip()

lines[3] = lines[3].split()[0] + ','

elif lines[3].find('NULL') <> -1:

lines[3] = lines[3].split('/*')[0].strip()

lines[3] = lines[3] + ','

else:

lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','\\\\').replace('\'','\\\'') #这里过滤掉转义的字符串

lines[3] = '\'' + lines[3].strip('\''' ') + '\','

if ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] == num: #num为列数,要是小于最大的列数,后面均加);

lines[3] = lines[3].split('=',1)[-1].strip()

if lines[3].find('\'') <> -1:

lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','\\\\').replace('\'','\\\'') #同上

lines[3] = '\'' + lines[3] + '\');'

elif lines[3].find('INT meta') <> -1: #同上

lines[3] = lines[3].split('/*')[0].strip()

lines[3] = lines[3].split(' ')[0] + ');'

elif lines[3].find('NULL') <> -1:

lines[3] = lines[3].split('/*')[0].strip()

lines[3] = lines[3] + ');'

else:

lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','\\\\').replace('\'','\\\'') #同上

lines[3] = '\'' + lines[3].strip('\''' ') + '\');'

print ' '.join(lines[1:])

if lines == '':

break

if __name__ == '__main__':

import sys

read_binlog(sys.argv[1],sys.argv[2])

执行脚本:方法:python 脚本名 binlog文件 字段数目

python restore.py binlog.txt > binlog.sql

命令行中的36 表示 需要还原的表的字段有36个,效果:

INSERT INTO test.me_info

VALUES (

2123269,

'1990:11:12',

NULL,

2,

'',

0,

'',

-1,

0,

340800,

1,

0,

'',

……

……

1,

NULL

);

最后还原:

mysql test

MySQL的delete误操作的快速恢复方法

1. 根据误操作时间定位binlog位置找到数据库的binlog存放位置,当前正在使用的binlog文件里面就有我们要恢复的数据.一般生产环境中的binlog文件都是几百M乃至上G的大小,我们不能逐行 ...

记一次生产mysql数据误操作恢复过程

提示:建议每次对数据库进行修改时都做下备份 注意:以下Mysql开启的是row格式的binlog日志,确定到误操作具体时间可能有些麻烦,默认的格式就能很快找出来.这里开启row的原因是还有一种更快的方 ...

mysql 防止update/delete误操作

身为一php开发攻城狮,常常涉及在应用中写update/delete语句,忘记加where,后果不堪设想. 还会出现在cml下直接操作mysql的情况,如果mysql 权限够大,一个update/de ...

sql server Delete误操作后如何恢复数据

声明:本文是根据别人的经验https://blog.csdn.net/dba_huangzj/article/details/8491327写的总结 说明:update和delete时没有加where ...

Oracle误操作 数据恢复

SELECT * FROM v$sqlarea //查询最近sql记录 SELECT r.FIRST_LOAD_TIME,r.* FROM v$sqlarea r ORDER BY r.FIRST_L ...

MySQL【Update误操作】回滚(转)

前言:      继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...

MySQL 误操作后数据恢复(update,delete忘加where条件)【转】

在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...

MySQL 误操作后数据恢复(update,delete忘加where条件)

在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

随机推荐

一篇笔记带你快速掌握面向对象的Javascript(纯手打)

/** * 创建对象 */ //1.工厂模式 //特点: //创建的对象无法识别其对象类型,不支持instanceof等判断方法,无法标识不同的对象 function createObj(name,s ...

设计模式-外观模式(Facade)

简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...

ubuntu thinkphp pathinfo 404等问题

这个问题 困扰了我一天,由于对nginx的配置文件中的各种变量不懂.配置起来很麻烦,从网上搜索的,感觉合适自己的不多!!! 找啊找啊..终于找一篇!!!! 我的环境: php ubuntu 12.04 ...

在输出视图中使用使用html注释会导致在Chrome中css失效

在做SportsStore例子时,在视图List.cshtml中使用了html注释,即 结果在加载css时,chrome浏览器中所有css效果都失效.IE不受影响. ...

Unigine 基础入门

1. 首先要搭建好开发环境: 1)Visual Stodio 已经安装了. 2). Microsoft Windows SDK 7.1 (for Windows 7): https://www.mic ...

install cuda5 on ubuntu12.04

1. sudo apt-get install libglapi-mesa 2. sudo apt-get install freeglut3-dev build-essential libx11-d ...

阶乘运算——ACM

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

【模板】Tarjan求强连通分量

有人说这篇博客不是很友好,所以我加了点解释,感觉是不是友好多了? dfn[u]表示节点u在dfs时被访问的次序. low[u]表示节点u能够追溯到的最远的祖先的dfn. ins[u]表示节点u是否在栈 ...

Springmvc_validation 效验器

springmvc-validation效验器的使用介绍 对于任何一个应用来说,都会做数据的有效性效验,但是只在前端做并不是很安全,考虑到安全性這个时候会要求我们在服务端也对数据进行有效验证,spri ...

Linux显示包含全部的文件系统

Linux显示包含全部的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -a 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev ...


推荐阅读
  • 本文详细介绍了 Python 中字符串处理的各种技巧,包括查找、复制、替换、删除、截取、连接、比较、包含检测及大小写转换等操作。特别强调了如何使用 `strip()`、`lstrip()` 和 `rstrip()` 方法去除字符串中的空格和特殊符号,以及如何通过简单的赋值语句实现字符串的复制。此外,还提供了丰富的示例代码,帮助读者更好地理解和应用这些技巧。 ... [详细]
  • 在处理大数相加的问题时,有许多方法可以借鉴。本文介绍了两种不同的函数式编程方法:一种是从网络上找到的经典实现,另一种是作者自行设计的创新方案。通过函数式编程的方式重新实现了这两种方法,其中经典实现简洁明了,而创新方案则在性能和可读性方面有所提升。这些方法不仅适用于大数相加,还可以扩展应用于其他数值计算场景。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 深入探索 JavaScript 中 Array 数组对象的基本操作与应用
    深入探索 JavaScript 中 Array 数组对象的基本操作与应用 ... [详细]
  • 本文详细探讨了Java中Unicode编码的二进制转换方法及其具体实现。通过分析\u开头的字符串,解释了每组\uxxxx如何对应一个特定的Unicode字符,并提供了相关代码示例以加深理解。希望读者在实际开发中能有效应用这些知识。 ... [详细]
  • 在Python中,通过实现一个便捷的函数来解码Base64编码的数据,并将其转换为数组形式。该函数能够将Base64字符串解码为字节数组,便于进一步处理。例如,可以使用如下代码片段进行解码:`base64_decode_array('6gAAAOsAAAD')`。这为处理二进制数据提供了高效且简洁的方法。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 在Java编程中,`AbstractClassTest.java` 文件详细解析了抽象类的使用方法。该文件通过导入 `java.util.*` 包中的 `Date` 和 `GregorianCalendar` 类,展示了如何在主方法 `main` 中实例化和操作抽象类。此外,还介绍了抽象类的基本概念及其在实际开发中的应用场景,帮助开发者更好地理解和运用抽象类的特性。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 本文探讨了如何优化时间格式查询,特别是针对 `yyyyMM` 和 `yyyyMMdd` 类型的时间格式,提出了有效的方法来检索上一个月的数据。通过使用 `SimpleDateFormat` 和 `Calendar` 类,我们实现了一个高效的函数,该函数接收一个字符串参数(如 `yyyy-MM`),并返回上一个月的对应日期。此方法不仅提高了查询效率,还增强了代码的可读性和可维护性。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
author-avatar
晋coder
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有