前段时间由于客户电脑上的mysql数据丢失了,所以就研究了mysql通过binlog日志恢复数据,但是百度了好多感觉都不能一次性解决问题,或者是我没弄明白,最终研究了好久终于恢复成功,其实挺简单的,但是有几个前提条件,还有提醒一下,如果发现数据丢失了最好就不要启动什么系统了,就是最好把连接这个mysql的所有系统都切断:

1、查看安装的mysql是否开启binlog日志功能,并且是row模式;

show variables like 'log_bin%';




mysql原始binlog格式 mysql binlog还原_mysql原始binlog格式


这个表示是开启binlog日志功能的;

show variables like 'binlog_format';


mysql原始binlog格式 mysql binlog还原_mysql原始binlog格式_02


这个表示是row模式,具体各个模式的区分百度上多的很;

2、这个确定好后,就可以开始了,首先查出日志文件的存储目录,一般和数据的存储目录是一样的,其实第一张图里面有,


mysql原始binlog格式 mysql binlog还原_mysql原始binlog格式_03


具体的根据自己的安装位置查看就行,注意:目录只导data就行,你直接复制到资源管理器是会错的;


mysql原始binlog格式 mysql binlog还原_base64还原_04


3、我的文件的名字可能和你的不一样,这个不影响的,你只要找到这些日志文件就行,不要想着打开它,这个是二进制的;

4、查看这些日志里面记录的操作,或许就有你勿删除或者其他的操作;

show binlog events in 'binlog.000143'


mysql原始binlog格式 mysql binlog还原_base64还原_05


这个是你需要提前查询出每个勿操作执行的其实位置和结束位置,这个只能在丢失数据的这个mysql上查看,拷贝的日志文件好像是查询会出错,但是具体的还原日志文件你就可以随便拷贝在安装有mysql的电脑上都行;

下一步就是要进行还原了;

5、首先cmd到我们安装mysql的bin目录


mysql原始binlog格式 mysql binlog还原_mysql原始binlog格式_06


我这个是一个cmd工具,还是好用的,推荐一下,叫cmder,可以百度一下,你们也可以不用管,然后可以把我们需要恢复的日志文件复制到这个目录,到时候执行命令就不用指定目录了,不用全部复制,你只需要用第4步找到你确定是勿操作的那个log文件后,拷贝这个文件就行;

6、mysqlbinlog --start-position=234(就是第4步查出的开始位置) --stop-position=637(就是第4步查出的结束位置) --base64-output=decode-rows -vv binlog.000114(这个就是你的日志文件名,应为在当前目录,所以不用指定路径,否则需要指定一下路径) > all1.sql(这个是最后输出的操作时的sql);


mysql原始binlog格式 mysql binlog还原_mysql通过data目录恢复数据_07


最后就生成了想这样的东西,现在你应该高兴了吧,数据回来了,接下来就是把delete替换成insert就可以还原回去了;

7、我这点是用的linux的命令去替换的

cat all3.sql(生成的sql) | sed -n '/###/p' | sed 's/### //g;s//*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@51.*),/1;/g' | sed 's/@[1-9][0-9]=//g' | sed 's/@[1-9]=//g'>ryxx.sql(最后输出的sql)


mysql原始binlog格式 mysql binlog还原_mysql原始binlog格式_08


到此就完成了。欢迎指正。