能恢复,但前提是数据库处于FULL恢复模式且事务日志完整;若为SIMPLE模式、日志被截断或备份缺失,则Log Explorer等工具无效;需先确认recovery_model_desc为FULL,并确保.ldf文件或.trn备份链连续可用。

能恢复,但前提是数据库处于 FULL 恢复模式,且事务日志未被截断或覆盖。 如果是 SIMPLE 模式,或者日志备份缺失、日志文件被 shrink 或自动清理过,Log Explorer、ApexSQL Log 这类工具基本无效——不是工具不行,是底层没留下可读的日志记录。
确认数据库是否支持日志级恢复
执行这条语句,看 recovery_model_desc 是不是 FULL:
SELECT name, recovery_model_desc FROM sys.databases WHERE name = '你的库名';
- 返回
FULL:可以继续,但必须确保自误删以来的事务日志(.ldf 文件)完整,或有连续的日志备份(.trn) - 返回
SIMPLE:Log Explorer打开后可能显示“no active log”或只看到极少量最近操作,基本无法定位到误删那条DELETE记录 - 即使为
FULL,如果 DBA 手动执行过BACKUP LOG ... WITH TRUNCATE_ONLY(旧版)或CHECKPOINT后又没及时备份日志,也会导致关键日志丢失
用 Log Explorer 读取在线日志或日志备份文件
Log Explorer 不直接连生产库实时抓日志,它依赖两类输入源:
- 在线数据库的
.ldf文件(需数据库脱机,或你有完整副本) - 已备份的
.trn文件(推荐,不影响生产)
操作时注意:
- 连接时勾选
Use Windows NT authentication更稳定;若输账号密码,确保该账号对目标库有db_owner权限 - Attach 日志后,在
Filter Log Records中务必设置Time Range—— 范围太宽会加载过慢甚至卡死,建议先粗略定到误删前后 10 分钟 - 在
Activity标签选DELETE,Table标签选具体表名,再点Find。找到后右键该记录 →Generate Undo Script,它会生成带INSERT的逆向语句 - 生成的脚本默认不含
WHERE条件,会还原整页/整事务的所有行;你要手动删掉不需要的行,或加AND ID IN (123, 456)限定
RESTORE LOG + STOPAT 比图形化工具有更细粒度控制
当误删发生在某个明确时间点(比如 2026-04-11 14:22:18),且你有完整日志备份链,RESTORE LOG ... WITH STOPAT 是最干净的方式:
- 先还原一个完整备份到临时库:
RESTORE DATABASE [MyDB_Temp] FROM DISK = 'full.bak' WITH NORECOVERY, REPLACE - 再依次还原后续日志备份,最后一条加
STOPAT = '2026-04-11 14:22:17'(比误删时间早 1 秒)和RECOVERY - 从
MyDB_Temp中查出被删的数据,用INSERT INTO 原库... SELECT ... FROM MyDB_Temp...补回 - 这个过程不依赖第三方工具,也不需要脱机原库,但要求你清楚备份文件路径和日志链顺序
真正容易被忽略的是日志链断裂问题:哪怕只有一个 .trn 文件损坏或缺失,STOPAT 就会失败,报错 The log in this backup set begins at LSN xxx but the database has LSN yyy。这时候 Log Explorer 也救不了——它读的也是同一段物理日志。恢复可行性的起点,永远是「日志是否还在」,而不是「用什么工具」。


















