Mysql通过binlog恢复误update的数据
事件:
在生产库执行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的数据的更多相关文章
- MySQL利用binlog恢复误操作数据(python脚本)
在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线上或者测试环境误操作导致数据被删除或者更新 ...
- Mysql使用binlog恢复数据解决误操作问题的两种方法
为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...
- mysql利用binlog恢复数据详细例子
模拟数据恢复的案例 有些时候脑瓜就会短路,难免会出错 场景:在生产环境中,我们搭建了mysql主从,备份操作都是在从备份数据库上 前提:有最近一天或者最近的全备 或者最近一天相关数据库的备份 最重要的 ...
- 【转】【MySQL】mysql 通过bin-log恢复数据方法详解
mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...
- 不小心删除数据--利用MySQL的binlog恢复数据
MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...
- 利用mysql的binlog恢复数据
MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...
- mysql利用binlog恢复数据
需求:需要给开发提供一个2018年9月30号的数据,按照我们公司正常备份策略来说,直接找到对应时间的备份数据,解压导入即可,恰好这个时间节点的数据没有,只备份到2018年9月25号的,糟糕了吧 咋办呢 ...
- MySQL的binlog恢复(Windows下)
前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...
- MySQL全备+binlog恢复方法之伪装master【原创】
利用mysql全备 +binlog server恢复方法之伪装master 单实例试验 一.试验环境 10.72.7.40 实例 mysql3306为要恢复的对象,mysql3306的全备+binlo ...
随机推荐
- jvm系列五-java内存模型(2)
原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...
- Scala数据结构(数组,Map和Tuple)
package com.zy import scala.collection.mutable import scala.collection.mutable.ArrayBuffer object te ...
- win7 & centos7 双系统安装方法
1.准备 1)Centos7镜像 官方:https://www.centos.org/ 阿里镜像:http://mirrors.aliyun.com/centos/ 2)安装windows7系统的电脑 ...
- Git命令回退代码并同步到远程仓库
git log 找到要回退的commit版本号并复制 git reset --hard [commitid] 本地库版本回退 git push -f origin [branchName] 同步到远端 ...
- BeautifulSoup select方法
1 html = """ 2 <html><head><title>The Dormouse's story</title> ...
- C++构造函数、复制函数易错点
C++中复制函数在三种情况下自动调用: 用一个对象初始化另一个对象 函数的参数为对象 函数的返回值为对象 下面用几个代码片段解释复制函数的调用中的一些常见"坑": 一:默认复制函数 ...
- Mac下anaconda的安装和基本使用
Mac下anaconda的安装和基本使用 安装 在conda官网下载安装conda. 打开terminal输入conda -V,回车显示conda的版本说明安装成功. 将conda更新到最新版本 co ...
- [视频] 使用 JavaCV 来显示和保存来自摄像头的视频
目录 JavaCV 预览本机摄像头视频图像的简单实现 预览的同时,保存为FLV文件 JavaCV javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视 ...
- Leetcode(884)-索引处的解码字符串
给定一个编码字符串 S.为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: 如果所读的字符是字母,则将该字母写在磁带上. 如果所读的字符是数字(例如 d),则整个当前磁 ...
- haut-1280 诡异的迷宫
1280: 诡异的迷宫 时间限制: 2 秒 内存限制: 128 MB提交: 174 解决: 27提交 状态 题目描述 Simple最近刷题(打游戏)刷多了,一觉醒来发现自己到了一个迷宫里,怎么也出 ...