MySQL 误操作误修改 binlog还原恢复实战 超详细

硬盘有价,数据无价,数据库执行,谨慎操作!

binlog日志还原不适用于直接删表删库的误操作!

目录

实战恢复

1、导出相关时间binlog数据

2、找到对应语句以及pos区间

3、导出改动区间的sql

4、将binlog导出的sql转换为逆向修复sql

        1、从上面binlog日志可以看出  开头### 才是sql,所以只保留 开头### 这些sql数据,

        2、删除 ###

        3、这两句将原来的WHERE改成SET,SET改成WHERE

        4、结合实际表结构,确认唯一主键,主键为Id。

        5、删除@开头的行

        6、删除注释  至此已经得到修复sql

        7、在每个id=xxx 的行末加上分号;

5、执行sql恢复


背景

在 2024年9月12日 的操作过程中,由于实施SQL拼写错误,导致全表数据被误刷。此问题导致数据丢失,对业务运营产生了严重影响。这里实战演示通过 binlog 恢复丢失的数据,并确保系统恢复到预期状态。

误删除恢复 见我另一篇文章

MySQL误删除 binlog 还原 恢复 已删除 数据 实战 超详细-优快云博客文章浏览阅读2次。MySQL 通过 binlog 恢复已删除数据 超详细https://blog.youkuaiyun.com/id_is_null/article/details/142253710

恢复流程

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重新往数据库执行,即可完全恢复到修改前的状态

原创内容 未经允许禁止转载

原创内容 未经允许禁止转载

原创内容 未经允许禁止转载

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值