文章目录

    • 一、背景
    • 二、准备测试数据
      • 1. 创建测试表
      • 2. 创建测试数据
    • 三、模拟误操作
    • 四、数据回滚
      • (一)方案一:云数据库恢复
      • (二)方案二:手动恢复
        • 1. 查询 binlog 日志
        • 2. 找到删除语句,手动还原为插入语句
      • (三)方案三: 导入还原的 sql(未测试,慎用)
      • 总结

一、背景

在日常开发运维中,我们可能会出现一些操作失误的情况,比如使用了错误的 sql 语句对 mysql 数据进行了 update、delete 等操作,失误操作导致数据出现问题,又或者架构设计上没有使用软删除机制,用户误删除了数据需要恢复。

那么如果出现这种情况,应该如何恢复失误/mysql 误删数据时,本文将使用几种常用方法一步一步带你回滚误删/误操的数据

二、准备测试数据

1. 创建测试表

create table jxy_pms.test_model
(create_time       bigint unsigned default 0     null,update_time       bigint unsigned default 0     null,delete_time       bigint unsigned default 0     null,test_model_id     varchar(255)                  not nullprimary key,name              varchar(255)                  null,remark            varchar(255)                  null
)collate = utf8mb4_unicode_ci;

2. 创建测试数据

insert into test_model (test_model_id, name, remark)
values ('1','test1','test-1'),('2','test2','test-2'),('3','test3','test-3');select * from test_modeltest_model_id  name   remark
1                 test1    test-1
2              test2    test-2
3                 test3    test-3

三、模拟误操作

delete from test_model

四、数据回滚

(一)方案一:云数据库恢复

如果你的 mysql 使用的时云数据库,比如阿里云、腾讯云,那么你可以到云数据库的控制台操作面板进行一键数据回滚,一般都可以选择对应的恢复区间,具体可以咨询对应的云数据库提供商,一般都会提供技术支持

优点:

  • 低风险
  • 操作简单
  • 有云供应商提供技术支持

缺点:

  • 恢复精度较低,没办法恢复指定的数据
  • 有可能恢复不全,云数据库是定期备份,可能还没来得及备份就被删了

(二)方案二:手动恢复

通过解读 binlog 日志内容,进行解析然后回放数据

binlog 日志:大白话:记录数据库的每个修改操作 sql

所以我们只需要找到对应的 binlog 日志中我们误操作的 sql 数据,然后编写对应的回放sql,就可以回滚数据

实操如下:

1. 查询 binlog 日志
show binary logs;SHOW MASTER STATUS;mysql-bin.000014    80019706    No
mysql-bin.000015    1326884    No
mysql-bin.000016    3650781    No
mysql-bin.000017    81424072    No
mysql-bin.000018    46681992    No
mysql-bin.000019    1075    No
mysql-bin.000020    207322979    No

可以看到最新的日志为:mysql-bin.000020

2. 找到删除语句,手动还原为插入语句
mysqlbinlog --no-defaults --verbose --base64-output=DECODE-ROWS --start-datetime='2025-01-16 15:12:00' --stop-datetime='2025-01-16 15:15:00' /var/lib/mysql/mysql-bin.000027 > /home/DataVolume/rec.sql
  • –base64-output=DECODE-ROWS 生成不加密的 sql 文件
  • –start-datetime 、stop-datetime 数据操作的时间区间

从 rec.sql 中找到对应的表 test_model 的删除操作,如果找不到,调整下–start-datetime 和 stop-datetime

找到删除的 sql 语句如下:

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
........
/*!*/;
# at 207319108
#240919 10:58:30 server id 1  end_log_pos 207319202 CRC32 0xe7b80345     Table_map: `jxy_pms`.`asynccron_cron_task` mapped to number 306#240919 10:59:04 server id 1  end_log_pos 207321626 CRC32 0x6b3323a9     Table_map: `jxy_pms`.`test_model` mapped to number 315
# at 207321626
#240919 10:59:04 server id 1  end_log_pos 207321718 CRC32 0xb004dad7     Delete_rows: table id 315 flags: STMT_END_F
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='1'
###   @2='test1'
###   @3='test-1'
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='2'
###   @2='test2'
###   @3='test-2'
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='3'
###   @2='test3'
###   @3='test-3'
# at 207321718
#240919 10:59:04 server id 1  end_log_pos 207321749 CRC32 0x90b858f7     Xid = 7486642
COMMIT/*!*/;

然后写个脚本,解析这块 sql,重新翻译为 insert 语句即可

优点:

  • 适合一些少量数据的还原
  • 能准确还原指定的数据,操作简单
  • 重新执行的 sql,不会对已有的数据造成其他损坏

缺点:

  • 不适合一些大量数据的还原
  • 比较复杂,需要解读 binlog 日志,并且需要编写脚本

