MySQL数据误删或者误更新如何恢复(详细步骤,一看就会)

目录
  • 本篇文章适用场景
    • 一、下载MyFlash工具
    • 二、误删数据恢复
      • 先检查MySQL有没有开启binlog日志
      • 演示误删除数据
      • 利用MyFlash工具 反写SQL
      • 利用mysqlbinlog 执行反写的sql二进制文件
      • 恢复完成
    • 三、误更新数据恢复
      • 演示误更新数据
      • 查看binlog最近的更新记录 ,确定起始、结束位置
      • 利用MyFlash工具 反写SQL
      • 利用mysqlbinlog 执行反写的sql二进制文件
      • 恢复完成
      • 补充点 flush logs
    • 四、警告

本篇文章适用场景

①、测试环境少量近期误删除或者误更新的数据恢复。
②、测试环境少量从库数据不一致问题。

备注:大量数据的恢复或者复制还是需要使用备份数据,例如使用mysqldump或者Mydumper、mysqlshell。(本篇文章对此不做讨论)

警告:数据恢复为DBA专业人员负责处理的事情,本文章仅为开发人员测试环境恢复近期误操作的少量数据提供参考。
请对生产环境数据心存敬畏~

一、下载MyFlash工具

# 创建文件夹 mkdir /web cd /web # 下载压缩包 wget https://codeload.github.com/Meituan-Dianping/MyFlash/zip/master # 安装编译相关软件 yum install gcc -y yum install glib2 glib2-devel -y # 解压缩包 unzip master # 进入软件目录 cd /web/MyFlash-master # 编译 sh build.sh

编译完成后:

验证:

cd /web/MyFlash-master/binary ./flashback --help

输入:

MyFlash工具 安装完成

二、误删数据恢复

先检查MySQL有没有开启binlog日志
SHOW VARIABLES LIKE 'log_%';


如果发现数据库未开启binlog,那么这次恢复数据的旅程到此结束~

下面进入亡羊补牢时刻 (如果已经开启了 跳过这个步骤)。
打开MySQL的binlog日志:

# 找到MySQL的配置文件(一般情况下这样都能找到,找不到就要去问DBA或者运维了) find / -name my.cnf

一般情况下都是在 下面这个目录

添加配置:

vi /etc/my.cnf

添加一下配置

# 如果有集群这个id不用重复 server_id =6 # binlog日志位置 log_bin =/web/mysql/binlog/mysql-bin # binlog日志格式 binlog_format =row

重启MysQL

# 如果 systemctl 无法重启 就直接进入mysqld所在的目录重启 systemctl restart mysqld
演示误删除数据

先了解一些命令 后续要用到

# 查看所有binglog日志 SHOW MASTER LOGS; # 当前使用的日志 show master status; # 查看日志记录 show binlog events in '日志文件名';

下面开始演示:
先看下当前使用的binlog日志是哪个

# 当前使用的日志 show master status;


可以看到我目前的数据库使用的是 mysql-bin.000003 这个binlog日志

现在我有一张表 t_ph_uc_login

假如我误删了 t_ph_uc_login 表中的某条数据
这里我删除 id为 10f7a6c619e14b228df0e226bd84db5c 的数据

DELETE FROM `t_ph_uc_login` WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

此时再查已经查不到这条数据了:

一般情况下我们并不知道到底删除的是哪条数据,更不知道删除数据的id。

我一开始说的前提是这种方法适合最近误操作的数据恢复。

下面我们去查看binlog日志。

# 查看日志记录 SHOW BINLOG EVENTS IN 'mysql-bin.000003';

我查到了3258行,经常更新的表一定比这个数值大得多。所以我们要查看最后几十行就行。

这里利用分页查看最后几百条数据:

SHOW BINLOG EVENTS IN 'mysql-bin.000003' LIMIT 300 OFFSET 3000;

我们可以在最后几行中找到 删除相关的语句,并记录下事务开始设置时的位置 (Pos列的数字),和事务提交时的位置(End_log_pos列的数字)。
**注意图中蓝色标注框 **
开始: 11138303
结束: 11138917

利用MyFlash工具 反写SQL

delete语句反写成insert语句

cd /web/MyFlash-master/binary ./flashback --databaseNames="phoenix-saas" --tableNames="t_ph_uc_login" --sqlTypes="delete" --start-position=11138303 --stop-position=11138917 --binlogFileNames=/web/mysql/binlog/mysql-bin.000003 --outBinlogFileNameBase=/web/recover.log

注意:上面数据库名称,表名称,sql类型 要根据自身需求改动,输出的文件也可以根据需求改动,我这里就输出在/web目录下了

尤其需要注意 --start-position 和 -stop-position 的数值 如果填的不对 很可能会报下面的错
如果报了下面的错就要好好检查下 --start-position 和 -stop-position 的数值 取的对不对了

Segmentation fault (core dumped)

如果执行成功 就能看到下面红框的文件:

由于MyFlash工具反写的数据也是二进制文件,所以还需要使用MySQL自带的 mysqlbinlog工具来执行

这里还可以用mysqlbinlog把二进制文件recover.log.flashback 解析成文本文件看下(这一步仅仅是看看 恢复数据可跳过这步)

