MySQL误删数据了,如何快速恢复?
前言
最近星球中有位小伙伴说:他不小心把测试环境MySQL表中所有数据都误删了,问我要如何快速恢复?
幸好他误删的是测试环境,非生产环境。
我遇到过,之前有同事把生产环境会员表中的数据误删除的情况。
这篇文章跟大家一起聊聊MySQL如果误删数据了,要如何快速恢复。
希望对你会有所帮助。
1.为什么数据恢复如此重要?
2023年某电商平台误删20万用户数据,导致直接损失800万。
某金融机构DBA误执行DROP TABLE,系统停摆6小时。
这些事故背后,暴露的是误删数据之后恢复方案的缺失。
数据丢失的三大元凶
- 人为误操作(占75%):
DELETE忘加WHERE、DROP TABLE手滑 - 程序BUG(占20%):循环逻辑错误、事务未回滚
- 硬件故障(占5%):磁盘损坏、机房断电
下面是数据丢失的主要原因:

那么,如果MySQL如果误删数据了,快速恢复数据的方案有哪些呢?
2.常见的数据恢复方案
方案1:Binlog日志恢复
该方案最常用。
适用场景:误执行DELETE、UPDATE
恢复流程:

操作步骤:
- 定位误操作位置
mysqlbinlog --start-datetime="2023-08-01 14:00:00" \
--stop-datetime="2023-08-01 14:05:00" \
mysql-bin.000001 > /tmp/err.sql
- 提取回滚SQL(使用python工具)
# parse_binlog.py
import pymysql
from pymysqlreplication import BinLogStreamReader
stream = BinLogStreamReader(
connection_settings = {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"passwd": "root"},
server_id=100,
blocking=True,
resume_stream=True,
only_events=[DeleteRowsEvent, UpdateRowsEvent])
for binlogevent in stream:
for row in binlogevent.rows:
if isinstance(binlogevent, DeleteRowsEvent):
# 生成INSERT语句
print(f"INSERT INTO {binlogevent.table} VALUES {row['values']}")
elif isinstance(binlogevent, UpdateRowsEvent):
# 生成反向UPDATE
print(f"UPDATE {binlogevent.table} SET {row['before_values']} WHERE {row['after_values']}")
- 执行恢复
python parse_binlog.py | mysql -u root -p db_name
方案2:延迟复制从库
该方案是金融级的方案。
适用场景:大规模误删数据
架构原理:

配置步骤:
- 设置延迟复制
STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 1800; -- 延迟30分钟(1800秒)
START SLAVE;
- 误删后立即停止同步
STOP SLAVE;
- 将延迟从库提升为主库
RESET SLAVE ALL;
SHOW MASTER STATUS; -- 记录binlog位置
方案3:全量备份+增量恢复
适用场景:整表或整库误删
恢复流程:

操作步骤:
- 恢复全量备份
mysql -u root -p db_name < full_backup_20230801.sql
- 应用增量日志(跳过误操作点)
mysqlbinlog --start-position=100 --stop-position=500 \
mysql-bin.000001 | mysql -u root -p
方案4:Undo日志恢复
该方案是InnoDB特有的。
适用场景:刚提交的误操作(事务未关闭)
核心原理:

操作步骤:
- 查询事务信息
SELECT * FROM information_schema.INNODB_TRX;
- 定位Undo页
SHOW ENGINE INNODB STATUS;
- 使用undrop-for-innodb工具
./undrop-for-innodb/system_parser -t user_data /var/lib/mysql/ibdata1
方案5:文件恢复
从物理备份中恢复,需要提前做备份。
适用场景:DROP TABLE误操作
恢复流程:

操作步骤:
- 安装恢复工具
yum install testdisk -y
- 扫描磁盘
photorec /dev/sdb1
- 重建表结构
CREATE TABLE user_data (...) ENGINE=InnoDB;
- 导入表空间
ALTER TABLE user_data DISCARD TABLESPACE;
cp recovered.ibd /var/lib/mysql/db_name/user_data.ibd
ALTER TABLE user_data IMPORT TABLESPACE;
方案6:云数据库快照恢复
适用场景:阿里云RDS、AWS RDS等云服务
操作流程(以阿里云为例):

