【后端记录】修复MySql的错误修改的数据记录【binlog修复】

news2024/11/13 14:46:43

前言

今天入门后端的时候,不小心改了非预期的数据,因为还没学到事务,所以恢复数据还比较麻烦,站在巨人的肩膀上还是解决了,原文连接在下面

https://blog.csdn.net/qq_42874315/article/details/140480570

解决办法

原理就是找到错误的sql语句记录,根据sql语句生成脚本,把sql语句“回滚”回之前数据。
步骤如下:

  1. MySql默认是开启binlog的,查询指令是
    show variables like 'log_bin';
    在这里插入图片描述

  2. 查看binlog文件在本地的路径

SHOW VARIABLES LIKE 'log_bin_index'; //C:\ProgramData\MySQL\MySQL Server 8.0\Data\MYSZ-TIANW-bin

我们定位到自己的Data对应的文件夹
在这里插入图片描述
这个对应着修改的时间,我们找到对应时间修改的文件,我这里是bin.000010

  1. 需要知道你修改的大致的时间,执行cmd命令

需要cd到对应目录 :
cd C:\ProgramData\MySQL\MySQL Server 8.0\Data

mysqlbinlog --no-defaults --start-datetime="2024-08-15 14:00:00" --stop-datetime="2024-08-15 14:50:28" --base64-output=DECODE-ROWS --verbose bin.000010 

命令有三个参数要改,开始和结束时间,日志的名称。开始结束时间如果不知道的话范围由大到小,慢慢缩减,注意名称bin.000010需要文件夹中的全称 需要结合你自己日志的名称。

假设我的错误的sql语句是(demo数据库)

update t_emp set job  = "ANALYST",deptno = 20;

则部分的输出结果如下:
在这里插入图片描述
其中@3是job列,@8是deptno,修改的时间是14:09:04

如果觉得cmd面板不好分析 也可以转成txt查看执行:mysqlbinlog bin.000010 > ./binlog.txt

  1. 定位到是14:09:04时间后就可以保存对应的日志出来,生成对应的文件(其实就是截取文本而已)
mysqlbinlog --no-defaults --start-datetime="2024-08-15 14:09:00" --stop-datetime="2024-08-15 14:10:00" --base64-output=DECODE-ROWS --verbose bin.000010 > error_binlog_2024-08-15-14-09.sql
  1. 用idea执行下面代码,生成对应的sql语句(就是字符替换,修改改成你表中对应的字段)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MySqlCallbackData {
    public static void main(String[] args) {
        String filePath = "C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Data\\error_binlog_2024-08-15-14-09.sql";

        String document = readFileContent(filePath);
        List<String> updateStatements = parseDocument(document);
        for (String statement : updateStatements) {
            System.out.println(statement);
        }
    }

    /**
     * 读取文本内容
     */
    private static String readFileContent(String filePath) {
        StringBuilder content = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(new File(filePath)))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content.toString();
    }

    /**
     * 解析文本内容
     */
    private static List<String> parseDocument(String document) {
        List<String> updateStatements = new ArrayList<>();

        // 每个"### UPDATE "是一条更新语句
        String[] sections = document.split("### UPDATE ");
        for (int i = 1; i < sections.length; i++) {
            String section = sections[i];
            String[] lines = section.split("\n");

            // 待拼接的WHERE条件
            String whereClause = "";
            // 待拼接的SET
            StringBuilder sb = new StringBuilder();

            for (String line : lines) {
                if (line.startsWith("###   @1=")) {
                    whereClause = "empno = " + line.split("=")[1];
                } else if (line.startsWith("###   @3=")) {
                    //需要改成你表中的字段
                    sb.append("job = " + line.split("=")[1]);
                } else if (line.startsWith("###   @8=")) {
                    //需要改成你表中的字段
                    sb.append(",deptno = " + line.split("=")[1]);
                }

                // 不需要读取日志文件中SET的内容,跳过即可
                if (line.startsWith("### SET")) {
                    break;
                }
            }

            // 拼接SQL 需要改成你的表名字
            String updateStatement = "UPDATE t_emp " + "SET " + sb + " WHERE " + whereClause + ";";

            updateStatements.add(updateStatement);
        }

        return updateStatements;
    }
}

编译器输出如下,拿到sql语句数据库执行下就恢复了:

