首页 > 数据库 >MySQL 误操作 误修改 binlog 还原恢复实战 超详细

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

时间:2024-09-14 13:49:26浏览次数:3  
标签:binlog SET MySQL 导出 sed sql ### 误操作

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

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 还原 恢复 已删除 数据 实战 超详细-CSDN博客文章浏览阅读2次。MySQL 通过 binlog 恢复已删除数据 超详细https://blog.csdn.net/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重新往数据库执行,即可完全恢复到修改前的状态

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

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

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

标签:binlog,SET,MySQL,导出,sed,sql,###,误操作
From: https://blog.csdn.net/id_is_null/article/details/142208629

相关文章

  • 基于php+mysql开发制作的全景在线制作网站源码系统 附带完整的安装代码包以及搭建部署
    系统概述本系统是一款集全景图片上传、编辑、展示于一体的综合性解决方案。采用PHP作为后端开发语言,结合MySQL数据库的强大功能,实现了高效稳定的数据处理与存储。前端则运用了HTML5、CSS3及JavaScript等现代Web技术,确保跨浏览器兼容性和良好的用户体验。通过简洁明了的操作界......
  • java毕业设计——基于java+ssh+jsp+MySqL的大学生就业信息管理系统设计与实现(毕业论文
    基于java+ssh+jsp+MySqL的大学生就业信息管理系统设计与实现(毕业论文+程序源码)大家好,今天给大家介绍基于java+ssh+jsp+MySqL的大学生就业信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进......
  • MYSQL中 IF() IFNULL() NULLIF() ISNULL() 函数的使用
    IF()函数的使用IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。SELECTIF(TRUE,'A','B');--输出结果:ASELECTIF(FALSE,'A','B');--输出结果:BIFNULL()函数的使用IFNULL(expr1,expr2),如果expr1的值为null,则返回......
  • MySQL事物原理
    事务    在MySQL服务中,系统的主线程负责监听连接,而多个连接线程负责处理连接。这时候多个SQL语句操作数据库,就会出现事务多并发,交叉处理。比如银行存钱后再取钱,如果存钱的中途撤销操作,但取钱操作已经完成等等。        事务是一个工作单元,它由一系列操作组成......
  • MySQL show processlist说明
    showprocesslist和showfullprocesslistprocesslist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showp......
  • MySQL基础
    MySQL基础今日目标:完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD1,数据库相关概念以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊......
  • mysql高级
    mysql高级今日目标掌握约束的使用掌握表关系及建表原则重点掌握多表查询操作掌握事务操作1,约束上面表中可以看到表中数据存在一些问题:id列一般是用标示数据的唯一性的,而上述表中的id为1的有三条数据,并且马花疼没有id进行标示柳白这条数据的age列的数......
  • Mysql--查询
    目录基本语法查询常量查看表达式查询函数查询指定字段1.LIKE操作符2.使用正则表达式单个字段查询多个字段查询使用别名(AS)使用WHERE子句汇总函数查询所有列列别名子句对列别名的使用表别名条件查询条件查询运算符逻辑查询运算符排序与分页排序分页分组查询单子段分组多字段分组gr......
  • 宝塔面板安装 MySQL8.0,阿里云服务器配置不够
    mysql更新到8.0版本,mysql8.0对比以往的版本有了很大的提升,但是要求的服务器配置也就变得越来越高。对于低配置服务器,在宝塔面板进行安装时,总会出现至少需要XXG 内存才能安装”。但我们又想要安装 MySQL8.0新版本,这时候该怎么办呢?只有强制在宝塔面板中安装MySQL8.0。低......
  • Mysql 搭建主从复制
    DockerMysql镜像启动命令(主库)dockerrun--namemysql-master -ti-d--privileged="true" -p3306:3306alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/mysql_optimized:20240221-8.0.32-2.3.0mysql_keentune.sh 修改临时密码如......