硬盘有价,数据无价,数据库执行,谨慎操作!
binlog日志还原不适用于直接删表删库的误操作!
目录
1、从上面binlog日志可以看出 开头### 才是sql,所以只保留 开头### 这些sql数据,
3、这两句将原来的WHERE改成SET,SET改成WHERE
背景
在 2024年9月12日 的操作过程中,由于实施SQL拼写错误,导致全表数据被误刷。此问题导致数据丢失,对业务运营产生了严重影响。这里实战演示通过 binlog 恢复丢失的数据,并确保系统恢复到预期状态。
误删除恢复 见我另一篇文章
恢复流程
1、确定误操作时间
2024年9月12日 17点20-17点40
2、确定目标库表以及执行语句
库:newsee-budget 表:ns_budget_loan
执行语句:update ns_budget_loan SET createUserId = 39001;
3、导出相关时间binlog数据
4、找到对应语句以及pos区间
5、导出改动区间的sql
6、将binlog导出的sql转换为逆向修复sql
7、执行sql恢复
实战恢复
1、导出相关时间binlog数据
首先去binlog目录找一下,确定误操作时间的数据在哪个binlog文件。
这里可以看出是在 binlog.000925 文件里。
现在将对应时间binlog日志导出:
mysqlbinlog --no-defaults --start-datetime='2024-09-12 17:20:0' --stop-datetime='2024-09-12 17:40:0' --base64-output=decode-rows -d newsee-budget -vv binlog.000925 > /root/test.sql
2、找到对应语句以及pos区间
导出的文件会发现比较杂乱无章
前面也有断断续续的几个,但是后面找到了比较连续的日志,所以断定是这边连续的这些,先记录下这个 end_log_pos 为 61350523
接着往上翻,找到这堆连续数据的第一条,记录下开始的 at 为 60214105
3、导出改动区间的sql
这时候我们从binlog里面将这一区间的sql导出来
mysqlbinlog --no-defaults --start-position=60214105 --stop-position=61350523 --base64-output=decode-rows -vv binlog.000925 > /root/test1.sql
可以看到导出来的sql只有刚才那种连续的sql
4、将binlog导出的sql转换为逆向修复sql
1、从上面binlog日志可以看出 开头### 才是sql,所以只保留 开头### 这些sql数据,
sed -n '/^###/'p test1.sql > test2.sql
2、删除 ###
sed 's/### //g' test2.sql > test3.sql
3、这两句将原来的WHERE改成SET,SET改成WHERE
sed '/WHERE/{:a;N;/SET/!ba;s#WHERE#set#g}' test3.sql > test4.sql
sed '/SET/{:a;N;/\n/!ba;s#SET#where#g}' test4.sql > test5.sql
4、结合实际表结构,确认唯一主键,主键为Id。
将@1这种字段名改为表中的字段名,由于这次误操作是将表中的 createUserId 字段全部刷成 39001 ,所以仅需要将SET中的 createUserId 和WHERE中的Id改回到表字段名即可:
结合实际情况修改下方红色字样
sed '/set/{:a;N;/where/!ba;s#@21=#createUserId=#g}' test5.sql > test6.sql
sed '/where/{:a;N;/\n/!ba;s#@1=#id=#g}' test6.sql > test7.sql
5、删除@开头的行
sed '/@/'d test7.sql > test8.sql
6、删除注释 至此已经得到修复sql
sed 's#/.*##g' test8.sql > test9.sql
7、在每个id=xxx 的行末加上分号;
sed -r 's#(id=.*)#\1;#g' test9.sql > test10.sql
5、执行sql恢复
将上述修复sql重新往数据库执行,即可完全恢复到修改前的状态
原创内容 未经允许禁止转载
原创内容 未经允许禁止转载
原创内容 未经允许禁止转载
标签:binlog,SET,MySQL,导出,sed,sql,###,误操作 From: https://blog.csdn.net/id_is_null/article/details/142208629