windows恢复下误删MySQL的数据
1、遇到问题
最近在本地开发的时候,一不小心把一个数据表当成废弃表给删掉了,其中有很多比较重要的数据,懊恼的同时想到我开启了binlog日志,依稀记得可以根据这个可以恢复数据,于是开始一顿搜索资料…
2、解决问题
(1)首先确认是否开启binlog,如果开启了就可以此恢复删除的数据
show VARIABLES like '%log_bin%';
结果如下图所示:
可以看到log_bin对应的那行为ON,表示已经开启日志记录(日志怎么开启不再赘述)
(2)查看日志,找到删除数据的记录
上图的log_bin_basename对应的地址就是记录日志的位置,我本机的位置是D:\program\mysql\mysql-8.0.17-winx64\data,
这里有记录所有操作数据库的日志文件,但是这些都是二进制文件,普通文本编辑器是没法查看的,索性MySQL自带查看工具
一、查看最早binlog的日志:
show binlog events;
二、查看指定的binlog日志:
show binlog events in 'binlog.000047';
三、指定查看 binlog.000047 这个文件,从pos点:20开始查起:
show binlog events in 'binlog.000047' from 20;
四、指定查看 binlog.000047 这个文件,从pos点:20开始查起,查询10条
show binlog events in 'binlog.000047' from 20 limit 10;
五、指定查看 binlog.000047 这个文件,从pos点:20开始查起,偏移5行,查询10条
show binlog events in 'binlog.000047' from 20 limit 5,10;
在sql后面加上“\G”,不会显示详情,便于查找操作的节点,每一小块都是一个操作,server_id 记录是在哪台机器上操作的,
event_type 记录操作类型,如下图:
由于写这篇文章的时候,已经放弃处理那部分日志以及恢复那部分数据了(主要没有设置单个日志大小,导致日志文件太大,已经达到GB级别,普通文本编辑器已经打不开了,chrome浏览器异步加载文件比较好,可以查看一部分信息,但最终会崩溃,可能是内存问题没有继续深入,想到过文件分割,但没有尝试),这里仅模拟当时的操作
(3)日志导出sql
到日志所在的位置,执行以下命令,成功导出到d盘
mysqlbinlog --nodefaults binlog.000048 > d:/my.sql
注意查看下大小,如果命令报错也可能生成空脚本
(4)恢复数据
新开一个cmd窗口,然后执行以下命令
mysql -uroot -p -v plist < my.sql // plist是数据库名,需要和脚本中操作的数据库名一致
至此,成功恢复数据。