MySQL数据库误删回滚的解决

某次一不小心,用了delete from xxx 删除了几条重要数据,在网上找了很多方法,但都比较零散,打算记录本次数据找回的过程。
大致分为以下几步

1、查看binlog是否开启

# log_bin是ON,就说明打开了 OFF就是关闭状态,以下操作,只有为 ON 时有效。
show variables like 'log_bin';

2、找到binlog文件名

show master logs;

运行以上代码,如下图 TS1-bin.000009 就是我们要找的文件名

3、查看binlog日志位置

show variables like '%datadir%';

4、根据上面得到的位置,去找到 TS1-bin.000009 文件

5、进入到mysql安装目录的bin目录下,执行以下命令根据误删除的时间范围从TS1-bin.000009文件导出成sql文件

mysqlbinlog --base64-output=decode-rows -v --database=数据库名 --start-datetime="2022-06-29 15:35:00" --stop-datetime="2022-06-29 15:45:00" C:/Users/Administrator/Desktop/TS1-bin.000009 > C:/Users/Administrator/Desktop/mysqllog.sql

这里我把 TS1-bin.000009 文件拷贝到了桌面,因为该文件原始存放路径有空格,导致命令执行失败,无法找到路径。
得到 mysqllog.sql 文件后,可以用记事本打开,搜索 DELETE 关键字,找到删除数据的记录

6、将 DELETE 语句改造成 INSERT 语句,在windows下用vbs来实现,把下面代码复制保存为:deleteToinsert.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 = 2 '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", 2 'DELETE转成INSERT以后的新的SQL文件名
newStream.Close

7、拿到对应的 INSERT 语句后执行。

参考文章

https://blog.csdn.net/qq_36602951/article/details/120729047
https://juejin.cn/post/7028955574242902023

