前言

最近星球中有位小伙伴说:他不小心把测试环境MySQL表中所有数据都误删了,问我要如何快速恢复?

幸好他误删的是测试环境,非生产环境。

我遇到过,之前有同事把生产环境会员表中的数据误删除的情况。

这篇文章跟大家一起聊聊MySQL如果误删数据了,要如何快速恢复。

希望对你会有所帮助。

1.为什么数据恢复如此重要?

2023年某电商平台误删20万用户数据,导致直接损失800万

某金融机构DBA误执行DROP TABLE,系统停摆6小时

这些事故背后,暴露的是误删数据之后恢复方案的缺失。

数据丢失的三大元凶

  1. 人为误操作(占75%):DELETE忘加WHERE、DROP TABLE手滑
  2. 程序BUG(占20%):循环逻辑错误、事务未回滚
  3. 硬件故障(占5%):磁盘损坏、机房断电

下面是数据丢失的主要原因:

那么,如果MySQL如果误删数据了,快速恢复数据的方案有哪些呢?

2.常见的数据恢复方案

方案1:Binlog日志恢复

该方案最常用。

适用场景:误执行DELETE、UPDATE

恢复流程

操作步骤

  1. 定位误操作位置
mysqlbinlog --start-datetime="2023-08-01 14:00:00" \
--stop-datetime="2023-08-01 14:05:00" \
mysql-bin.000001 > /tmp/err.sql
  1. 提取回滚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']}")
  1. 执行恢复
python parse_binlog.py | mysql -u root -p db_name

方案2:延迟复制从库

该方案是金融级的方案。

适用场景:大规模误删数据

架构原理

配置步骤

  1. 设置延迟复制
STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 1800; -- 延迟30分钟(1800秒)
START SLAVE;
  1. 误删后立即停止同步
STOP SLAVE;
  1. 将延迟从库提升为主库
RESET SLAVE ALL;
SHOW MASTER STATUS; -- 记录binlog位置

方案3:全量备份+增量恢复

适用场景:整表或整库误删

恢复流程

操作步骤

  1. 恢复全量备份
mysql -u root -p db_name < full_backup_20230801.sql
  1. 应用增量日志(跳过误操作点)
mysqlbinlog --start-position=100 --stop-position=500 \
mysql-bin.000001 | mysql -u root -p

方案4:Undo日志恢复

该方案是InnoDB特有的。

适用场景:刚提交的误操作(事务未关闭)

核心原理

操作步骤

  1. 查询事务信息
SELECT * FROM information_schema.INNODB_TRX;
  1. 定位Undo页
SHOW ENGINE INNODB STATUS;
  1. 使用undrop-for-innodb工具
./undrop-for-innodb/system_parser -t user_data /var/lib/mysql/ibdata1

方案5:文件恢复

从物理备份中恢复,需要提前做备份。

适用场景:DROP TABLE误操作

恢复流程

操作步骤

  1. 安装恢复工具
yum install testdisk -y
  1. 扫描磁盘
photorec /dev/sdb1
  1. 重建表结构
CREATE TABLE user_data (...) ENGINE=InnoDB;
  1. 导入表空间
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等云服务

操作流程(以阿里云为例)

最佳实践

  1. 设置策略:

    • 保留7天快照
    • 每4小时增量备份
  2. 误删后操作:
# 通过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 操作规范(事中拦截)

  1. SQL审核:所有DDL必须走工单
  2. 高危操作确认:执行DROP前二次确认
-- 危险操作示例
DROP TABLE IF EXISTS user_data; -- 必须添加IF EXISTS
  1. WHERE条件检查:DELETE前先SELECT验证

4.3 备份策略(事后保障)

黄金备份法则:321原则

  • 3份备份(本地+异地+离线)
  • 2种介质(SSD+磁带)
  • 1份离线存储

总结

下面给大家总了数据恢复的三要三不要。

三要

  1. 立即冻结现场:发现误删马上锁定数据库。
  2. 优先使用Binlog:90%场景可通过日志恢复。
  3. 定期演练恢复:每季度做恢复测试。

三不要

  1. 不要心存侥幸:认为误删不会发生在自己身上。
  2. 不要盲目操作:恢复前先备份当前状态。
  3. 不要忽视监控:设置删除操作实时告警。

设计系统时,永远假设明天就会发生数据误删。

当灾难真正降临时,你会发现所有的预防措施都是值得的。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

本文收录于我的技术网站:http://www.susan.net.cn