(三)方案三: 导入还原的 sql(未测试,慎用)

如果你的数据库不是用的云数据库,没有一键恢复功能,然后你又不想用方案二,觉得太复杂,你可以直接将 binlog 日志直接全部还原

  • 先导出 binlog 日志

    mysqlbinlog --no-defaults --verbose --base64-output=DECODE-ROWS --start-datetime='2025-01-16 15:12:00' --stop-datetime='2025-01-16 15:15:00' /var/lib/mysql/mysql-bin.000027 > /home/DataVolume/rec.sql
    

    这里会导出 rec.sql 文件

  • 导入 sql

    mysql -u root -p test < rec.sql
    

优点

  • 相比较方案二简单一些
  • 适合范围恢复

缺点

  • 恢复精度较低,比如你可能只需要恢复 2025-01-16 15:12:00 这个点的某条错误sql,但是这个点可能还有其他操作sql也会被一起恢复,
  • 恢复期间的操作数据可能存在丢失

⚠️⚠️⚠️:本方案没有实际验证过,请自行测试

总结

如果你用的是云数据库,并且恢复的数据量比较大,推荐【方案一】使用云数据库提供的恢复功能(非常适用那么删库跑路的恢复,哈哈哈哈)

如果你只是想要恢复某个个点、某些错误sql,那么可以使用【方案二】

原文地址

Mysql 如何使用 binlog 日志回滚操作失误的数据

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

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

相关文章

wodpress结构化数据对SEO的作用

在 WordPress 网站中&#xff0c;结构化数据对 SEO 的作用主要体现在以下几个方面&#xff1a; 1. 提升搜索结果的可见性 结构化数据能够帮助搜索引擎更好地理解网页内容&#xff0c;从而以更精准的方式展示搜索结果。通过添加结构化数据&#xff0c;网页可以在搜索结果中显示…

讲一讲@ImportResource

题目详细答案ImportResource是 Spring 框架中的一个注解&#xff0c;用于将传统的 XML 配置文件导入到基于 Java 配置的 Spring 应用程序中。它允许开发者在使用 Java 配置的同时&#xff0c;继续利用现有的 XML 配置文件。这样可以逐步迁移旧的 XML 配置&#xff0c;或者在某些…

解决 Nginx 反代中 proxy_ssl_name 环境变量失效问题:网页能打开但登录失败

前言&#xff1a;在现代企业架构中&#xff0c;多域名反向代理是实现业务隔离、品牌独立的常见方案。然而&#xff0c;看似简单的Nginx配置背后&#xff0c;隐藏着与TLS协议、后端认证逻辑深度绑定的细节陷阱。本文将从原理到实践&#xff0c;详解为何在多域名场景下&#xff0…

三步完成,A100本地vLLM部署gpt-oss,并启动远程可访问api

A100本地vLLM部署gpt-oss&#xff0c;并启动远程可访问api GPT-oss试用 gpt-oss有两个原生配置是目前&#xff08;2025-8-8&#xff09;Ampere系列显卡不支持的&#xff0c;分别是默认的MXFP4量化&#xff0c;以及Flash-attn V3。官方给出的vllm教程也是默认使用的是H系列显卡…

【华为机试】63. 不同路径 II

文章目录63. 不同路径 II题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路核心思想&#xff1a;动态规划&#xff08;避开障碍&#xff09;算法流程复杂度分析边界与细节方法对比代码实现Go 实现&#xff08;含二维DP / 一维DP / 记忆化&#xff09;测试…

C++ 模拟实现 map 和 set:掌握核心数据结构

C 模拟实现 map 和 set&#xff1a;掌握核心数据结构 文章目录C 模拟实现 map 和 set&#xff1a;掌握核心数据结构一、set 和 map 的结构1.1 set的结构1.2 map的结构二、对红黑树的改造2.1 改造红黑树的节点2.2 改造红黑树2.2.1 仿函数的使用2.2.2 插入函数的改造2.2.3 删除函…

根据ASTM D4169-23e1标准,如何选择合适的流通周期进行测试?

根据ASTM D4169-23e1标准及行业实践&#xff0c;选择流通周期&#xff08;DC&#xff09;需综合以下因素&#xff1a;一、核心选择依据‌产品属性与包装形式‌‌重量体积‌&#xff1a;轻小包裹&#xff08;<4.53kg且<0.056m&#xff09;适用DC2/3/4/6/9/13-17等周期&…

MySQL的触发器:

目录 触发器的概念&#xff1a; 创建触发器&#xff1a; 查看触发器&#xff1a; 查看当前数据库的所有触发器的定义&#xff1a; 查看当前数据中某个触发器的定义&#xff1a; 从系统information_schema的TRIGGERS表中查询"salary_check_trigger"触发器的信息…

