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

前言

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

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 = "";// 待拼接的SETStringBuilder 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.rhkb.cn/news/403744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自动驾驶】控制算法(二)三大坐标系与车辆运动学模型

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

第37讲:Cephfs文件系统的正确使用姿势

文章目录 1.Cephfs文件系统简介2.Cephfs文件系统细节介绍2.1.Cephfs文件系统多客户端隔离挂载2.2.Ceph集群中多个Cephfs如何单独使用 3.挂载多个Cephfs文件系统4.Cephfs文件系统多客户端隔离挂载实战4.1.创建一个Cephfs文件系统4.2.将Cephfs文件系统挂载到本地路径4.3.在Cephfs…

java:IDEA修改java版本的几个不同的地方

文章目录 项目JDK设置&#xff08;Project SDK&#xff09;项目模块级JDK设置&#xff08;Module SDK&#xff09;IDE级别的JDK设置Maven配置文件编译器&#xff08;Java Compiler&#xff09;构建工具配置文件&#xff08;如build.gradle或pom.xml&#xff09;.idea/misc.xml文…

Chrome快捷键提高效率

浏览效率提高快捷建 快速切换标签页 Ctrl 数字&#xff08;1或者2&#xff09;&#xff0c;标签页数字从左到右为顺序&#xff0c;1开始。快速切换标签页。 Ctrl1 到 Ctrl8 切换到标签栏中指定位置编号所对应的标签页 Ctrl9切换到最后一个标签页 CtrlTab 或 CtrlPgDown 切…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

英伟达开源 Nemotron-4-4B:小型模型,大能量

前沿科技速递&#x1f680; 在人工智能领域&#xff0c;语言模型已经成为推动自然语言处理&#xff08;NLP&#xff09;进步的关键力量。然而&#xff0c;随着模型规模的不断扩大&#xff0c;训练和部署这些大型语言模型&#xff08;LLM&#xff09;的资源成本也在急剧增加。为…

WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印安卓库 简介 本插件主要用于旻佑热敏打印机打印标签&#xff0c;不支持票据打印。适用于旻佑的各型支持标签打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请…

uni-app--》打造个性化壁纸预览应用平台(二)

&#x1f3d9;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名前端工程师 &#x1f304;个人主页&#xff1a;亦世凡华、 &#x1f306;系列专栏&#xff1a;uni-app &#x1f307;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

深度学习的量化和剪枝

一&#xff1a;背景 如果要将深度学习的AI模型部署到受限设备&#xff08;FPGA&#xff09;上&#xff0c;往往需要更小的存储需求和最低的计算复杂度。当然&#xff0c;还得保持一定的性能&#xff08;下降在能够接受的范围&#xff09;。受限设备资源的环境&#xff0c;一般是…

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

分布式锁:Mysql实现,Redis实现,Zookeeper实现

目录 前置知识 Mysql实现分布式锁 1.get_lock函数 Java代码实现&#xff1a; 2.for update尾缀 Java代码实现&#xff1a; 3.自己定义锁表 Java代码实现&#xff1a; 4.时间戳列实现乐观锁 Java代码实现&#xff1a; Redis实现分布式锁 Zookeeper实现分布式锁&#…

完整搭建windows下mysql8.0源码编译调试环境!

背景&#xff1a; 前段时间一直在看mysql相关的博客&#xff0c;所以对源码起了浓厚的兴趣&#xff0c;所以尝试通过vmware和vscode在windosw环境中搭建一套编译调试的环境~ 看了一下网上的搭建教程基本杂乱无章&#xff0c;想要从零跟着搭建出一个完善的调试环境也不是易事&…

Leetcode3232. 判断是否可以赢得数字游戏

Every day a Leetcode 题目来源&#xff1a;3232. 判断是否可以赢得数字游戏 解法1&#xff1a;3232. 判断是否可以赢得数字游戏 用一个 sum1 统计个位数的和&#xff0c;sum2 统计十位数的和。 只要 sum1 和 sum2 不相等&#xff0c;Alice 拿大的就能赢得这场游戏。 代码…

Maven的依赖范围

依赖的jar包&#xff0c;默认情况下&#xff0c;可以在任何地方使用&#xff0c;可以通过scope来设置作用范围 作用范围&#xff1a; 主程序范围有效&#xff08;main文件夹范围内&#xff09;测试程序范围有效&#xff08;test文件夹范围内&#xff09;是否参与打包运行&…

一次日志记录中使用fastjson涉及到ByteBuffer的教训

背景 目前本人在公司负责的模块中&#xff0c;有一个模块是负责数据同步的&#xff0c;主要是将我们数据产线使用的 AWS Dynamodb 同步的我们的测试QA 的环境的 MongoDB 的库中&#xff0c;去年开始也提供了使用 EMR 批量同步的功能&#xff0c;但是有时候业务也需要少量的数据…

【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换

凸包特征检测 凸包就是图像的最小外接多边形&#xff0c;通过图像的轮廓点&#xff0c;找到距离最远的两个点的直线&#xff0c;根据直线找到距离最远的下一个点&#xff0c;直到所有的点被包围在多边形内 读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点 convexHull 获…

程序员如何写PLC程序

PLC是可编程逻辑控制器的简称&#xff0c;常用的编程语言是IEC61131-3&#xff08;梯形图、结构化文本、指令表、功能块、顺序功能图&#xff09;和西门子的SCL。程序员常用的编程语言是JS、Java、Python、C/C、Go等。PLC广泛采用编程工具有codesys、博图等。程序员常用的编程工…

敏捷架构在数字时代的应用:从理论到实践的全面指南

在数字化转型和技术变革的浪潮中&#xff0c;企业面临着不断提升敏捷性和应对复杂环境的挑战。敏捷架构在数字时代的应用不仅从理论层面阐述了敏捷架构的基本原理&#xff0c;还为企业提供了详细的实践指南&#xff0c;帮助企业从理论走向实际操作。本文将从理论与实践的双重视…

STM32——CAN通讯基础知识

CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的&#xff0c;并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&#xff1a; 高速CAN可以达…

YOLOv8_det/seg/pose/obb推理流程

本章将介绍目标检测、实例分割、关键点检测和旋转目标检测的推理原理,基于onnx模型推理,那么首先就需要了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作,这部分内容在我的另一个专栏《YOLOv8深度剖析》中也有介绍,如果对YO…