本机用的Navicat连mysql测试DB又连了正式DB,因为本地与正式要频繁操作所以都打开了很多查询,本来要DELETE删除测试DB的数据,没看清在正式环境执行了。共删除了325条数据,然后在网上找恢复数据的办法,一定要是DELETE删除的,如果用的是drop table删除表是没办法恢复的,本次操作是Windows,如果是Liunx下的Mysql过程流程完全一样,也可以胡考的,具体恢复流程如下

第一步:先查看binlog功能是否开启

show variables like '%log_bin%';

如果为log_bin为ON说明可以恢复,如果为OFF说明没有开启binlog,也没有预先生成回滚SQL,那可能真的无法快速回滚了,GAMEOVER,下面的不用看了(好像可以通过ibd恢复,具体可以参考 https://blog.csdn.net/hanjun0612/article/details/102466509 )。

  第二步:查看数据文件存方路径

show variables like '%datadir%';

打开数据库所在路径查看有mysql-bin.****这样的文件,注意DELETE删除的时间,对比mysql-bin文件的修改时间,我的是26号下午18点左右进行的删除数据,所以找mysql-bin.000028这个文件

  第三步:找到mysql安装目录

show variables like "%basedir%";

CMD命令符进行Mysql安装目录下,找到mysqlbinlog.exe,如果没有说明你安装的是假mysql.

  第四步.通过mysqlbinlog 恢复删除的数据日志记录

mysqlbinlog --base64-output=decode-rows -v --database=DBName --start-datetime="2019-11-26 18:00:00" --stop-datetime="2019-11-26 18:10:00" D:\MySQL\Data\mysql-bin.000028 > mysqllog.sql
mysqlbinlog 命令的参数说明
--base64-output=decode-rows //数据转换正常的字符,如果不设置这个参数将显示base64的数据
--database=DBName //数据库名(一个mysql数据库比较多,指定方便恢复)
--start-datetime="2019-11-26 18:00:00" //恢复起始时间
--stop-datetime="2019-11-26 18:10:00" //恢复结束时间
D:\MySQL\Data\mysql-bin.000028 //为数据恢复的日志文件
mysqllog.sql //恢复以后我们需要的文件名

执行以后如下图:

打开mysqllog.sql文件,搜索 DELETE 关键字,找到被删除数据,看到这些数据以后总算放心了,如下图:

 第五步:把mysqllog的DELETE转换为Insert语句,这个在liunx下操作方便(有人用python转换也可以),把文件mysqllog.sql复制Liunx下

cat mysqllog.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' > mysqllogOK.sql

转换以后打开mysqllogOK.sql文件,因为批量替换前面多个一个分号,去掉以后,把所有生成的Insert语句在navicat下执行即可恢复所有DELETE删除的数据。

如果没有liunx可以在windows下用vbs来实现,把下面代码复制保存为:delete2insert.vbs 文件(一定要是.vbs格式文件) 与mysqllog.sql在同一目录下,然后双击运行,会生成mysqllogOK.sql文件就是我们要的INSERT语句

'==========================
'用VBS实现 MYSQL binglog DELETE转INSERT
'==========================
function replaceregex(patern,str,tagstr)
dim regex,matches
set regex=new regExp
regex.pattern=patern
regex.IgnoreCase=true
regex.global=true
matches=regex.replace(str,tagstr)
replaceregex=matches
end function '======Mysql binlog DELETE转INSERT================
'VBS打开文本文件
Set oldStream = CreateObject("ADODB.Stream")
oldStream.CharSet = "utf-8"
oldStream.Open
oldStream.LoadFromFile("mysqllog.sql") 'binLog生成的DELETE原日志文件
oldText = oldStream.ReadText()
newText=replace(oldText,"### DELETE FROM", ";INSERT INTO")
newText=replace(newText,"### WHERE", "SELECT")
newText=replace(newText,"###", "")
newText=replace(newText,"@1=", "")
newText=replaceregex("\@[1-9]=",newText, ",")
newText=replaceregex("\@[1-9][0-9]=",newText, ",")
oldStream.Close
'VBS保存文件
Set newStream = CreateObject("ADODB.Stream")
newStream.Type = 'Specify stream type - we want To save text/string data.
newStream.Charset = "utf-8" 'Specify charset For the source text data.
newStream.Open 'Open the stream And write binary data To the object
newStream.WriteText newText
newStream.SaveToFile "mysqllogOK.sql", 'DELETE转成INSERT以后的新的SQL文件名
newStream.Close

总结:   

1.不要随便用DELETE,数据做用字段做删除标记,不用使用DELETE删除数据,如果非要删除,删除前一定先备份一下数据

2.数据库做好定时备份,如果数据库不大,可以一小时备份一次,再大也可以每天备份一次

3.做事细心,越熟练的事越要细心,本次DELETE导致的加班,就是以为自己对sql熟练就随意操作。

4.也是最重要的一点,一定要Mysql开启binlog功能

如果没开启binlog功能的赶紧开启一下吧,mysql开启binLog功能方法(windows),打开my.ini文件,添加如下配置,重启mysql即可开启

# log-bin
log-bin=mysql-bin
binlog_format = ROW

一句DELETE引发的加班(Mysql 恢复Delete删除的数据)的更多相关文章

  1. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  2. window下Mysql 恢复Delete删除的数据

    转载:https://www.cnblogs.com/q149072205/p/11940591.html 本机用的Navicat连mysql测试DB又连了正式DB,因为本地与正式要频繁操作所以都打开 ...

  3. ORACLE数据库误操作DELETE并且提交数据库之后如何恢复被删除的数据

    一:根据时间来恢复: 1.查询数据库当前时间() select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 2.查询删除数据时间点之前的数据 ...

  4. Oracle使用fy_recover_data恢复truncate删除的数据

    (一)truncate操作概述 在生产中,truncate是使用的多的命令,在使用不当的情况下,往往会造成表的数据全部丢失,恢复较为困难.对于truncate恢复,常见的有以下几种方法可以进行恢复: ...

  5. mysql语句中----删除表数据drop、truncate和delete的用法

    程度从强到弱 1.drop  table tb        drop将表格直接删除,没有办法找回 2.truncate (table) tb       删除表中的所有数据,不能与where一起使用 ...

  6. Oracle 恢复被删除的数据,解决误操作删除数据

    在删除数据的时候不小心,把delete语句执行错了,把别的表给delete,而且还执行了commit!真汗.......数据是相当的重要........废话少说了!赶快找方法吧: 第一种: 1.打开F ...

  7. 学习笔记:MySQL Big DELETEs 删除大量数据

    原文地址:http://mysql.rjweb.org/doc.php/deletebig Table of Contents The ProblemWhy it is a ProblemInnoDB ...

  8. MySQL 数据库中删除重复数据的方法

    演示数据,仅供参考 查询表结构: mysql> desc test; +-------+------------------+------+-----+---------+----------- ...

  9. Mysql定时器定时删除表数据

    由于测试环境有张日志表没定时2分钟程序就狂插数据,导致不到1一个月时间,这张日志表就占用了6.7G的空间,但是日志刷新较快,有些日志就没什么作用,就写了个定时器,定期删除这张表的数据 首先先查看mys ...

随机推荐

  1. 查找发布地图的 REST URL并查询相关信息

    1.登录ArcGIS Server Manager 2.登录后,里面是以前自己发布的地图服务 3.点击自己发布的地图,然后按下功能选项,再点击箭头来找到URL 4.点击进去,分别能从红圈中找到相关的信 ...

  2. QNetworkRequest加Authorization头,适应Rest风格的API

    Rest是无状态的.Rest的请求之间不应该有依赖,在调用一个请求前,不需要一定要去提前调用另外一个请求.Rest里面不应该有 session,特别是Rest请求不应该保存信息在sesssion里,以 ...

  3. c语言的全排列

    在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧.估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了.如果你 ...

  4. springboot中http 的get post put delete请求

    组合注解(RequestMapping的变形) @GetMapping = @RequestMapping(method = RequestMethod.GET)@PostMapping = @Req ...

  5. 最长上升子序列(LIS: Longest Increasing Subsequence)

    示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 从网上找的一段代码(我由java改为了C++版本),原作者 ...

  6. 4.Java基础_Java类型转换

    import javax.swing.plaf.synth.SynthMenuBarUI; /* 类型转换 自动类型转换: 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量 强制类型 ...

  7. 【bzoj2648】SJY摆棋子(kdtree)

    传送门 题意: 二维平面上有若干个点. 现在要维护一种数据结构,支持插入一个点以及询问其余点到某个点的最小曼哈顿距离. 思路: 这是个\(kdtree\)模板题. \(kdtree\)是一种可以高效处 ...

  8. c# WF 第11节 RichTextBox

    本节内容: 1:RichTextBox的简介: 2:实例 1:RichTextBox的简介: 2:实例 实现实例: 1个RichTextBox  2个label  9 个button 步骤一: 步骤2 ...

  9. day49_9_10jQuery剩余

    一.表单筛选器. 在jQuery中有,专门对表单中的元素,进行筛选的表单筛选器. 其实使用基本筛选器也可以筛选出相应的元素,但是,为了jQuery的简便性,以及对表单操作的频繁,这里可以使用专门的筛选 ...

  10. 关于appium的简单理解

    搭建好appium环境后,要学会定位app页面上的元素.下面是2款元素定位工具 uiautomatorviewer   -- Android SDK自带的元素定位工具,由Google开发的 Inspe ...