如何恢复mysql数据库中误删的数据?

先创建一个数据库 用drop 的方式删除一个表的数据,比如我删除了 drop table test2

如何恢复mysql数据库中误删的数据?_第1张图片

 

1.确定是否开启了binlog日志记录

如何恢复mysql数据库中误删的数据?_第2张图片

show variables like 'log_bin' ;  -- 查看是否开启了binlog日志记录

On 为成功开启  也可以直接设置开启 SET SQL_LOG_BIN=1

 

2.如果无法开启,进一步配置my.ini 文件,在[mysqld] 下添加下面三个参数

# server_type=3

[mysqld]

server_id=101

log_bin=mysql-bin

binlog_format="ROW"

有人说,这里是开启后 无法重新启动mysql 我是没遇到 暂时不讨论

 

3.开启后,我在mysql 里面的命令行里面不断的使用

 mysqlbinlog DESKTOP-J60GAQR-bin.000116

但是,就是报这个错误,气死我了,一直搜了两个小时没有答案

如何恢复mysql数据库中误删的数据?_第3张图片

 

奇怪的很,网上明明可以,我换了版本,重启了N多次还是使用,,,

最后,忽然想通了,应该出来,在mysql命令行外面使用它,也就是用cmd窗口

结果:

如何恢复mysql数据库中误删的数据?_第4张图片

 

终于他娘的出来了!

注意: 这里的>mysqlbinlog.exe  DESKTOP-J60GAQR-bin.000116  我是直接进入到mysql的bin目录下使用命令:  C:\Program Files\MySQL\MySQL Server 8.0\bin  然后把DESKTOP-J60GAQR-bin.000130 这个文件拷贝到该目录下做的,你们也可以用../ 的方式进一步找到目录完成操作,一定要搞清楚路径啊!

 

4.开始搞吧

结果,又遇到一个坑

我在mysql 命令行 看到的这个文件是这个样子的

如何恢复mysql数据库中误删的数据?_第5张图片

 

上面的图返回的真他娘的一句也看不懂,看来看去,看到了这个数字 1394  忽然灵光一闪,知道怎么做了,于是上sql

>mysqlbinlog --stop-position="1524" --start-position="1394" DESKTOP-J60GAQR-bin.000130 | mysql -uroot -p test  

 

如何恢复mysql数据库中误删的数据?_第6张图片

这中间还有几个值得注意的地方:

*  --stop-position="1394" --start-position="4"   对应的位置是

如何恢复mysql数据库中误删的数据?_第7张图片

 

4是起始位置  这个区间就表示 我要恢复数据到1394这个节点,后面的节点我不管你做了什么操作 比如‘drop’

如何恢复mysql数据库中误删的数据?_第8张图片  

 

都和我没有关系,我恢复你给的这个区间的数据。

好了,不报错了,也没有提示错,心想应该好了吧,我想恢复我的数据 可是看了看表还是没有恢复,为什么呢?原来,我要恢复数据的表还没有创建啊。于是,创建好后,数据果然出来了。

如何恢复mysql数据库中误删的数据?_第9张图片

 

5.拓展: 如果是在linux 环境下 可以用这个命令找到所有的drop 操作 这样更加快速的定位到pos.:

mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8  --start-position=4   DESKTOP-J60GAQR-bin.000130 |grep DROP  -A10 -B10

我在windows 下找不到好的办法。如果有好办法,可以下面留言,我们一起探讨。

晚安,各位!

【追加】

在恢复表的过程中会遇到这个问题:

Duplicate entry XXX for primary 需要清空所有表的行自动增长值 最简单的办法就是 用drop 的方式清空所有的表数据,否则会严重影响下面的操作

附表:  各钟尝试的语句

服务器查找的语句  /usr/bin/mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8  --start-position=0   /data/mysql/mysql-bin.000327 |grep s_order_customs  -A10 -B10


最终要恢复的数据  执行该下语句  linux
/usr/bin/mysqlbinlog --stop-position="199371046" --start-position="4" /data/mysql/mysql-bin.000327 | mysql -uroot -p test

最终要恢复的数据  执行该下语句  windows
mysqlbinlog.exe --stop-position="199371046" --start-position="4" mysql-bin.000327 | mysql -uroot -p test  


mysqlbinlog 查看日志  【无效】
mysqlbinlog.exe --start-datetime='2020-05-06 17:00:00' --stop-datetime='2020-05-06 17:10:01' -d hadoop  mysql-bin.000327


mysqlbinlog.exe --no-defaults --database=test  --start-datetime='2020-05-06 17:00:00' --stop-datetime='2020-05-06 17:10:01'  mysql-bin.000327

>mysqlbinlog.exe --no-defaults --database=test  --start-datetime='2020-05-06' --stop-datetime='2020-05-06 17:10:01'  mysql-bin.000327|mysql -uroot -p -v

有效的语句   可以执行但是报错 是因为乱码的缘故  所以要换成在linux 环境下的数据
mysqlbinlog.exe --no-defaults --database=ishipper_chk  --start-position=431325  --stop-position=431845  mysql-bin.000327|mysql -uroot -p test  

执行没报错的语句  成功恢复   可以用 --database 指定恢复哪个数据库
mysqlbinlog.exe --no-defaults --database=ishipper_chk  --start-position=291739  --stop-position=4  mysql-bin.000327|mysql -uroot -p test  

需要注意的是这里的position  必须是bin文件里面真实的数据,如果不在范围内,虽然也会执行,但是没有什么效果。

 

 

你可能感兴趣的:(JAVA-数据库,mysql,数据库,数据恢复,删库删数据)