MySQL 恢复误删数据

不念不忘少年蓝@ 2023-10-12 08:29 104阅读 0赞

文章目录

          • 1、查看是否启用 binlog 日志
          • 2、查看所有 binlog 日志
          • 3、查看正在使用的日志
          • 4、查找日志所在文件夹
          • 5、log 日志转 sql
          • 6、delete 转 insert 恢复误删

MySQL 恢复误删数据,针对 window 和 Linux 均适用,只需要找到对应的 binlog 目录文件,默认就是 MySQL 安装目录下的 data 文件夹

一般误删数据,先停止所有操作,备份数据库

  1. # 备份所有数据库
  2. mysqldump -uroot -p123456 --all-databases > /backup/mysqldump/all.db
  3. # 恢复数据
  4. mysql -uroot -p db_name < /backup/mysqldump/db_name.db
1、查看是否启用 binlog 日志
  1. SHOW VARIABLES LIKE '%log_bin%'

在这里插入图片描述

2、查看所有 binlog 日志
  1. SHOW BINARY LOGS;

在这里插入图片描述

3、查看正在使用的日志
  1. SHOW MASTER STATUS;

在这里插入图片描述

4、查找日志所在文件夹
  1. SHOW VARIABLES LIKE '%datadir%';

在这里插入图片描述

5、log 日志转 sql

使用上面使用的 binlog.000056 文件,先把 该文件复制到其他地方

  1. mysqlbinlog E:\test\result\binlog.000056 > E:\test\result\db.sql

有可能报错
在这里插入图片描述
添加 —no-defaults 参数可以解决,但中文会乱码(使用下面 vbs 或自定义语言实现可解决 乱码问题),一般要加上时间字段转换 sql

  1. mysqlbinlog --no-defaults --base64-output=decode-rows -v --database=oauth --start-datetime="2023-06-01 01:44:00" --stop-datetime="2023-06-01 01:48:00" F:\mysql-8.0.29-winx64\data\binlog.000058 > E:\test\result\db.sql

转换成功如下,可以看到删除 sql 的语句
在这里插入图片描述
接下来只需要将上面的 delete 语句转换为 inert 即可恢复误删数据,如果需要转换的多可以通过代码自定义实现,主要就是将
delete 转 insert

6、delete 转 insert 恢复误删

通过 vbs 脚本转换 sql 语句,当然也可以使用其他的语言,window 执行 vbs 不需要额外的环境,你只需要修改下面 vbs 文件中输入输出文件名以及编码类型即可

  1. '==========================
  2. 'VBS实现 MYSQL binglog DELETE INSERT
  3. '==========================
  4. function replaceregex(patern,str,tagstr)
  5. dim regex,matches
  6. set regex=new regExp
  7. regex.pattern=patern
  8. regex.IgnoreCase=true
  9. regex.global=true
  10. matches=regex.replace(str,tagstr)
  11. replaceregex=matches
  12. end function
  13. 'Mysql binlog DELETEINSERT==========
  14. 'VBS打开文本文件
  15. Set oldStream = CreateObject("ADODB.Stream")
  16. oldStream.CharSet = "utf-8"
  17. oldStream.Open
  18. 'binLog 生成的 DELETE 原日志文件'
  19. oldStream.LoadFromFile("E:\test\result\db.sql")
  20. oldText = oldStream.ReadText()
  21. newText=replace(oldText,"### DELETE FROM", ";INSERT INTO")
  22. newText=replace(newText,"### WHERE", "SELECT")
  23. newText=replace(newText,"###", "")
  24. newText=replace(newText,"@1=", "")
  25. newText=replaceregex("@[1-9]=",newText, ",")
  26. newText=replaceregex("@[1-9][0-9]=",newText, ",")
  27. oldStream.Close
  28. 'VBS保存文件
  29. Set newStream = CreateObject("ADODB.Stream")
  30. newStream.Type = 2 'Specify stream type - we want To save text/string data.
  31. newStream.Charset = "utf-8" 'Specify charset For the source text data.
  32. newStream.Open 'Open the stream And write binary data To the object
  33. newStream.WriteText newText
  34. newStream.SaveToFile "mysqllogOK.sql", 2 'DELETE转成INSERT以后的新的SQL文件名
  35. newStream.Close

转换结果如下,自行选择新增恢复数据

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,104人围观)

还没有评论,来说两句吧...

相关阅读