MySQL数据库误删回滚的解决

2022-07-14,,

某次一不小心,用了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数据库误删回滚内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

《MySQL数据库误删回滚的解决.doc》

下载本文的Word格式文档,以方便收藏与打印。