最佳实践:
- 设置策略:
- 保留7天快照
- 每4小时增量备份
- 误删后操作:
# 通过SDK创建临时实例
aliyun rds CloneInstance --DBInstanceId rm-xxxx \
--BackupId 111111111 \
--PayType Postpaid
3、恢复方案对比选型
| 方案 | 恢复粒度 | 时间窗口 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| Binlog日志恢复 | 行级 | 分钟级 | 中 | 小范围误删 |
| 延迟复制从库 | 库级 | 小时级 | 高 | 核心业务数据 |
| 全量+增量恢复 | 库级 | 小时级 | 高 | 整库丢失 |
| Undo日志恢复 | 行级 | 秒级 | 极高 | 事务未提交 |
| 文件恢复 | 表级 | 不确定 | 极高 | DROP TABLE操作 |
| 云数据库快照 | 实例级 | 分钟级 | 低 | 云环境 |
4.如何预防误删数据的情况?
4.1 权限控制(事前预防)
核心原则:最小权限分配
-- 禁止开发直接操作生产库
REVOKE ALL PRIVILEGES ON *.* FROM 'dev_user'@'%';
-- 只读账号配置
GRANT SELECT ON app_db.* TO 'read_user'@'%';
-- DML权限分离
CREATE ROLE dml_role;
GRANT INSERT, UPDATE, DELETE ON app_db.* TO dml_role;
4.2 操作规范(事中拦截)
- SQL审核:所有DDL必须走工单
- 高危操作确认:执行DROP前二次确认
-- 危险操作示例
DROP TABLE IF EXISTS user_data; -- 必须添加IF EXISTS
- WHERE条件检查:DELETE前先SELECT验证
4.3 备份策略(事后保障)
黄金备份法则:321原则
- 3份备份(本地+异地+离线)
- 2种介质(SSD+磁带)
- 1份离线存储
总结
下面给大家总了数据恢复的三要三不要。
三要:
- 要立即冻结现场:发现误删马上锁定数据库。
- 要优先使用Binlog:90%场景可通过日志恢复。
- 要定期演练恢复:每季度做恢复测试。
三不要:
- 不要心存侥幸:认为误删不会发生在自己身上。
- 不要盲目操作:恢复前先备份当前状态。
- 不要忽视监控:设置删除操作实时告警。
设计系统时,永远假设明天就会发生数据误删。
当灾难真正降临时,你会发现所有的预防措施都是值得的。
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn
MySQL误删数据了,如何快速恢复?的更多相关文章
- MySQL 误删数据、误更新数据(update,delete忘加where条件)
MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...
- MySQL误删数据
首先看下mysql误删数据排名最前的几种是: 1.误删文件 2.误删库.表 3.错误全表删除 / 更新 4.升级操作失误 都来看看你命中过几个,hoho. 简单说下我亲手造的一个大事故吧. 那大概是一 ...
- MySQL误删数据救命指南
预防误操作导致文件/数据丢失的建议: 1.欲删除文件时,将rm命令改成mv,可在系统层面将rm命令做个alias(或参考Windows / Mac OSX做法,删除文件时先进回收站).2.删除数据库. ...
- mysql误删数据快速恢复
相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来.如 ...
- 10 MySQL之数据备份与恢复
01-数据备份 # 1.使用 MySQLdump 命令备份 MySQLdump 是MySQL提供的一个非常有用的数据库备份工具. MySQLdump 命令执行时,可以将数据库备份成一个文本文件,该文本 ...
- HBase从入门到精通系列:误删数据如何抢救?
云栖君导读:有时候我们操作数据库的时候不小心误删数据,这时候如何找回?mysql里有binlog可以帮助我们恢复数据,但是没有开binlog也没有备份就尴尬了.如果是HBase,你没有做备份误删了又如 ...
- mysql 插入数据失败防止自增长主键增长的方法
mysql设置了自增长主键ID,插入失败的那个自增长ID也加一的,比如失败5个,下一个成功的不是在原来最后成功数据加1,而是直接变成加6了,失败次数一次就自动增长1了,能不能让失败的不增长的? 或者说 ...
- MySQL mysqldump数据导出详解
介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明 ...
- MySQL数据库数据存放位置修改
MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...
- 在Linux环境下,将Solr部署到tomcat7中,导入Mysql数据库数据, 定时更新索引
什么是solr solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化. 准备工作 首先,去下载以下软件包: JDK8:jdk-8u60-linux-x64.tar.gz TOMCA ...
随机推荐
- 【2020.11.30提高组模拟】删边(delete) 题解
[2020.11.30提高组模拟]删边(delete) 题解 题意简述 给一棵树删边,每次删的代价为这条边所连的两个点的子树中最大点权值. 求删光的最小代价. \(n\le100000\). Solu ...
- DeepSeek为什么现在感觉不火了?
DeepSeek为什么现在感觉不火了?一个技术圈老兵的冷静分析 作为一个在AI圈摸爬滚打多年的技术从业者,看到这个问题,我想从几个维度来聊聊DeepSeek这个现象级产品的起落轨迹. 说实话,Deep ...
- Doxygen基本使用教程
前言 规范的注释是一个良好的编程习惯. Doxygen可以直接将注释提取为程序文档,便于开发人员使用 本文主要介绍了Doxygen的使用方法,更多细节请阅读官方文档 一.Doxygen是什么? dox ...
- 什么是CAE软件?哪个CAE软件好用?
CAE,全称Computer Aided Engineering,是指在工程领域结合计算机技术进行工程设计.分析.优化以及模拟仿真的应用.随着科技的发展,CAE技术在航空.汽车.电子.机械等领域越来越 ...
- Vertx 实现webapi实战项目(三)
实现消息分发和handler分配:上传json根据mId字段不同提供不同的解析器,然后将消息分发到不同的handler中. 一:消息分发 1:建立消息解析.新建接口IMessageRecogniz ...
- 1. 如何通过SSH连接到vector rob
#anki #vector #robot #digital-dream-labs ssh连接到vector机器人操作系统: 将机器人放到充电底座上,连接电源,机器人自动启动,成功后,双击背部按钮打开蓝 ...
- CSP-S 2024 游寄
我不曾忘记 很好听的草神歌,打算推完经过就推这个 . 我的破木箱 装满枯萎的花 放不下 光与壤 和新鲜的愿望 如果能飞翔 去高高的地方 撒一张 梦的网 收集爱的回响 你也在听吗 落单的孩子啊 别害怕 ...
- 真正的生产力来了!Docker迁移部署两步搞定!
前言 最近遇到了需要部署一套比较复杂的应用场景,刚好这套应用我在其他服务器部署过,为了节省折腾的时间,我打算直接把服务器上已有的搬过去. PS:没想到这个过程比从头开始来耗费时间 好在是把一键迁移的脚 ...
- Excel中去重并只保留最近n次日期/最大最小值的数据
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 假设一个应用场景如下:当前存在一个产品的记录表,记录着这一个产品对应的日期及状态.同一个产品中存在多条数据,记录产品在不同时间的 ...
- wordpress - 上传附件大小更改
我用的是树莓派4b,需要修改php.ini的路径是/etc/php/7.3/apache2/php.ini.根据安装的php版本来决定所在的路径. 让然了,也可以 sudo find / -name ...