背景
昨天不小心把mysql中的一个数据库的用户表单删除了,天大的悲剧,于是想到用mysqlbinlog进行数据恢复。
原理
mysqlbinlog恢复数据库的原理就是将记录在binlog中的命令再运行一次。当然所有的前提是你已经打开了log_bin,按照这个逻辑,如果你是误删除或吴修改了某条数据,非常简单,只要找到对应的这条数据写一条逆向的sql语句就可以了,但是大部分删除都是不包含原数据的,这个比较悲催,就只能通过还原点来进行恢复,逻辑是通过mysqbinlog读取binlog中的数据,过滤误操作语句后并导出为sql文件,如果数据量不大也可以直接导出后查询到误删除的这一条,直接在sql文件中删除。然后再在服务器端导入即可
流程
信息收集
查看是否启用log_bin
show variables like 'log_%';
如果是on那就是打开了,如果没打开,请关闭本文。
查看所有日志文件
show master logs;
查看最新日志文件
show master status;
为了便于分析 建议此处新建日志
flush logs;
具体操作
如果你是误操作后立马处理的一般误操作语句都在最新的binlog文件中,直接在里面找就可以了,如果不记得了,那就一个个找吧。
使用
/www/server/mysql/bin/mysqlbinlog -vv --base64-output=decode-rows -d dbname mysql-bin.0000023
此处我的mysql-bin.000005是我的最新日志文件,我就直接在这个日志文件中查询所有dbname这个数据库中的操作日志,如果找到了记录下该语句的操作点,等会要用到。例如我的误操作点在15863150和15863192之间,那就直接导出所有数据
/www/server/mysql/bin/mysqlbinlog -vv --base64-output=decode-rows --stop-position=15863150 -d dbname mysql-bin.000022 mysql-bin.000023 >/www/sl-01.sql
/www/server/mysql/bin/mysqlbinlog -vv --base64-output=decode-rows --start-position=15863192 -d dbname mysql-bin.000022 mysql-bin.000023 >/www/sl-02.sql
导出后在服务器端进行导入误操作点之前的数据
mysql -uroot -p <sl-01.sql
在服务器端进行导入误操作点之后的数据
mysql -uroot -p <sl-02.sql
建议
一定一定做好数据库备份工作