57,063
社区成员




最近在调试程序时,不小心把测试库切换成正式库,又不小心删除了一个表的数据,花了半天才把数据恢复,还好没生产,不然就完犊子了。
下面整理了大致流程。
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