事件:

  在生产库执行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. VIT Vision Transformer | 先从PyTorch代码了解

    文章原创自:微信公众号「机器学习炼丹术」 作者:炼丹兄 联系方式:微信cyx645016617 代码来自github [前言]:看代码的时候,也许会不理解VIT中各种组件的含义,但是这个文章的目的是了 ...

  2. Flink-v1.12官方网站翻译-P010-Fault Tolerance via State Snapshots

    通过状态快照进行容错 状态后台 Flink管理的键控状态是一种碎片化的.键/值存储,每项键控状态的工作副本都被保存在负责该键的任务管理员的本地某处.操作员的状态也被保存在需要它的机器的本地.Flink ...

  3. CF-gym/101810 J、T-Shirts Dilemma

    题目链接:点我 题意: 给你一个区间[a,b],让你从里面选一个连续子区间[x,y](子区间可以为[a,b]),把这个区间的所有数或起来x|x+1|x+2|...|y 你要使得区间[x,y]异或起来的 ...

  4. 【noi 2.6_9288】&【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度除法)

    题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变 ...

  5. B. Queue

    During the lunch break all n Berland State University students lined up in the food court. However, ...

  6. HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly

    HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...

  7. POJ 2195 & HDU 1533 Going Home(最小费用最大流)

    这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...

  8. Link/Cut Tree CodeForces - 614A 暴力+爆 long long 处理

    题意: 给你一个区间[l,r],让你从小到大输出k^x,设y=k^x,要保证y在区间[l,r]中 题解: 就算k是最小的2也不需要枚举多少次就到long long的极限了,所以暴力没商量,根本不会TL ...

  9. Linux自带神器logrotate详解

    Linux自带神器logrotate详解 散尽浮华 运维 3天前   作者:散尽浮华 链接:https://www.cnblogs.com/kevingrace/p/6307298.html 对于 L ...

  10. Linux系统诊断必备技能之三:查看信息系统常用命令

    一.概述 Linux操作系统的学习中,CLI下进行操作,需要掌握大量命令,Linux的命令有很多,对于命令的学习大家记住只能是熟能生巧,所以现在把日常使用命令为大家罗列一部分,仅供参考. 二.常用命令 ...