mysql 误删数据,使用mysqlbinlog恢复数据

铁马_ 2023-08-15 16:15:01

最近在调试程序时,不小心把测试库切换成正式库,又不小心删除了一个表的数据,花了半天才把数据恢复,还好没生产,不然就完犊子了。

下面整理了大致流程。

1.使用的时Navicat工具,查询sql语句:show variables like '%log_bin%';

查看binlog是否开开启,如果未开启下面的不用看了

 2.查看所有已保存的binlog文件,查询sql语句:show binary logs;

 先预判误删数据的大概时间例如2023/05/04 16:08:00

 

3.打开当前MySql的安装位置,一般路径为:C:\Program Files\MySQL\MySQL Server 8.0\bin 。

也可直接通过sql查询:SELECT @@basedir as basePath FROM dual;

 

 

4.执行命令:在安装路径的地址栏输入cmd,并回车

 

 

 5.编辑命令

①如果你的binlog文件不大,比如只有十几MB,可直接对文件进行编译
命令如下:.\mysqlbinlog.exe --base64-output=decode-rows -v "D:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.000090" >NewLog.sq

参数解析:

.\mysqlbinlog.exe :表示运行binlog程序并执行命令

--base64-output=decode-rows -v :表示将日志内容转base64编码,生成文档(此时可能由于文件过大,还是会出现乱码现象)

"D:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.000090" :表示选取的binlog路径

>mysqlbin.log :表示生成一个mysqlbin.log文件,保存在当前文件夹

②如果你的binlog文件太大  ,可以选一个时间区间执行命令,比如 我是14:00删除的数据,那我的时间区间就选:13:55~ 14:05

命令如下

.\mysqlbinlog.exe  --base64-output=decode-rows -v --database=all --start-datetime="2023-08-15 13:55:00" --stop-datetime="2023-08-15 14:05:00" "D:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.000090" > NewLog.sql

参数解析:

--start-datetime:开始时间

--stop-datetime:结束时间

其他参数解析同上。

此时不要着急,如果需要恢复的数据量大,还需要进一步确定恢复数据的范围,这是就需要精确到开始节点和结束节点

 此时有了开始节点和结束节点,就可以把时间去掉,换成节点去查询更加精确的数据

命令如下:.\mysqlbinlog.exe --base64-output=decode-rows -v --database=all --start-position=502040917 --stop-position=502041211 "D:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.000090">NewLog.sql

6.此时获取到NewLog.sql文件并打开

 

 

 sysdatmenu表内有16列,对应从@1 ~@16 的16列数据,此时删除多余部分,重构sql ,将数据插入到临时表sysdatmenu_temp中

 执行完成后,查看临时便数据是否正确,如果正确再移植到正式表中

 

注释:根据命令生成的sql文件,可能会有中文乱码,我总结的原因是:

1 你的开始--start-position、结束节点--stop-position 中间包含了无用的数据

2.可能是你的文件太大,无法解析。

这些原因不一定正确,可是作为参考多尝试几次

以上文档整理的有些粗糙,如有不清楚的可以微信联系:17601580439

 

...全文
300 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

57,063

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