先创建一个数据库 用drop 的方式删除一个表的数据,比如我删除了 drop table test2
1.确定是否开启了binlog日志记录
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
但是,就是报这个错误,气死我了,一直搜了两个小时没有答案
奇怪的很,网上明明可以,我换了版本,重启了N多次还是使用,,,
最后,忽然想通了,应该出来,在mysql命令行外面使用它,也就是用cmd窗口
结果:
终于他娘的出来了!
注意: 这里的>mysqlbinlog.exe DESKTOP-J60GAQR-bin.000116 我是直接进入到mysql的bin目录下使用命令: C:\Program Files\MySQL\MySQL Server 8.0\bin 然后把DESKTOP-J60GAQR-bin.000130 这个文件拷贝到该目录下做的,你们也可以用../ 的方式进一步找到目录完成操作,一定要搞清楚路径啊!
4.开始搞吧
结果,又遇到一个坑
我在mysql 命令行 看到的这个文件是这个样子的
上面的图返回的真他娘的一句也看不懂,看来看去,看到了这个数字 1394 忽然灵光一闪,知道怎么做了,于是上sql
>mysqlbinlog --stop-position="1524" --start-position="1394" DESKTOP-J60GAQR-bin.000130 | mysql -uroot -p test
这中间还有几个值得注意的地方:
* --stop-position="1394" --start-position="4" 对应的位置是
4是起始位置 这个区间就表示 我要恢复数据到1394这个节点,后面的节点我不管你做了什么操作 比如‘drop’
都和我没有关系,我恢复你给的这个区间的数据。
好了,不报错了,也没有提示错,心想应该好了吧,我想恢复我的数据 可是看了看表还是没有恢复,为什么呢?原来,我要恢复数据的表还没有创建啊。于是,创建好后,数据果然出来了。
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文件里面真实的数据,如果不在范围内,虽然也会执行,但是没有什么效果。