binlog 只能恢复DML操作,不能恢复DDL操作,对于DDL操作还是只能用备份来恢复。
binlog是一个二进制日志文件,只存储变化的数据,不存储select和show,二进制文件不能直接打开,可以使用mysqlbinlog 打开,但是直接用mysqlbinlog 打开的文件不是一个可以直接执行的sql语句,为了找到我们可以直接执行的sql语句,需要借助一个python的工具。同时该工具还可以用来找回我们误删除的数据,我们最后得到的其实是删除前数据库里面所有数据的insert语句,后面的处理可以交给做了删除操作的人进行恢复。
接下来是一个误删除操作的处理过程:
1.安装python依赖【mysql-replication-0.13】【PyMySQL-0.7.11】【wheel-0.29.0】
使用root用户,cd到文件夹下面,然后执行:python setup.py install
下载地址:
https://github.com/danfengcao/binlog2sql
或者后台回复【binlog】获取依赖包
2.跟用户确认误删除具体时间+数据库IP地址+操作类型+具体数据库+具体的操作表
3.执行 恢复操作
根据用户提供的时间找到当时的binlog文件,这里找到的是mysql-bin.000008,用户操作的是test_ljing 数据库下的testclob表,时间是2019年12月31日10:50分之后,我们把导出的sql语句放在/root/binlog_python/insert.sql
然后执行下面的操作:
python binlog2sql.py --flashback -uroot -p'mysql' -dtest_ljing -t testclob --start-file='mysql-bin.000008' --start-datetime='2019-12-31 10:50:00' > /root/binlog_python/insert.sql
说明:此次误删除和恢复操作都是在12月31日当天做的。如果距离误删除操作过去时间比较久远,还需要考虑删除后数据库又进行了那些操作,确实是否要恢复。
4.参数介绍:
-B,--flashback:生成回滚语句
--start-file:需要解析的binlog文件
--start-position:解析binlog的起始位置
--stop-position:解析binlog的结束位置
--start-datetime:从哪个时间点的binlog开始解析,格式必须是datetime,例:2019-12-31 10:50:00
--stop-datetime:从哪个时间点的binlog开始解析,格式同上
-d,--databases:只输出目标db的SQL
-t,--tables:只输出目标tables的SQL
5.说明
5.6版本的root用户有127.0.0.1,5.7版本没有,执行的时候如果用户不是%,会默认去找127.0.0.1这个IP的用户,所以在5.6版本可以直接用root用户执行,5.7版本需要加一个有所有权限的用户来执行这个操作,或者给root用户加一个127.0.0.1执行




