最近做了一个很危险的操作,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;
二、刷新binlog日志
flush logs;
这一步的目的是让binlog刷新一次,让这个时间点之后的操作都记录到新的binlog日志里;
mysql-bin.000004 就是新生成的binlog日志
三、更新数据
update user_test set name='老五' where id=3;
四、查看mysql-bin.000003最后一次commit的位置
show binlog events in 'mysql-bin.000003';
从上图可以看出最后一次提交的位置是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的位置了,我们来看下,表中的数据:
数据已经恢复。
这里解释下这条命令 --stop-position指的是截至的位置,也可以指定--start-position就是开始的位置,--stop-datetime截至时间,其他的可以自己查,大概意思都一样;-d 指的是要更改的数据库;--skip-gtids是忽略GTIDs报错。其他的就不说了,很基本的MySQL命令。
到此,数据恢复完毕。在此奉劝各位技术人员,关键数据一定要备份。