MySQL误删除 binlog 还原 恢复已删除数据 实战 超详细

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

binlog日志还原不适用于直接删表删库的误操作!

目录

实战恢复

1、导出相关时间binlog数据

2、找到对应语句以及pos区间

3、导出改动区间的sql

4、将binlog导出的sql转换为逆向修复sql

5、执行sql恢复


背景

在 2024年9月12日 的操作过程中,由于实施SQL拼写错误,导致全表数据被误刷。此问题导致数据丢失,对业务运营产生了严重影响。见下方修复数据文档。从而进一步写一个误删除数据,通过binlog恢复的方案。

误修改恢复 见我另一篇文章

生产环境MySQL where条件写错误改全表数据,binlog恢复icon-default.png?t=O83Ahttps://blog.csdn.net/id_is_null/article/details/142253710

恢复流程

1、确定误操作时间

        2024年9月14日 10点55-11点05

2、确定目标库表以及执行语句

        库:newsee-budget     表:ns_budget_loan_bak

        执行语句:delete from ns_budget_loan_bak;

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-14 10:55:0' --stop-datetime='2024-09-14 11:05:0' --base64-output=decode-rows -d newsee-budget  -vv binlog.000934 > /root/test.sql

2、找到对应语句以及pos区间

        如果不会找可以看顶部链接实战修复误改文章

        结尾pos 107646361

       

        开始pos 107070608

        

3、导出误删除区间的sql

        这时候我们从binlog里面将这一区间的sql导出来

mysqlbinlog --no-defaults --start-position=107070608 --stop-position=107646361 --base64-output=decode-rows -vv binlog.000934 > /root/test1.sql

        可以看到导出来的sql只有刚才那种连续的sql

        

        

4、将binlog导出的sql转换为逆向修复sql

        可以自行理解意思,以及参考文章顶部另一文章有详细说明

        shell sql字段有换行

sed -n '/^###/'p test1.sql > test2.sql
sed 's/### //g' test2.sql > test3.sql
sed 's#/.*##g' test3.sql > test4.sql
sed 's/^DELETE FROM/INSERT INTO/' test4.sql > test5.sql
sed ':a;N;$!ba;s/\nWHERE/ VALUES \(/g' test5.sql > test6.sql
sed 's/@[0-9]*=//g' test6.sql > test7.sql
sed 's/$/,/g' test7.sql > test8.sql
sed 's/VALUES (,/VALUES (/g' test8.sql > test9.sql
sed ':a;N;$!ba;s/,\nINSERT/\);\nINSERT/g' test9.sql > test10.sql
sed '$ s/.$/);/' test10.sql > test11.sql

        shell sql一行一个

sed -n '/^###/'p test1.sql > test2.sql
sed 's/### //g' test2.sql > test3.sql
sed 's#/.*##g' test3.sql > test4.sql
sed 's/^DELETE FROM/INSERT INTO/' test4.sql > test5.sql
sed ':a;N;$!ba;s/\nWHERE\n  / VALUES \(/g' test5.sql > test6.sql
sed 's/@[0-9]*=//g' test6.sql > test7.sql
sed 's/$/,/g' test7.sql > test8.sql
sed 's/VALUES (,/VALUES (/g' test8.sql > test9.sql
sed ':a;N;$!ba;s/,\nINSERT/\);\nINSERT/g' test9.sql > test10.sql
sed '$ s/.$/);/' test10.sql > test11.sql
sed ':a;N;$!ba;s/,\n/,/g' test11.sql > test12.sql

        通过 python3 的 re

import re