# 先找一下mysqlbinlog在哪 find / -name mysqlbinlog # 我的mysqlbinlog在/web/mysql/bin/mysqlbinlog文件夹中 cd /web/mysql/bin # 解析查看二进制文件recover.log.flashback mysqlbinlog -v /web/recover.log.flashback

可以看到MyFlash工具 已经把
上面我执行的delete语句反写成INSERT语句了

DELETE FROM `t_ph_uc_login` WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

利用mysqlbinlog 执行反写的sql二进制文件

最后一步利用mysqlbinlog 工具执行 反写的二进制文件 recover.log.flashback

# 先到 mysqlbinlog 所在的文件夹 cd /web/mysql/bin # 恢复数据 mysqlbinlog -v /web/recover.log.flashback | mysql -u用户名 -p密码

注意上面要输入自己数据库的用户名和密码

如果不报错 就说明数据恢复完成了。

如果报错下面的错:

ERROR 1782 (HY000) at line 17: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.

使用下面的语句查看是否开启了 全局事务ID (GTID) 功能

SELECT @@GLOBAL.GTID_MODE;

下图就是开启了。

可以 通过参数 --skip-gtids 跳过,不把gtid信息写到binlog中。不过如果数据库是多主或者一主多从的情况可能从库会出现数据不一致。

# --skip-gtids 跳过gtid信息 mysqlbinlog -v /web/recover.log.flashback --skip-gtids | mysql -u用户名 -p密码
恢复完成

执行完成后 再查询被删除的数据,可以发现已经恢复了。

三、误更新数据恢复

基本流程和上面误删除的恢复流程一致

演示误更新数据

还是拿id为 10f7a6c619e14b228df0e226bd84db5c 这条数据测试:
误更新前 user_id = 04f1fd53a4554e3fb5c9a40463a4ea4c

开始误更新

UPDATE `t_ph_uc_login` SET user_id = '小明' WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

误更新后:

假如我们不知道 误更新之前的user_id 是什么

查看binlog最近的更新记录 ,确定起始、结束位置
SHOW MASTER STATUS;

SHOW BINLOG EVENTS IN 'mysql-bin.000004'


这里再细说下 找position的技巧吧

这次是更新 那就先找 Update_rows ,找到后 往上找 INFO列的 BEGIN,再往上一行, SET @@SESSION.GTID_NEXT 设置全局事务ID的这行就是这次更新事务的始位置。开始position就确定了。
开始: 1159

顺着Update_rows 再往下找,找到INFO列的 最近的一个COMMIT,这行的 End_log_pos列就是 结束position

结束: 1929

利用MyFlash工具 反写SQL

这里update 还是会被反写成update

cd /web/MyFlash-master/binary ./flashback --databaseNames="phoenix-saas" --tableNames="t_ph_uc_login" --sqlTypes="update" --start-position=1159 --stop-position=1929 --binlogFileNames=/web/mysql/binlog/mysql-bin.000004 --outBinlogFileNameBase=/web/recover.log
利用mysqlbinlog 执行反写的sql二进制文件
# --skip-gtids 跳过gtid信息 mysqlbinlog -v /web/recover.log.flashback --skip-gtids | mysql -u用户名 -p密码
恢复完成

再查一下 可以看到 user_id 已经恢复了

补充点 flush logs

如果当前数据库 还有大量连接正在更新 可以执行flush logs 重新生成新的binlog日志

比如现在的日志名是001 执行 flush logs 后 ,会生成一个002的文件 ,并且当前会使用002文件记录
那你再去找001文件的position时 就不会受到干扰了

四、警告

非专业DBA请勿在生产环境操作上述过程~

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

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

相关文章

空间计算开发者技能指南 2026

空间计算时代的来临:定义、生态与技术共振 “空间计算”(Spatial Computing)不仅仅是营销术语,它标志着计算平台从二维屏幕向三维物理空间的范式转移。虽然 Apple 将 visionOS 定义为空间计算操作系统,但在更广泛的开…

通信协议仿真:通信协议基础_(7).协议仿真的工具与软件

协议仿真的工具与软件 在通信协议仿真领域,选择合适的工具和软件是至关重要的。这些工具和软件可以帮助我们更高效地设计、实现和测试通信协议。本节将详细介绍一些常用的协议仿真工具及其使用方法,包括NS-3、OMNeT++、MATLAB等。 1. NS-3 NS-3(Network Simulator 3)是一…

你画我猜计时答题对战房间酒馆互动神器H5开源

让我为您介绍这个"云起SAAS小酒馆互动H5"系统。 系统介绍 这是一个云起SAAS小酒馆互动H5系统,一个完整的双人对战游戏平台。 核心功能 1. 双人游戏模式计时答题对战: 双方同步答题,统计得分和用时,得分高且用时短者胜,输方接受惩罚你画我猜对战: 一人画一人猜,画手完…

《庄子》导读

《庄子》是战国时期道家学派的经典著作,由庄周及其后学共同撰写,全书现存 33 篇,分为内篇 7 篇、外篇 15 篇、杂篇 11 篇。学界普遍认为,内篇为庄子本人所著,集中体现核心思想;外篇、杂篇多为弟子及后学阐发…

