【细如狗】记录一次采用MySQL的Binlog进行数据回滚的完整流程

news/2026/1/22 11:56:43/文章来源:https://www.cnblogs.com/tlnshuju/p/19516294

【细如狗】记录一次采用MySQL的Binlog进行数据回滚的完整流程

2026-01-22 11:48  tlnshuju  阅读(0)  评论(0)    收藏  举报
文章目录

1 事情起因

在最近的一次开发过程中,由于错将eq写成了set,导致全表数据被修改(还好是测试环境)
在这里插入图片描述

在这里插入图片描述

2 解决思路

利用MySQL的binlog进行数据回滚

3 利用binlog进行数据回滚

3.1 确认是否启用Binlog日志
SHOW VARIABLES LIKE 'log_bin';

在这里插入图片描述

3.2 确认是否有binlog文件
SHOW BINARY LOGS;

在这里插入图片描述

3.3 找到误操作的时间范围

这一步仅仅是为了缩小排查区间

可以通过对应服务的日志查询出大概的误操作时间范围

3.4 登录MySQL服务器查找binlog文件
3.4.1 查询binlog文件路径
  • 打开MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf)

    • 找到与这个相似的配置(binlog存储路径):log-bin=/var/lib/mysql/mysql-bin
    • 在这里插入图片描述
  • 如果找不到上述配置,采用另外一种思路获取binlog文件路径,查询日志文件名或索引文件名,能带出binlog的存储路径

    •     -- 用于查看 MySQL 服务器的二进制日志文件的基本文件名。SHOW VARIABLES LIKE 'log_bin_basename';
    • 在这里插入图片描述

    •     -- 用于查看 MySQL 服务器的二进制日志索引文件的名称。SHOW VARIABLES LIKE 'log_bin_index';
    • 在这里插入图片描述

    • 从获取到的结果来看,可以得出binlog是存在于/usr/local/src/mysql/data目录下的

3.4.2 找到binlog文件

在这里插入图片描述

3.4.3 确认误操作被存储在哪一份binlog文件中

我在执行误操作时大概是7月16日的14:30左右,所以应该查看的二进制日志文件是binlog.000034

3.5 查看二进制日志文件内容
3.5.1 利用被更新的表名筛选出大概的时间点
mysqlbinlog --no-defaults --start-datetime="2024-07-16 14:00:00" --stop-datetime="2024-07-16 15:00:00" binlog.000034 | grep -i 'item_code_distributor_rel'

在这里插入图片描述

3.5.2 对每个时间点进行查询,找出误操作的具体时间和记录
mysqlbinlog --no-defaults --start-datetime="2024-07-16 14:50:27" --stop-datetime="2024-07-16 14:50:28" --base64-output=DECODE-ROWS --verbose binlog.000034 | less

这块需要能够对业务了解,大概知道哪些数据被更新为了什么,被更新了多少条

这样就能够定位到binlog中具体的那条记录了

--base64-output=DECODE-ROWS --verbose
字段命令的作用是base64解码:是因为binlog是Base64 编码的二进制数据,需要解码
3.5.3 找到误操作的记录

更新了多少行数据,这里就会有多少个UPDATE语句
在这里插入图片描述

这个操作记录中SET是被更新的数据,WHERE是原本的数据

3.6 保存误操作的记录日志
mysqlbinlog --no-defaults --start-datetime="2024-07-16 14:50:27" --stop-datetime="2024-07-16 14:50:28" --base64-output=DECODE-ROWS --verbose binlog.000034 > cjh_get_parsed_binlog_2024-07-16-17-05.sql
3.7 分析记录,得出需要逆向解析SQL的思路

需要结合业务来看,哪些字段的数据被误更新了,以及3.5.3的图片为例

  • 我将全表数据的 @4@16都进行了错误更新

  • 所以仅需要以主键ID(@1)作为条件,将旧数据(WHERE中)的@4@16重新SET回去即可

  • 结合日志记录,获取期望的更新语句样例为:

    •     UPDATE 数据库.表名 SET @4的字段名 = @4,@16的字段名 = @16 WHERE @1的字段名 = @1;