基于ubuntu搭建gitlab

原文地址&#xff1a;基于ubuntu搭建gitlab – 无敌牛 欢迎参观我的网站&#xff1a;无敌牛 – 技术/著作/典籍/分享等 之前介绍了一个使用 git openssh-server 搭建一个极简 git 库的方法&#xff0c;感兴趣可以查看往期文章&#xff1a;手搓一个极简远端git库 – 无敌牛 。…

测试GO前沿实验室:为水系电池研究提供多维度表征解决方案

测试GO前沿实验室&#xff1a;为水系电池研究提供多维度表征解决方案随着全球能源转型加速&#xff0c;水系电池因其高安全性、低成本和环境友好特性&#xff0c;成为下一代储能技术的重要发展方向。测试狗前沿实验室针对水系电池研发中的关键科学问题&#xff0c;整合先进表征…

Spring Boot 中 YAML 配置文件详解

Spring Boot 中 YAML 配置文件详解 在 Spring Boot 项目中&#xff0c;配置文件是不可或缺的一部分&#xff0c;用于自定义应用行为、覆盖默认设置。除了传统的 properties 文件&#xff0c;Spring Boot 对 YAML&#xff08;YAML Ain’t Markup Language&#xff09;格式提供了…

Milvus安装可视化工具,attu,保姆级

安装包链接&#xff1a;GitHub - zilliztech/attu: Web UI for Milvus Vector Databasehttps://github.com/zilliztech/attu?tabreadme-ov-file 下滑 举例&#xff1a;windows&#xff1a;下载安装&#xff0c;然后就可以连接了&#xff08;安装完打开后如果需要输入用户名密码…

避免“卡脖子”!如何减少内存I/O延迟对程序的影响?

单来说&#xff0c;内存 IO 就像是计算机的 “数据高速公路”&#xff0c;负责在内存和其他设备&#xff08;如硬盘、CPU 等&#xff09;之间传输数据。它的速度和效率直接影响着计算机系统的整体性能。 你有没有想过&#xff0c;当你点击电脑上的一个应用程序&#xff0c;它是…

V4L2摄像头采集 + WiFi实时传输实战全流程

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry V4L2摄像头采集 WiFi实时传输实战全流程 1. 实战场景概述 目标&#xff1a; 嵌入式设备&#xff08;如RK3588/正点原子开发…

Java 之 设计模式

1.单例模式1. ​​饿汉式&#xff08;Eager Initialization&#xff09;​​​​核心原理​​&#xff1a;类加载时立即创建实例&#xff0c;通过静态变量直接初始化。​​代码示例​​&#xff1a;public class Singleton {private static final Singleton INSTANCE new Sing…

[激光原理与应用-185]:光学器件 - BBO、LBO、CLBO晶体的全面比较

一、相同点非线性光学晶体属性BBO、LBO、CLBO均为非中心对称晶体&#xff0c;具备非线性光学效应&#xff0c;广泛应用于激光频率转换&#xff08;如倍频、三倍频、和频、差频&#xff09;、光学参量振荡&#xff08;OPO&#xff09;及电光调制等领域。宽透光范围三者均覆盖紫外…

Android APN加载耗时优化可行性分析

背景 根据Android系统底层机制和行业实践,本文讨论 APN 加载耗时从4.2s降至0.8s的数据合理性和技术可行性,需结合具体优化手段和硬件环境综合分析。 以下是关键判断依据及行业参考: ⚙️ 一、APN加载耗时基准参考 未优化场景的典型耗时 首次开机或重置后:APN需从apns-con…

mysql进阶-sql调优

概述优化索引在MySQL初阶的课程中已经介绍了索引&#xff0c;我们知道InnoDB存储引擎使⽤B树作为索引默认的数据结构来组织数据&#xff0c;为频繁查询的列建⽴索引可以有效的提升查询效率&#xff0c;那么如何利⽤索引编写出⾼效的SQL查询语句&#xff1f;以及如何分析某个查询…

海量数据处理问题详解

1.从a&#xff0c;b两个文件各存放50亿个url&#xff08;每个url大小为64B&#xff09;&#xff0c;如何在内存为4G中查找a&#xff0c;b中相同的url 计算各文件存放大小&#xff1a;50亿*64B 大约为320G&#xff0c;而内存只有4G&#xff0c;显然存放不下&#xff0c;此时我们…

AI 记忆管理系统:工程实现设计方案

本文档为《从“健忘”到“懂我”&#xff1a;构建新一代AI记忆系统》中所述理念的详细工程实现方案。它将聚焦于技术选型、模块设计、数据流转和核心算法&#xff0c;为开发团队提供清晰的落地指引。 1. 系统架构与技术选型 为实现分层记忆与读写分离的设计理念&#xff0c;我们…