误删数据后第一反应是立即停止写入,保护现场;MySQL恢复依赖binlog(需开启且为ROW格式)、全量备份或延迟从库,无备份无binlog时文件级恢复成功率极低。

误删数据后第一反应不是重跑,而是立刻停止写入
数据库还在运行、应用还在写入,恢复窗口会以秒级缩小。哪怕只是几条日志,也可能覆盖 undo 页或归档日志位置。立刻联系 DBA 或执行 FLUSH TABLES WITH READ LOCK(MySQL)或 pg_dump 当前库快照(PostgreSQL),优先保全现场。
MySQL 恢复依赖 binlog,但必须满足三个前提
没开 binlog、或 binlog_format=STATEMENT 且删的是非确定性语句(如含 NOW()、UUID())、或已过期被 purge,就基本不可逆。确认可用的 binlog 需检查:
-
SHOW VARIABLES LIKE 'log_bin'—— 必须为ON -
SHOW VARIABLES LIKE 'binlog_format'—— 推荐ROW,否则无法还原具体行 -
SHOW BINLOG EVENTS IN 'mysql-bin.000001' LIMIT 10—— 确认事件类型含Delete_rows,且时间戳在误删操作前后
用 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 | grep -A 5 -B 5 'DELETE FROM your_table' 定位事件位置,再用 --start-position 和 --stop-position 截取反向 SQL。
PostgreSQL 不能靠 WAL 日志直接回放,得靠 pg_dump 或时间点恢复
WAL 是物理日志,不记录逻辑 SQL;pg_waldump 只能看页级变更,没法还原某张表的某几行。可行路径只有两条:
- 有近期
pg_dump -t your_table备份?立刻导入——这是最快路径 - 启用过
archive_mode = on且保留了归档 WAL?可停库,修改recovery_target_time到误删前一秒,启动 standby 恢复,再导出数据
注意:pg_rewind 不适用——它只同步主从差异,不解决单实例误删。
没有备份也没有 binlog/WAL 归档时,别信“工具扫描 ibd 文件”
某些开源工具(如 stream_parser + c_parser)能从 InnoDB ibd 文件里捞出未被覆盖的页,但成功率极低:只要表后续发生过 INSERT/UPDATE,旧记录所在页大概率已被复用。而且要求 MySQL 必须是 innodb_file_per_table = ON,且磁盘未被清空或 TRIM 过。真到了这步,建议直接评估业务容忍度,而不是花半天试工具。
最常被忽略的一点:应用层是否缓存了刚删掉的数据?比如 Redis 里存着完整对象、消息队列里还有未消费的原始事件、前端 localStorage 里留着表单草稿——有时比数据库恢复更快。

