def binlog转换sql(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        lines = f.readlines()

    # 第一步:提取以 ### 开头的行
    lines = [line for line in lines if line.startswith('### ')]

    # 第二步:去掉行首的 ### 
    lines = [line.replace('### ', '', 1) for line in lines]

    # 第三步:去掉行中的 / 开头的部分
    lines = [re.sub(r'/.*', '', line) for line in lines]

    # 第四步:将 DELETE FROM 替换为 INSERT INTO
    lines = [line.replace('DELETE FROM', 'INSERT INTO') for line in lines]

    # 第五步:将换行后的 WHERE 替换为 VALUES (
    text = ''.join(lines)
    text = re.sub(r'\nWHERE', ' VALUES (', text)

    # 第六步:删除 @n= 格式
    text = re.sub(r'@[0-9]+=','', text)

    # 第七步:在每行末尾添加逗号
    lines = text.splitlines()
    lines = [line + ',' if not line.endswith(',') else line for line in lines]

    # 第八步:将 VALUES (, 替换为 VALUES (
    text = '\n'.join(lines)
    text = text.replace('VALUES (,', 'VALUES (')

    # 第九步:将换行逗号替换为 ); 换行 INSERT
    text = re.sub(r',\nINSERT', ');\nINSERT', text)

    # 第十步:将文件最后的字符替换为 );
    if text.endswith(','):
        text = text[:-1] + ');'

    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(text)

input_file = 'test1.sql'    # 原始导出的删除binlog日志
output_file = 'test11.sql'  # 转换插入的sql
binlog转换sql(input_file, output_file)

        最后得到 test11.sql 重新将数据insert回去即可

5、执行sql恢复

        将上述修复sql重新往数据库执行,即可完全恢复到修改前的状态

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度地图JavaScript API核心功能指引

百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富、交互性强的地图应用,包含了构建地图基本功能的各种接口,提供了诸如本地搜索、路线规划等数据服务。百度地图JavaScript API支持HTTP和HT…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

C语言简单日志宏

最近调试C代码,发现要写很多打印的内容不是很方便,于是简单写一下C语言的日志来方便自己调试: 1. 简单打印带标识的日志信息 #include "stdio.h" #define PRINT(...) \do \{ …

【算法】—— 前缀和

一、区间求和问题 给定一个长度为n的序列a,有m次查询,每次查询输出一个连续区间的和。 使用暴力做法求解是将每次查询都遍历该区间求和 //暴力做法import java.util.Scanner;public class Test {public static void main(String[] args){Scanner scan…

详解下c语言下的多维数组和指针数组

在实际c语言编程中,三维及以上数组我们使用的很少,二维数组我们使用得较多。说到数组,又不得关联到指针,因为他们两者的联系太紧密了。今天我们就详细介绍下c语言下的多维数组(主要是介绍二维数组)和指针。 一、二维数组 1.1&am…

【实验】【H3CNE邓方鸣】交换机端口安全实验+2024.12.11

实验来源:邓方鸣交换机端口安全实验 软件下载: 华三虚拟实验室: 华三虚拟实验室下载 wireshark:wireshark SecureCRT v8.7 版本: CRT下载分享与破解 文章目录 dot1x 开启802.1X身份验证 开启802.1X身份验证,需要在系统视图和接口视…

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

C++ webrtc开发(非原生开发,linux上使用libdatachannel库)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少&#xff0c;经过我一段时间的探…

windows11 专业版 docker desktop 安装指南

家庭中文版需升级专业版&#xff0c;家庭版没有hyper-v。 开始运行optionalfeatures.exe打开windows功能 安装wsl2 步骤 1 - 启用适用于 Linux 的 Windows 子系统步骤 2 - 检查运行 WSL 2 的要求步骤 3 - 启用虚拟机功能步骤 4 - 下载 Linux 内核更新包 步骤 1 - 启用适用于 L…

解锁前端开发速度的秘密武器【Vite】

在前端开发的江湖中&#xff0c;有人偏爱 Webpack 的强大与稳定&#xff0c;有人钟情于 Rollup 的轻量与高效。而 Vite&#xff0c;这个后来居上的工具&#xff0c;却以“极致的快”和“极简的易”赢得了开发者的芳心。众所周知万事都有缘由&#xff0c;接下来我们就来深度剖析…

AI发展与LabVIEW程序员就业

人工智能&#xff08;AI&#xff09;技术的快速发展确实对许多行业带来了变革&#xff0c;包括自动化、数据分析、软件开发等领域。对于LabVIEW程序员来说&#xff0c;AI的崛起确实引发了一个值得关注的问题&#xff1a;AI会不会取代他们的工作&#xff0c;导致大量失业&#x…

决策曲线分析(DCA)中平均净收益用于评价模型算法(R自定义函数)

决策曲线分析&#xff08;DCA&#xff09;中平均净收益用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣&#xff0c;但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性&#xff0c;其实这种一致性也可以找到内在的联系&#xff0c;比如…

【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)

&#x1f4c3;个人主页&#xff1a;island1314 ​​ &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 目录 1. POSIX 信号量…

人工智能的历史概况和脉络

人工智能( AI ) 的历史始于古代&#xff0c;当时有神话、故事和谣言称&#xff0c;人工生物被工匠大师赋予了智慧或意识。从古代到现在&#xff0c;对逻辑和形式推理的研究直接导致了20 世纪 40 年代可编程数字计算机的发明&#xff0c;这是一种基于抽象数学推理的机器。这种设…

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台&#xff0c;就像是AI学习者和开发者的超级基地&#xff0c;这里不仅提供丰富的项目、模型和大模型体验&#xff0c;还有一大堆经典数据集任你挑。…

基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)

1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意&#xff1a;本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器&#xff0c;但里面的讲解内容适配市面上的所有多合一的RS…

Vue入门到精通:运行环境

Vue入门到精通&#xff1a;运行环境 Vue3的运行环境搭建主要有两种方法&#xff1a;一种是直接在页面中引入Vue库&#xff0c;另一种是通过脚手架工具创建Vue项目。 &#xff08;一&#xff09;页面直接引入Vue库 页面直接引入Vue库的方法&#xff0c;是指在HTML网页中通过s…

PHP项目从 php5.3 版本升级到 php8.3 版本时的一些问题和解决方法记录

一个原来的项目&#xff0c;因为业务需要&#xff0c;进行了PHP版本升级&#xff0c;从php5.3直接升级到php8.3。变化挺大的&#xff0c;原程序中有很多不再兼容&#xff0c;在此处进行一下记录。 一、Deprecated: 显式转换问题 报错内容&#xff1a;Deprecated: Implicit con…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件第1部分&#xff1a;初识 PyQt5 和安装1.1 什么是 PyQt5&#xff1f;1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

Apache Kylin最简单的解析、了解

官网&#xff1a;Overview | Apache Kylin 一、Apache Kylin是什么&#xff1f; 由中国团队研发具有浓厚的中国韵味&#xff0c;使用神兽麒麟&#xff08;kylin&#xff09;为名 的一个OLAP多维数据分析引擎:&#xff08;据官方给出的数据&#xff09; 亚秒级响应&#xff…