UPDATE t_emp SET job = 'CLERK',deptno = 20 WHERE empno = 7369;
UPDATE t_emp SET job = 'SALESMAN',deptno = 30 WHERE empno = 7370;
UPDATE t_emp SET job = 'SALESMAN',deptno = 30 WHERE empno = 7521;
UPDATE t_emp SET job = 'MANAGER',deptno = 20 WHERE empno = 7566;
UPDATE t_emp SET job = 'SALESMAN',deptno = 30 WHERE empno = 7654;
UPDATE t_emp SET job = 'MANAGER',deptno = 30 WHERE empno = 7698;
UPDATE t_emp SET job = 'MANAGER',deptno = 10 WHERE empno = 7782;
UPDATE t_emp SET job = 'PRESIDENT',deptno = 10 WHERE empno = 7839;
UPDATE t_emp SET job = 'SALESMAN',deptno = 30 WHERE empno = 7844;
UPDATE t_emp SET job = 'CLERK',deptno = 20 WHERE empno = 7876;
UPDATE t_emp SET job = 'CLERK',deptno = 30 WHERE empno = 7900;
UPDATE t_emp SET job = 'CLERK',deptno = 10 WHERE empno = 7934;
UPDATE t_emp SET job = 'CLERK',deptno = NULL WHERE empno = 7999;

总结

sql语句修改数据需要很谨慎才行,后台之路任重而道远啊~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python光电光对光神经网络非相干光图像低维映射模拟

&#x1f3af;要点 &#x1f3af;光学神经网络非相干光图像处理 | &#x1f3af;光电光对光处理多层光学神经网络 | &#x1f3af;光图像传感器构建两层神经网络 | &#x1f3af;非相干光输入图像映射到低维空间 | &#x1f3af;多层非线性对比浅层线性光神经网络 | &#x1f…

国标POE电源芯片52V转12V 1.5A用AH7691D

​在深入探讨国标POE&#xff08;Power Over Ethernet&#xff09;电源芯片AH7691D如何将52V直流电压高效转换为12V 1.5A的稳定输出时&#xff0c;不得不提及其卓越的能效比与可靠性设计。AH7691D作为一款专为POE供电系统设计的降压转换芯片&#xff0c;不仅拥有高精度的电压调…

数据结构入门——03链表

1. 链表的结构 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 结点的data域存放数据元素ai&#xff0c;而next域是一个指针&#xff0c;指向ai的直接后继ai1所在的结点。 1.1链表的分类 实际中要实…

利用matlab生成一注特别的大乐透机选程序

玩法说明: 代码: front randi([1,35],5,5) %前区随机生成(1-35),生成5行5列rear randi([1,12],1,2)%后区随机生成(1-12),生成1行2列front_r []%用来保存前区号码结果 rear_r rear%用来保存后区号码结果for i 1:size(front, 1) % 遍历每一行 for j 1:length(front(i,:)) …

OpenCV图像处理——直线拟合并找出拟合直线的起点与端点

引言 对轮廓进行分析&#xff0c;除了可以对轮廓进行椭圆或者圆的拟合之外&#xff0c;还可以对轮廓点集进行直线拟合。在 OpenCV 中&#xff0c;直线拟合通常是通过 cv::fitLine 函数实现的&#xff0c;该函数采用最小二乘法对一组 2D 或 3D 点进行直线拟合。对于 2D 点集&am…

【数据结构】详细剖析链表,带你实现单链表,双向链表,附链表编程练习题

目录 一. 链表 1. 链表的概念及结构 2. 单链表的实现 2.1 单链表节点结构 2.2 动态申请一个节点 2.3 单链表打印 2.4 单链表尾插 2.5 单链表头插 2.6 单链表尾删 2.7 单链表头删 2.8 单链表查找 2.9 单链表在pos后一位插入x 2.10 单链表删除pos后一位的值 2.11 …

《软件性能测试分析与调优实践之路》(第2版) 读书笔记(一)总体介绍(上)-真正从性能分析与调优来看性能测试

《软件性能测试分析与调优实践之路》(第2版) 是清华大学出版社出版的一本图书&#xff0c;作者为张永清&#xff0c;全书共分为9章&#xff0c;如下图所示 图书介绍&#xff1a;《软件性能测试分析与调优实践之路》(第2版) 1、为什么需要性能测试与分析 1&#xff09;、了解…

成功交付西班牙足球俱乐部77英寸透明OLED模块订单

2024年8月初&#xff0c;我们完成了来自西班牙知名足球俱乐部的大宗订单交付。此次交付的10台77英寸透明OLED模块&#xff0c;标志着我们在高端显示技术领域迈出的又一重要步伐。这一订单不仅是我们目前单笔数量最多的77英寸模块订单&#xff0c;也是客户首次大规模采购我们产品…

自动化解决 reCAPTCHA v2:CapSolver 教程