MySQL误删数据了,如何快速恢复?的更多相关文章

  1. MySQL 误删数据、误更新数据(update,delete忘加where条件)

    MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...

  2. MySQL误删数据

    首先看下mysql误删数据排名最前的几种是: 1.误删文件 2.误删库.表 3.错误全表删除 / 更新 4.升级操作失误 都来看看你命中过几个,hoho. 简单说下我亲手造的一个大事故吧. 那大概是一 ...

  3. MySQL误删数据救命指南

    预防误操作导致文件/数据丢失的建议: 1.欲删除文件时,将rm命令改成mv,可在系统层面将rm命令做个alias(或参考Windows / Mac OSX做法,删除文件时先进回收站).2.删除数据库. ...

  4. mysql误删数据快速恢复

    相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来.如 ...

  5. 10 MySQL之数据备份与恢复

    01-数据备份 # 1.使用 MySQLdump 命令备份 MySQLdump 是MySQL提供的一个非常有用的数据库备份工具. MySQLdump 命令执行时,可以将数据库备份成一个文本文件,该文本 ...

  6. HBase从入门到精通系列:误删数据如何抢救?

    云栖君导读:有时候我们操作数据库的时候不小心误删数据,这时候如何找回?mysql里有binlog可以帮助我们恢复数据,但是没有开binlog也没有备份就尴尬了.如果是HBase,你没有做备份误删了又如 ...

  7. mysql 插入数据失败防止自增长主键增长的方法

    mysql设置了自增长主键ID,插入失败的那个自增长ID也加一的,比如失败5个,下一个成功的不是在原来最后成功数据加1,而是直接变成加6了,失败次数一次就自动增长1了,能不能让失败的不增长的? 或者说 ...

  8. MySQL mysqldump数据导出详解

    介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明 ...

  9. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

  10. 在Linux环境下,将Solr部署到tomcat7中,导入Mysql数据库数据, 定时更新索引

    什么是solr solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化. 准备工作 首先,去下载以下软件包: JDK8:jdk-8u60-linux-x64.tar.gz TOMCA ...

随机推荐

  1. Seata源码—8.Seata Saga模式的事务处理

    大纲 1.Seata Saga案例简介 2.Seata Saga案例的状态机定义分析 3.Seata Saga分布式事务与状态机关系 4.Seata Saga案例的Dubbo服务调用配置分析 5.Se ...

  2. WindowsPE文件格式入门04.导入表

    https://bpsend.net/thread-307-1-1.html PE 内部保存了导入的dll 和 api信息,这些信息保存到一个表里面.称为导入表, 导入表就是 记住一个可执行文件导入了 ...

  3. Github Copilot 实战: 从零开始用AI写一个OCR工具 (1)

    最近AI很火,咱也尝试一下由浅入深探索一下 Github Copilot 的能力和底限. 使用的环境是 Windows11 + Microsoft Visual Studio Enterprise 2 ...

  4. L1-6、Prompt 与上下文的关系🤖

    模型不是"记性差",只是"提示不清". 为什么理解上下文对话很重要? 大模型具备 "上下文窗口" 的能力,可以"记住"你 ...

  5. Java 异常处理try、catch、finally和return执行顺序

    目录 问题背景 finally语句一定执行吗 finally语句与return的执行顺序 问题分析 1. finally语句在f()执行之后.y返回之前执行 2. finally块中的return语句 ...

  6. Ubuntu 通过 ssh 下载、上传文件

    下载文件 scp root@xxx.xxx.xxx.xxx:/root/file.txt /home 输入密码 上传文件 scp /home/file.txt root@xxx.xxx.xxx.xxx ...

  7. IDEA terminal控制台配置git bash及中文乱码问题

    1.修改控制台shell路径:setting -> Tools -> Terminal -> Shell path,修改为git安装路径. 修改完毕,在控制台输入exit断开sess ...

  8. 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(5)

    1.问题描述: 集成华为一键登录的LoginWithHuaweiIDButton, 但是Button默认名字叫 "华为账号一键登录",太长无法显示,能否简写成"一键登录& ...

  9. python学习思维导图分享

    python 本文包含了我的一些python学习的笔记和思维导图 第一部分:python基础 导图下载链接 第二部分:函数及其他文件操作 导图下载链接 第三部分:类及网络编程 导图下载链接 第四部分: ...

  10. linux系统僵尸进程处理

    查看僵尸进程 [root@mac-25 ~]# top top - 19:04:11 up 177 days, 23:58, 2 users, load average: 15.18, 21.64, ...