到此这篇关于MySQL数据库误删回滚的解决的文章就介绍到这了,更多相关MySQL数据库误删回滚内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL数据库误操作后快速回滚的方法

    基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. binlog2sql快速回滚 首先,确认你的MySQL server开启了binlog,设置了以下参数: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_siz

  • 浅谈MySQL中是如何实现事务提交和回滚的

    目录 什么是事务 redo log undo log 总结一下 什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败 举个最常见的例子,你早上出去买早餐,支付宝扫码付款给早餐老板,这就是一个简单的转账过程,会包含两步 从你的支付宝账户扣款10元 早餐老板的账户增加10元 这两步其中任何一部出现问题,都会导致整个账务出现问题 假如你的支付宝账户扣款10元失败,早餐老板的账户增加成功

  • 浅析Mysql 数据回滚错误的解决方法

    MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollback 事务回滚commit 事务确认 2.直接用set来改变mysql的自动提交模式MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过set autocommit=0 禁止自动提交set autocommit=1 开启自动提交来实现事务的处理. 当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用c

  • MySQL 主从同步,事务回滚的实现原理

    BinLog BinLog是记录所有数据库表结构变更(例如create.alter table)以及表数据修改(insert.update.delete)的二进制日志,主从数据库同步用到的都是BinLog文件.BinLog日志文件有三种模式. STATEMENT 模式 内容:binlog 只会记录引起数据变更的 sql 语句 优势:该模式下,因为没有记录实际的数据,所以日志量和 IO 都消耗很低,性能是最优的 劣势:但有些操作并不是确定的,比如 uuid() 函数会随机产生唯一标识,当依赖 bi

  • mysql实现事务的提交和回滚实例

    mysql创建存储过程的官方语法为: 复制代码 代码如下: START TRANSACTION | BEGIN [WORK]COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]SET AUTOCOMMIT = {0 | 1} 我这里要说明的mysql事务处理多个SQL语句的回滚情况.比如说在一个存储过程中启动一个事务,这个事务同时往三个表中插入数据,每插完一张表需要

  • MySql事务无法回滚的原因有哪些

    使用MySQL时,如果发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时,不要苦恼,先看看MySQL创建的表有没有问题,即表的类型. InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能. MyIASM是I

  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的.是物理执行. 在当前事务中确实能看到插入的记录.最后只不过删除了.但是AUTO_INCREMENT不会应删除而改变值. 1.为什么auto_increament没有回滚? 因为innodb的auto_increament的计数器记录的当前值是保存在存内存中的,并不是存在于磁盘上,当mysql server处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少.而当mysql server启动时,当我们需要去查询auto_increm

  • 实现MySQL回滚的Python脚本的编写教程

    操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和binlog差来恢复,等不了,很费时.这里先说明下因为Delete 操作的恢复方法:主要还是通过binlog来进行恢复,前提是binlog_format必须是Row格式,否则只能通过备份来恢复数据了. 方法: 条件:开启Binlog,Format为Row. 步骤: 1.通过MySQL自带工具mysqlbinlog 指定导出操作的记录: mysqlbinlog --no-defaults

  • MySQL数据库误删回滚的解决

    某次一不小心,用了delete from xxx 删除了几条重要数据,在网上找了很多方法,但都比较零散,打算记录本次数据找回的过程.大致分为以下几步 1.查看binlog是否开启 # log_bin是ON,就说明打开了 OFF就是关闭状态,以下操作,只有为 ON 时有效. show variables like 'log_bin'; 2.找到binlog文件名 show master logs; 运行以上代码,如下图 TS1-bin.000009 就是我们要找的文件名 3.查看binlog日志位

  • 一文搞懂MySQL持久化和回滚的原理

    目录 redo log 为什么要先更新内存数据,不直接更新磁盘数据? 为什么需要redo log? redo log是如何实现的? 为什么一个block设计成512字节? 为什么要两段式提交? crash后是如何恢复的? undo log 什么情况下会生成undo log? undo log是如何回滚的? undo log存在什么地方? redo log 事务的支持是数据库区分文件系统的重要特征之一,事务的四大特性: 原子性:所有的操作要么都做,要么都不做,不可分割. 一致性:数据库从一种状态变

  • MySQL数据库表空间回收的解决

    目录 1. MySQL表空间回收 2. MySQL表空间设置 3. MySQL删除数据流程 4. MySQL数据页空洞问题 1. MySQL表空间回收 我们经常会发现一个问题,就是把表数据删除以后发现,数据文件大小并没有变化,这就是标题中所说的MySQL数据库表空间回收问题. 这里,我们还是针对MySQL中应用最广泛的InnoDB引擎展开讨论.一个InnoDB表包含两部分,即:表结构定义和数据.在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里.而MySQL 8.0版本,则已经允

  • Spring事务捕获异常后依旧回滚的解决

    目录 前沿 问题阐述 知识点前置条件 问题追踪 总结 前沿 一段生产事故发人深省,在Spring的声明式事务中手动捕获异常,居然判定回滚了,这是什么操作?话不多说直接上代码 @Service public class A {     @Autowired     private B b;     @Autowired     private C c;     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolat

  • MySQL数据库 1067错误号的解决方法

    在Windows Professional 7 64-bit系统下安装了MySQL 5.6,但是某一天发生了错误,错误号:1067:怎么解决这个问题呢? 以下为解决步骤: 1.以系统管理员登陆: 2.停止MySQL服务: 3.进入CMD命令行模式,然后进入MySQL的安装目录,假设是D:/MySQL/MySQL Server 5.6/: 4.跳过权限检查启动MySQL,使用命令 D:/MySQL/MySQL Server 5.6/bin/mysqld-nt –-skip-grant-tables

  • linux配置mysql数据库远程连接失败的解决方法

    今天配置Linux下MySQL数据库可以远程访问的问题,百度这方面的资料有很多,但是方法都一样,都试过了却未能解决,记录一下  第一步:在/etc/mysql/my.cnf下找到bind-address = 127.0.0.1 在这行前加个"#"进行注释,或者改为: bind-address = 0.0.0.0 允许任意IP访问:或者指定自己需要远程访问的IP地址. 然后重启mysql:sudo /etc/init.d/mysql restart 第二步:授权用户能进行远程连接 gra

  • mysql数据库中1045错误的解决方法

    本地数据库连接服务器数据库报1045,如何解决? 这个意思是说:用户"root"@本地主机的访问被拒绝 解决方案: 1.找到MySQL安装路径下的my.ini文件,用记事本的方式打开: 2.打开后,找到mysqld这个位置,这个文件的内容中有多个mysqld,注意看箭头所指位置 3.在 [mysqld] 底下添加语句:skip-grant-tables,添加完毕后保存. skip-grant-tables作为启动参数的作用:MYSQL服务器不加载权限判断,任何用户都能访问数据库.也就是

  • spring在service层的方法报错事务不会回滚的解决

    目录 spring在service层方法报错事务不会回滚 解决方法 service手动回滚问题 spring在service层方法报错事务不会回滚 @Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception {     // 业务代码1     business1();          // 业务代码2     business2();          // 业务代码3  

  • MySQL数据库主从复制延时超长的解决方法

    前言 MySQL主从复制的延时一直是业界困扰已久的问题.延时的出现会降低主从读写分离的价值,不利于数据实时性较高的业务使用MySQL. UDB是UCloud推出的云数据库服务,上线已达六年,运营了数以万计的UDB MySQL实例.除了提供高可用.高性能.便捷易用的产品特性,团队还平均每天帮助用户解决2-3起MySQL实例主从复制延时的问题.从大量实践中我们总结了主从复制延时的各种成因和解决方法,现分享于此. 延时问题的重要性 主从复制机制广泛应用在UDB的内部实现中:UDB创建的从库和主库就采用

随机推荐