当前位置: 首页 > news >正文

MySQL误删数据了,如何快速恢复?

前言

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

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

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

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

希望对你会有所帮助。

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

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

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

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

数据丢失的三大元凶

  1. 人为误操作(占75%):DELETE忘加WHERE、DROP TABLE手滑

  2. 程序BUG(占20%):循环逻辑错误、事务未回滚

  3. 硬件故障(占5%):磁盘损坏、机房断电

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

image

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

2.常见的数据恢复方案

方案1:Binlog日志恢复

该方案最常用。

适用场景:误执行DELETE、UPDATE

恢复流程

image

操作步骤

1、定位误操作位置

mysqlbinlog --start-datetime="2023-08-01 14:00:00" \--stop-datetime="2023-08-01 14:05:00" \mysql-bin.000001 > /tmp/err.sql

2、提取回滚SQL(使用python工具)

# parse_binlog.py
import pymysql
from pymysqlreplication import BinLogStreamReaderstream = 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):# 生成反向UPDATEprint(f"UPDATE {binlogevent.table} SET {row['before_values']} WHERE {row['after_values']}")

3、执行恢复

python parse_binlog.py | mysql -u root -p db_name

方案2:延迟复制从库

该方案是金融级的方案。

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

架构原理

image

配置步骤

1、设置延迟复制

STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 1800; -- 延迟30分钟(1800秒)
START SLAVE;

2、误删后立即停止同步

STOP SLAVE;

3、将延迟从库提升为主库

RESET SLAVE ALL;
SHOW MASTER STATUS; -- 记录binlog位置

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

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

恢复流程

image

操作步骤

1、恢复全量备份

mysql -u root -p db_name < full_backup_20230801.sql

2、应用增量日志(跳过误操作点)

mysqlbinlog --start-position=100 --stop-position=500 \mysql-bin.000001 | mysql -u root -p

方案4:Undo日志恢复

该方案是InnoDB特有的。

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

核心原理

image

操作步骤

1、查询事务信息

SELECT * FROM information_schema.INNODB_TRX;

2、定位Undo页

SHOW ENGINE INNODB STATUS;

3、使用undrop-for-innodb工具

./undrop-for-innodb/system_parser -t user_data /var/lib/mysql/ibdata1

方案5:文件恢复

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

适用场景:DROP TABLE误操作

恢复流程

image

操作步骤

1、安装恢复工具

yum install testdisk -y

2、扫描磁盘

photorec /dev/sdb1

3、重建表结构

CREATE TABLE user_data (...) ENGINE=InnoDB;

4、导入表空间

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等云服务

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

image

最佳实践

  1. 设置策略:保留7天快照每4小时增量备份

  2. 误删后操作:

# 通过SDK创建临时实例
aliyun rds CloneInstance --DBInstanceId rm-xxxx \--BackupId 111111111 \--PayType Postpaid

3、恢复方案对比选型

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

3、WHERE条件检查:DELETE前先SELECT验证

4.3 备份策略(事后保障)

黄金备份法则:321原则

  • 3份备份(本地+异地+离线)

  • 2种介质(SSD+磁带)

  • 1份离线存储

总结

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

三要

  1. 立即冻结现场:发现误删马上锁定数据库。

  2. 优先使用Binlog:90%场景可通过日志恢复。

  3. 定期演练恢复:每季度做恢复测试。

三不要

  1. 不要心存侥幸:认为误删不会发生在自己身上。

  2. 不要盲目操作:恢复前先备份当前状态。

  3. 不要忽视监控:设置删除操作实时告警。

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

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

文章转载自:苏三说技术

原文链接:MySQL误删数据了,如何快速恢复? - 苏三说技术 - 博客园

体验地址:JNPF快速开发平台

http://www.dtcms.com/a/325328.html

相关文章:

  • GraalVM !拥抱云原生的 JVM
  • AI驱动的智能编码革命:从Copilot到全流程开发自动化
  • 2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测
  • SysTick定时器的工作原理是什么
  • 在Linux中模拟配置高性能web服务器
  • docker compose和docker-compose命令的区别
  • 【数据可视化-86】中国育儿成本深度可视化分析(基于《中国统计年鉴2023》数据):用Python和pyecharts打造炫酷可视化大屏
  • linux常见故障 实用故障系列文章-2获取挂掉的进程pid
  • Linux kernel network stack, some good article
  • AI模型服务接入WAF防火墙
  • WebSocket-java篇
  • 有序矩阵中第K小的元素+二分查找
  • 矩阵游戏(二分图最大匹配)
  • Spring Boot 菜单删除功能的实现与事务管理
  • 数据结构——树(02构造二叉树,代码练习)
  • 《解锁 C++ 进阶密码:引用补充与内联函数、nullptr 核心用法》
  • 爬虫与数据分析实战
  • Notepad++ 插件开发实战:从理念到落地的探索
  • libwebsockets 服务端获取过代理的真实连接IP
  • windows上RabbitMQ 启动时报错:发生系统错误 1067。 进程意外终止。
  • 编程技能:递归
  • leetcode 438. 找到字符串中所有字母异位词 -java
  • C语言:指针(3)
  • docker集群
  • 【图像处理基石】PCA图像压缩与还原:基于OpenCV的Lena图实验
  • 02Vue3
  • 想冲华为AI认证,怎么选方向?
  • 大模型落地:AI 技术重构工作与行业的底层逻辑
  • Selenium元素定位不到原因以及怎么办?
  • 编译Android版本可用的高版本iproute2