对于那些经常进行网页爬取的人来说&#xff0c;你是否曾觉得 reCAPTCHA v2 就像是互联网版的过于严格的裁判员&#xff0c;总是在质疑你的真实性&#xff1f;但如果你能够轻松且合规地与这些裁判员达成和解&#xff0c;使你的网络搜索和自动化任务变得更顺畅&#xff0c;那该有…

【HarmonyOS NEXT】实现在当前Ability页面,拉起另一个Ability页面

【需求】 实现类似微信拉起支付页面。在手机应用程管理界面&#xff0c;可以看到同一个应用的两个窗口&#xff0c;如下图 【方案】 在EntryAbility的页面&#xff0c;点击按钮拉新的Ability 【步骤】 为EntryAbility准备页面 新建FirstAbilityPage页面将EntryAbility中的启动…

LivePortrait V3版:新增精确的肖像编辑,精准操控五官比如眉毛鼻子摇头眨眼撇嘴等,本地一键整合包下载

LivePortrait&#xff0c;这个名字听起来就像是魔法&#xff0c;但它其实是现实世界中的黑科技。想象一下&#xff0c;你那尘封已久的相册里&#xff0c;那些定格在时间里的笑脸&#xff0c;突然间动了起来&#xff0c;眨眼、微笑、甚至说话&#xff0c;这不再是电影里的场景&a…

企业源代码也需要加密!源代码加密软件推荐,2024十款软件排行榜

在科技飞速发展的2024年&#xff0c;企业的源代码作为核心资产&#xff0c;其安全性至关重要。为了防止源代码泄露带来的巨大损失&#xff0c;选择一款合适的源代码加密软件势在必行。下面为您呈现 2024 年十款优秀的源代码加密软件排行榜。 1. GitGuardian 实时监控&#xf…

从0到1:AI与低代码如何推动企业创新

引言 在当今瞬息万变的商业环境中&#xff0c;创新已成为企业在激烈市场竞争中立于不败之地的关键驱动力。面对快速变化的市场需求、技术进步和全球化竞争&#xff0c;企业亟需打破传统的增长模式&#xff0c;从而实现真正意义上的突破性创新。“从0到1”这一理念&#xff0c;源…

System V IPC奥秘:解锁共享内存、消息队列与信号量的高效通信之路

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;system V共享内存 &#x1f352;共享内存的原理共享内存数据结构查看和删除共享内存资源的命令 &#x1f33b;共享内存…

Spacedrive:一款基于VDFS的跨平台文件管理器深度解析

前言 你的文件不再被各种设备、云盘束缚&#xff0c;而是像魔法般汇聚在一个地方&#xff0c;触手可及&#xff0c;那将是怎样的畅快淋漓&#xff1f;Spacedrive&#xff0c;这个名字听起来就像是穿越时空的驱动器&#xff0c;它正悄悄改变着我们对文件管理的认知&#xff1b;…

开发物联网驱动拍卖软件平台:如何实现了服务质量的全面提升

在数字化转型的浪潮下&#xff0c;物联网&#xff08;IoT&#xff09;技术正深刻地改变着各行各业的运作模式&#xff0c;拍卖行业也不例外。通过物联网的集成应用&#xff0c;拍卖平台能够实现更高效、透明和个性化的服务&#xff0c;极大地提升用户体验和服务质量。本文将以“…

一起学习LeetCode热题100道(44/100)

44.二叉搜索树中第 K 小的元素(学习) 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#…

u盘启动选择uefi还是legacy_u盘启动选择uefi还是legacy详细分析

最近有很多网友问我想用U盘安装系统&#xff0c;按照网上教程按快捷方式(一般是f12)出现选择U盘菜单时&#xff0c;我到底是选择legacy开头的U盘还是uefi开头的U盘&#xff0c;其实这个取决你要安装什么系统或是磁盘分区类型是gpt还是mbr&#xff0c;比如2016年后出来的笔记本和…

EasyRecovery17中文版永久汉化版电脑数据恢复工具下载

&#x1f388;&#x1f389;安利时间到&#xff01;今天要跟大家分享的是——EasyRecovery17中文版的最新功能&#xff01;&#x1f389;&#x1f388; &#x1f31f;✨ “数据恢复小能手” ✨&#x1f31f; 让我来介绍一下这款软件的主打特点。 EasyRecovery17中文版是一款强…

谷歌账号活动异常,或者申诉回来以后需要手机验证的原因,以及验证手机号的错误操作和正确操作

有一些朋友在使用谷歌账号的时候&#xff0c;会遇到无法直接登录的情况&#xff0c;输入用户名、密码以后&#xff0c;提示说账号活动异常&#xff0c;需要验证手机号。 通常有以下两种情形和界面&#xff0c;出现这种情形的原因分别如下。 一、谷歌账号登录需要输入手机号码…