【MySQL5.7】binlog恢复delete的数据
一:MySQL binlog相关参数情况(1、开启了日志;2、日志模式为row)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set mysql> show variables like "binlog_format"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set mysql> |
注:binlog_format 这个参数共有三个值(三种模式)(row,statement,Mixed)
1)row:清楚的记录下每一行数据修改的细节,非常容易理解,当然,带来的问题是,产生了大量的日志
2)statement:不是记录每一行的修改,它记录的是执行语句,好处是节省了IO及存储资源,但是也很容易出现bug,如自增ID不一致问题、函数不存在的问题等等
3)Mixed:混合模式,表结构变更的时候就会以statement模式来记录,如果sql语句是DML语句,那么还是以row模式来记录。
二:遇到需要恢复数据的场景
一张小表,不到100条记录,应用在处理逻辑时,触发了删除操作,导致该表中数据丢失。
三:恢复过程
1)应用开发人员还是比较给力,第一时间通过分析应用日志,确定了删除数据的时间范围
2)通过时间范围,确定了具体的日志文件
3)通过mysqlbinlog挖掘日志中删除数据的详细语句
1 |
mysqlbinlog --start-datetime='2019-06-03 08:53:34' --stop-datetime='2019-06-03 09:28:17' -d [databasename] /soft/mysql-bin.000526 -v|grep DELETE -A 10 |
通过这个命令可以将日志的内容打印在窗口。注:当然,也可以将结果重定向(>>)至文件中。
4)因为数据量较小,手工处理一下数据,将删除的数据写回数据库。
四:小结
1)MySQL数据库开启日志,且日志模式binlog_format为row或者mixed,那么可以通过MySQL提供的工具mysqlbinlog恢复删除或修改的数据。
2)grep DELETE -A 10
这句话也可以写成grep DELETE -A10或者grep -A 10 DELETE 或者grep -A10 DELETE,意思为过滤出包含DELETE的记录,-A的意思是after,-A10的意思是,DELETE之后的10行也一并打印出来。
还有一个参数是-B,-B的意思是before,也就是之前的意思,用法同-A