3.8 编写脚本解析记录,得到SQL
package pers.chenjiahao.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*** @author ChenJiahao(五条)* @date 2024/7/16 17:36*/
public class MySQLBinaryLogParser {public static void main(String[] args) {String filePath = "D:工作文件技术文档cjh_get_parsed_binlog_2024-07-16-17-05.sql";String document = readFileContent(filePath);List 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("
");}} catch (IOException e) {e.printStackTrace();}return content.toString();}/*** 解析文本内容*/private static List parseDocument(String document) {List 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("
");// 待拼接的WHERE条件String whereClause = "";// 待拼接的SETStringBuilder sb = new StringBuilder();for (String line : lines) {if (line.startsWith("###   @1=")) {whereClause = "id = " + line.split("=")[1];}else if (line.startsWith("###   @4=")) {sb.append("item_code = " + line.split("=")[1]);}else if (line.startsWith("###   @16=")) {sb.append(",order_channel_id = " + line.split("=")[1]);}// 不需要读取日志文件中SET的内容,跳过即可if (line.startsWith("### SET")){break;}}// 拼接SQLString updateStatement = "UPDATE hm_product.item_code_distributor_rel " + "SET " + sb + " WHERE " + whereClause + ";";updateStatements.add(updateStatement);}return updateStatements;}
}
3.9 执行SQL语句,实现回滚
UPDATE hm_product.item_code_distributor_rel SET item_code = 'Ot2djSzc8e',order_channel_id = NULL WHERE id = 1;
..........省略N多条.......

4 最后

这次事情的起因也是因为一次编写代码的粗心造成的,虽然造成的影响不太好,但是解决问题的过程也挺有趣的。

如果还有别的好方案的话,欢迎在评论区分享。

欢迎大家收藏,但是最好别用到。

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条!

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

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

相关文章

青岛雷旺达船舶反馈怎么样,口碑排名大汇总

2026年文旅产业与公务执法装备需求持续升级,船艇产品的品质可靠性、售后服务响应速度及技术更新能力已成为客户选择合作伙伴的核心考量。无论是旅游景区的网红船型需求、执法部门的专业装备适配,还是企业对船艇全生命…

网络安全在线资源推荐:适合自学的 10 个平台

网络安全在线资源推荐&#xff1a;适合自学的 10 个平台 一、引言 网络安全自学依赖优质的在线资源&#xff0c;选择合适的平台能帮你高效获取知识、练习实战技能&#xff0c;避免在零散信息中浪费时间。本文精选 10 个适合自学的网络安全平台&#xff0c;涵盖基础理论、实战靶…

2026年优质数字人大屏公司、企业、厂家及厂商推荐——聚焦AI数字人交互与全场景应用

随着AI技术与数字场景深度融合,2026年数字人大屏市场持续升温,数字人大屏公司、企业、厂家及厂商纷纷加码技术研发与场景落地。数字人大屏作为政企展厅、政务服务、文旅教育等场景的核心交互载体,其3D数字人定制能力…

含可再生能源的热电联供型微网经济运行优化【机会约束|置信区间|蒙特卡洛】附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

普利斯策的价格竞争力如何,对比同行性价比哪家强

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家纺织工业停经架领域的标杆企业,为纺织制造企业选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:普利斯策 推荐指数:★★★★★ | 口碑评分:华东…

铜轴瓦品牌供应商靠谱吗,雪龙铜制品服务苏州地区

问题1:什么是铜轴瓦定制生产?和标准化铜轴瓦相比有哪些优势? 铜轴瓦定制生产是指根据客户设备的具体工况、结构尺寸、性能需求,对铜轴瓦的材质配方、结构设计、加工工艺进行个性化调整的生产方式。它并非简单的尺寸…

基于SpringAI的在线考试系统-试题管理模块完整优化方案

&#x1f3af; 试题管理模块完整优化方案&#xff08;布局交互算法数据模型&#xff09; 从前端布局、交互逻辑、后端算法、数据模型四个维度&#xff0c;完善试题管理模块的落地实现&#xff0c;让试题的创建、维护、关联更高效、更贴合教学场景。 一、&#x1f4cb; 前端布局…

2026年有实力的舞蹈艺考机构排名,CDC舞蹈艺考师资力量雄厚拔头筹

在艺术升学的赛道上,选择一家专业且可靠的舞蹈艺考培训机构,是考生敲开理想院校大门的关键一步。面对市场上良莠不齐的机构,如何精准定位适合自己的引路人?以下结合机构类型与核心优势,为你推荐2026年的舞蹈艺考培…

2026年专业解决青少年叛逆学校,广州树同学校费用多少钱

2026年青少年心理健康问题持续受到社会关注,叛逆、厌学、沉迷手机等成长困境已成为众多家庭的心头之痛。无论是孩子情绪失控的对抗、人际封闭的退缩,还是家长教养认知的失衡、亲子沟通的卡点,专业且系统化的帮扶机构…

2026想从事GIS开发有必要考研吗?

近年来&#xff0c;高校毕业生人数持续攀升&#xff0c;从2021年的909万增至2025年的1,222万&#xff0c;五年间增幅达34.4%。随着毕业生逐年增加&#xff0c;3S专业同学们的就业环境可以说是越来越卷&#xff0c;提升学历成了大家比较热门的选择之一。有些考研的同学是为了进一…

2026年创意十足的翡翠手镯款式排名,热门款式大揭秘

在玉石文化传承与时尚审美碰撞的当下,一款兼具文化底蕴与个性设计的翡翠手镯,既是腕间的装饰,更是个人品味与精神追求的外在表达。面对市场上琳琅满目的翡翠手镯品牌与款式,如何挑选到既贴合需求又品质过硬的产品?…

2026年值得推荐的工业设计品牌企业,北京璞新实力凸显

2026年制造业与科技产业深度融合,工业设计已成为企业提升产品竞争力、实现品牌差异化的核心引擎。无论是医疗器械的人机工学优化、机器人的外观与结构创新,还是新能源产品的全流程设计落地,优质工业设计机构的专业能…

订单日记助力普印科技实现全流程数字化

一、客户背景 浙江普印科技有限公司&#xff0c;成立于2018年&#xff0c;位于浙江省嘉兴市&#xff0c;是一家专注于生产、销售刻字机、打印机、三维扫描仪等产品的企业&#xff0c;在多年的商业经营中已成为业界翘楚。 在业务不断壮大的过程中&#xff0c;面临生产协作效率…

金山云星流全面升级,以智算穿越云上AI新周期

当前&#xff0c;人工智能产业迈入以“云AI”为核心驱动力的新周期&#xff0c;生成式AI加速规模化落地&#xff0c;产业重心正从模型训练阶段向推理环节转移&#xff0c;带动推理市场迎来指数级增长。麦肯锡报告预测&#xff0c;2028年全球AI推理市场规模将达1500亿美元&#…

基于SpringAI的在线考试系统-阅卷评分与错题管理模块回归测试逻辑梳理文档

阅卷评分与错题管理模块回归测试逻辑梳理文档 一、文档概述 1.1 测试核心目标 本次回归测试针对智能考试系统第七部分“阅卷评分”、第八部分“错题管理”两大模块&#xff0c;核心目标包括&#xff1a;验证模块优化后核心功能的正确性与稳定性&#xff0c;确保历史缺陷已完全修…

2026年北京受欢迎的家长管控孩子手机使用的APP排名及推荐

2026年,青少年触网年龄持续降低,手机沉迷已成为困扰千万家庭的隐形难题:学业滑坡、身心受损、亲子矛盾频发……在此背景下,专业的家长管控孩子手机使用的软件,正成为家庭平衡数字接触与健康成长的关键工具。无论是…

基于SpringAI的在线考试系统-智能考试系统-学习分析模块

&#x1f3af; 智能考试系统-学习分析模块整合优化方案&#xff08;数据驱动的精准教学闭环&#xff09; 按照考试执行→客观题答题记录生成→主观题评分→成绩整合→错题集生成→学习分析的核心业务流转顺序&#xff08;“先有成绩、再有错题、最后学习分析”逻辑&#xff09;…

2026内衬不锈钢复合管选型指南:从技术趋势到主流品牌的深度解析

2026内衬不锈钢复合管行业:从“材质替代”到“系统解决方案”的进化 在双碳目标与水质安全政策的双重驱动下,内衬不锈钢复合管行业正经历从“单一材质替代”到“全系统解决方案”的升级。据《2025-2030中国双金属复合…

无人机三维路径规划,基于杜鹃鲶鱼优化算法CCO实现,考虑最低成本:路径、高度、威胁、转角的多无人机协同集群避障路径规划附代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

记一类树上点覆盖问题

1有一棵树上有 \(n\) 个点,每个点都要被覆盖。 现在可以选一些点放置覆盖器,每个覆盖器可以与它 \(\le 0\) 的点,求最少放置数及方案。这个显然是给每个点放一个覆盖器。 2#1 中的每个覆盖器覆盖的距离换成 \(1\)。…