mysqlbinlog 恢复mysql数据

最近做了一个很危险的操作,update mysql的时候没有加where条件,导致数据全更改了(后来通过备份恢复了)。大家要引以为戒,千万慎重。于是,我就研究了一下通过mysqlbinlog恢复数据,以下为实际操作步骤。

MySQL版本5.7.24

关键命令 mysqlbinlog --stop-position="1723" --skip-gtids -d test /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p

一、先看原数据

select * from user_test;

mysqlbinlog 恢复mysql数据_第1张图片

二、刷新binlog日志

flush logs;

这一步的目的是让binlog刷新一次,让这个时间点之后的操作都记录到新的binlog日志里;

mysqlbinlog 恢复mysql数据_第2张图片

mysql-bin.000004  就是新生成的binlog日志

三、更新数据

update user_test set name='老五' where id=3;

mysqlbinlog 恢复mysql数据_第3张图片

四、查看mysql-bin.000003最后一次commit的位置

 show binlog events in 'mysql-bin.000003';

mysqlbinlog 恢复mysql数据_第4张图片

mysqlbinlog 恢复mysql数据_第5张图片

从上图可以看出最后一次提交的位置是1723。这里一定要搞清楚你想要恢复的数据的位置,因为我想恢复到更新的操作之前,更新操作是在mysql-bin.000004中,所以我只需要恢复到mysql-bin.000003的最后一次提交就可以了。

五、恢复数据

新开一个xshell窗口,执行命令:

mysqlbinlog --stop-position="1723" --skip-gtids -d test /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p

执行完上面的命令数据就恢复到1723的位置了,我们来看下,表中的数据:

mysqlbinlog 恢复mysql数据_第6张图片

数据已经恢复。

这里解释下这条命令 --stop-position指的是截至的位置,也可以指定--start-position就是开始的位置,--stop-datetime截至时间,其他的可以自己查,大概意思都一样;-d 指的是要更改的数据库;--skip-gtids是忽略GTIDs报错。其他的就不说了,很基本的MySQL命令。

到此,数据恢复完毕。在此奉劝各位技术人员,关键数据一定要备份。

你可能感兴趣的:(mysql,mysql)