事件:

  在生产库执行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. 关于base64编码Encode和Decode编码的几种方式--Java

    Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便.在实际应用上,Base64除了能将Binary资料可视化之外 ...

  2. LSTM机器学习生成音乐

    目录 LSTM机器学习生成音乐 数据集介绍 将mid转成note数组 将note数组转成mid文件 获取数据集并将其保存 将note进行编号 构建数据集 截取数据 进行one-hot编码 构建模型 训 ...

  3. EF6.2加载速度慢的解决方案

    最近的项目中一直有反馈,EF在第一次启动之后调用的话,加载速度很慢,在网上搜索了一下,基本就是三种解决方案. 在程序启动的时候将映射视图缓存下来. 使用Ngen生成EF的本地镜像. IIS8内置功能 ...

  4. Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

    传送门:cf1395C 题意 c[i]=a[i]&b[j],b[j]是b数组中任意一个,求c[1] | c[2] | ... | c[n]最小值. 题解 经典的二进制枚举答案,因为a和b的最大 ...

  5. codeforces644B. Processing Queries (模拟)

    In this problem you have to simulate the workflow of one-thread server. There are n queries to proce ...

  6. Codeforces Round #649 (Div. 2) C、Ehab and Prefix MEXs D、Ehab's Last Corollary 找环和点染色

    题目链接:C.Ehab and Prefix MEXs 题意; 有长度为n的数组a(下标从1开始),要求构造一个相同长度的数组b,使得b1,b2,....bi集合中没有出现过的最小的数是ai. mex ...

  7. 牛客练习赛70 B.拼凑 (序列自动机)

    题意:有一个模板串,有\(T\)个字符串,从字符串中找到某个子串,使得这个子串中的子序列包含模板串,求最短的子串的长度. 题解:找子序列,很容易想到序列自动机,根据序列自动机的原理,我们一定可以确保除 ...

  8. CF1401-C. Mere Array

    CF1401-C. Mere Array 题意: 给出一个长度为\(n\)的数组\(a\),你可以对这个数组进行如下操作:对于数组\(a\)中任意的两个元素\(a_i\).\(a_j\),若\(gcd ...

  9. 请问什么时候对象分配会不在 TLAB 内分配

    Java 对象分配流程 我们这里不考虑栈上分配,这些会在 JIT 的章节详细分析,我们这里考虑的是无法栈上分配需要共享的对象. 对于 HotSpot JVM 实现,所有的 GC 算法的实现都是一种对于 ...

  10. 牛客网多校第9场 E Music Game 【思维+数学期望】

    题目:戳这里 题意:鼠标点击n下,第i次点击成功的概率为p[i],连续点击成功x次可以获得x^m分,求n次点击总分数的数学期望. 解题思路:数学期望的题很多都需要转化思维,求某一个单独状态对整体答案的 ...