事件:

  在生产库执行update时只添加了STATUS(状态)条件,将所有状态为‘E’的数据全部改为了‘D’

思路:

  操作步骤主要参考自文章:https://blog.csdn.net/weixin_43733154/article/details/104675222

  结合原作者文章及实际情况,整理解决思路主要概况为:

  1、使用show master status 命令查看当前binlog文件;

  2、使用mysqlbinlog命令通过误操作时间及误操作表的条件,导出误操作记录文件;

  3、查看导出的误操作记录文件,保留误操作sql语句;

  4、处理导出的误操作语句文件,反向更新误操作的记录。

处理:

  实际操作过程中遇到部分问题,与解决思路有部分偏差。实操过程记录:

  在Navicat中执行show master status 命令,得到当前binlog文件为:mysql-bin.000006,position居然到了8亿多,说明很久没有替换新的binlog文件了;

  顺便使用flush logs 命令生成新的binlog文件;

  SSH连接数据库服务器,进入mysql的bin目录下

  使用mysqlbinlog命令加入误操作时间和库名条件,导出对应.sql文件,命令如下:

  ./mysqlbinlog --start-datetime='2021-02-25 17:00:00' --database=[dbName] mysql-bin.000006 >a.sql

  找到对应表名的操作记录,如下图:

  

  

  图中可以找到误操作的节点为:891012321 - 892709040,日志二进制是因为起初执行mysqlbinlog命令时没有加 --base64-output=decode-rows -vv ,未对文件解码,如果一开始就解码,应该可以省略再取一次文件的步骤;

  执行命令./mysqlbinlog --base64-output=decode-rows -vv --start-position=891012321 --stop-position=892709040 mysql-bin.000006 >a1.sql获取到精确的误操作明文记录;

  

  编辑文件,将语句调整为反向更新语句:

  执行命令  sed -n '/^###/'p a1.sql >b.sql     【将第一个###前面的内容删除】

  执行命令  sed 's/### //g' b.sql >c.sql    【将每行前面的###删除】

  执行命令  sed '/WHERE/{:a;N;/SET/!ba;s#WHERE#set#g}' c.sql >d.sql

  执行命令  sed '/SET/{:a;N;/\n/!ba;s#SET#where#g}' d.sql >e.sql    【这两句将原来的WHERE改成SET,SET改成WHERE】

  结合实际表结构,将@1这种字段名改为表中的字段名,由于这次误操作是将表中的STATUS字段从‘E’改为了‘D’,所以仅需要将SET中的STATUS和WHERE中的ID改回到表字段名即可:

  执行命令  sed '/set/{:a;N;/where/!ba;s#@11=#STATUS=#g}' e.sql >f.sql

  执行命令  sed '/where/{:a;N;/\n/!ba;s#@1=#ID=#g}' f.sql >i.sql

  至此得到下图的结构,接下来就时删除不需要的字段;

  

  执行命令  sed '/@/'d i.sql >j.sql     【删除@开头的行】

  执行命令  sed 's#/.*##g' j.sql >k.sql     【删除注解】

  执行命令  sed -r 's#(ID=.*)#\1;#g' k.sql >l.sql     【在每个ID=xxx的行末加上封号;】

  至此得到最终可执行的sql文件内容如下: 

  

  导入Navicat执行,结束。

  

  

  

Mysql通过binlog恢复误update的数据的更多相关文章

  1. MySQL利用binlog恢复误操作数据(python脚本)

    在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线上或者测试环境误操作导致数据被删除或者更新 ...

  2. Mysql使用binlog恢复数据解决误操作问题的两种方法

    为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识
 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...

  3. mysql利用binlog恢复数据详细例子

    模拟数据恢复的案例 有些时候脑瓜就会短路,难免会出错 场景:在生产环境中,我们搭建了mysql主从,备份操作都是在从备份数据库上 前提:有最近一天或者最近的全备 或者最近一天相关数据库的备份 最重要的 ...

  4. 【转】【MySQL】mysql 通过bin-log恢复数据方法详解

    mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...

  5. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  6. 利用mysql的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  7. mysql利用binlog恢复数据

    需求:需要给开发提供一个2018年9月30号的数据,按照我们公司正常备份策略来说,直接找到对应时间的备份数据,解压导入即可,恰好这个时间节点的数据没有,只备份到2018年9月25号的,糟糕了吧 咋办呢 ...

  8. MySQL的binlog恢复(Windows下)

    前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...

  9. MySQL全备+binlog恢复方法之伪装master【原创】

    利用mysql全备 +binlog server恢复方法之伪装master 单实例试验 一.试验环境 10.72.7.40 实例 mysql3306为要恢复的对象,mysql3306的全备+binlo ...

随机推荐

  1. Array循环for、for in、for of、forEach各间优劣

    JavaScript中有多种循环Array的方式,你是否常常分不清他们的细微差别,和适用场景.本文将详细梳理各间的优缺点,整理成表以便对比. 循环 可访问element 可访问index 可迭代pro ...

  2. unix环境高级编程第四章笔记

    文件和目录 start fstart lstart函数 一旦给出pathname, start函数就返回了与此命名文件有关的信息结构 #include <sys/start> int st ...

  3. Grakn Forces 2020

    比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...

  4. Codeforces Round #656 (Div. 3) D. a-Good String

    题目链接:https://codeforces.com/contest/1385/problem/D 题意 一个小写字母串称为 $c-good\ string$,如果至少满足以下条件之一: 字符串长度 ...

  5. python的@是什么(函数装饰器)

    可以看菜鸟教程:https://www.runoob.com/w3cnote/python-func-decorators.html 还有一个实例:https://zhuanlan.zhihu.com ...

  6. POJ - 2553 tarjan算法+缩点

    题意: 给你n个点,和m条单向边,问你有多少点满足(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}关系,并把这些点输出(要注意的是这个关系中是蕴含关系而不是且(&&)关系) 题解: ...

  7. Educational DP Contest E - Knapsack 2 (01背包进阶版)

    题意:有\(n\)个物品,第\(i\)个物品价值\(v_{i}\),体积为\(w_{i}\),你有容量为\(W\)的背包,求能放物品的最大价值. 题解:经典01背包,但是物品的最大体积给到了\(10^ ...

  8. Java魔法堂:调用外部程序

    前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...

  9. While & For 循环

    While 循环 可以将 While 循环称为 "条件循环" While 循环语法 # 条件为 true 就执行循环体代码,条件变为 false 循环结束 while 条件 do ...

  10. leetcode16 最接近的三数之和 双指针

    三个数循环太复杂 确定一个数,搜索另两个 先排序,之后就确定了搜索的策略 if(tp>target) while (l < r && nums[r] == nums[--r ...