mysql数据被误删的恢复方案

文章目录 一、使用备份恢复二、使用二进制日志(Binary Log)三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题,但通过合理的备份策略和使用适当的恢复工具,可以有效地减少数据丢失的风险…

【复杂网络分析】从直觉上理解《Stability of graph communities across time scales》

我刚接触社区发现时,最头疼的三个问题的是:到底什么是“好社区”?不同算法的结果为啥差这么多?模块化、谱聚类这些方法看着八竿子打不着,有没有内在联系?我们组的《Stability of graph communities across time scales》这篇经典论文,把这些经典方法串成了一张逻辑自洽的…

《庄子》核心篇章的思维导图框架

一、核心篇章总览内篇(必读,庄子核心思想载体)外篇/杂篇(选读,思想延伸与补充)二、内篇(必读)1. 《逍遥游》核心主题:“无待”的绝对逍遥境界关键意象:大鹏、…

通信原理篇---常见的调制方式

核心思想:为什么要调制?想象你要把一份秘密情报(信息)送到远方。问题1:情报是一张纸(低频信号),你自己跑步去送(低频电磁波),速度慢、传不远、还容…

通信原理篇

核心思想升级:从“送单词”到“送句子”在之前的基础调制(ASK、FSK、BPSK)中,我们一次只送1个比特(一个0或一个1)。这就像每次派一架飞机,只送一个字母,效率太低了。高阶调制的目标就…

亲测好用!专科生毕业论文必备的8款一键生成论文工具测评

亲测好用!专科生毕业论文必备的8款一键生成论文工具测评 专科生论文写作的痛点与测评思路 随着高校教育的不断普及,越来越多的专科生面临毕业论文撰写的压力。在实际操作中,许多学生会遇到选题困难、资料查找繁琐、格式不规范、语言表达不够专…

AGV 无人叉车在物流搬运中的核心优势

在物流成本上升、安全要求趋严的背景下,无人叉车已成为内部物流自动化的核心装备,正彻底改变传统仓储和物料搬运的运作模式。 AiTEN海豚之星作为全球领先的无人叉车与内部物流自动化解决方案提供商,依托全产品矩阵、自研核心技术与成熟交付能…

基于java的火车票订票系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录基于java的火车票订票系统的设计与实现一、项目简介(源代码在文末)1.运行视频2.🚀 项目技术栈3.✅ 环境要求说明4.包含的文件列表(含论文)数据库结构与测试用例系统功能结构前端运行截图后端运行截图项目部署源…

互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答

互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答 在本次面试故事中,面试官与求职者谢飞机围绕电商场景展开技术问答,涵盖Java核心技术、Spring Boot框架、微服务架构及相关技术栈。通过三轮循序渐进的问题,展示…

企业虚拟办公AI平台的灾备与容错设计:架构师确保系统7×24小时稳定运行

企业虚拟办公AI平台的灾备与容错设计:架构师确保系统724小时稳定运行 引言:虚拟办公时代,稳定是底线 在远程办公成为常态的今天,企业虚拟办公AI平台已成为组织协作的核心基础设施。从视频会议、实时文档协作到AI智能助手(如自动纪要、智能排班),这些服务的724小时高可…

【课程设计/毕业设计】通过python_CNN卷积神经网络对辣椒类别识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

AcuKG:大模型+知识图谱双轮驱动的中医针灸全面知识图谱自动构建及中医科研交互式知识发现

文章摘要 本研究构建了针灸知识图谱(AcuKG),系统性地整合多源数据,涵盖适应症、疗效、临床指南等内容。通过实体识别、语义关系提取等技术,AcuKG不仅增强知识发现能力,还显著提升大语言模型在针灸领域的问…

学长亲荐10个AI论文平台,助你搞定研究生论文写作!

学长亲荐10个AI论文平台,助你搞定研究生论文写作! AI 工具如何助力论文写作? 在研究生阶段,论文写作是每位学生必须面对的重要任务。无论是开题报告、文献综述还是最终的毕业论文,都对逻辑性、专业性和语言表达提出了极…

流式聚合不慢才怪?窗口、触发器和内存这三板斧你真用对了吗

流式聚合不慢才怪?窗口、触发器和内存这三板斧你真用对了吗做流处理这些年,我发现一个特别有意思的现象: 👉 大家都在写聚合,真正把“聚合性能”当回事的人并不多。 很多同学一上来就是: keyBywindowsum / …

Vue 2 企业级项目实战:从入门到架构师的完整成长记录

Vue 2 企业级实战进阶:从原理理解到工程化落地 一、学习路径的深度思考:不只是学,更是思考 第一阶段:理解 Vue 的设计哲学(2 周) 关键突破: 从 “怎么写” 到 “为什么这样写” 核心问题&am…

[认知计算] 专栏总结

[认知计算] 专栏总结 个人导航 知乎:https://www.zhihu.com/people/byzh_rc CSDN:https://blog.csdn.net/qq_54636039 注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码 参考文章:各方资料 目…