生产环境最怕「手滑误操作」:
只删了几十/几百行数据,不想停业务、不想全库回滚,只想精准找回丢失的那部分数据?
这篇纯实操文,手把手教你SQL Server部分数据恢复,DBA直接收藏备用!建议转发给团队避坑。
一、恢复前先看:能不能救,先看这1点
SQL Server 能否精准恢复部分数据,核心看数据库恢复模式,先执行以下SQL自查:
-- 查看当前数据库恢复模式
SELECT
name 数据库名,
recovery_model_desc 恢复模式
FROM sys.databases
WHERE name = '你的库名';例如,本次演示的库的情况:

小提示:生产库强烈建议设为 FULL 模式,并搭配完整备份+日志备份,避免数据丢失无法挽回!
二、方案1:有备份+日志 → 最安全(企业标准方案)
适用场景:有完整备份 + 后续日志备份,想恢复到「误操作前一秒」,不影响生产业务。
核心思路:备份还原到临时库 → 从临时库抽数据 → 插回/覆盖原表(全程不碰生产库核心数据)。
第1步:把备份还原到临时库(不影响生产)
-- 还原完整备份(NORECOVERY 留着继续还原日志)
RESTORE DATABASE 库名_Temp
FROM DISK = 'C:\databak\备份文件.bak'
WITH NORECOVERY,
MOVE 'testdb' TO 'C:\MSDATA\库名_Temp.mdf',
MOVE 'testdb_log' TO 'C:\MSDATA\库名_Temp.ldf',
REPLACE;例如,我之前的备份文件是

-- 执行以下命令,查看备份文件中实际的逻辑文件名
RESTORE FILELISTONLY
FROM DISK = 'C:\databak\testdb.bak';

还原为临时的库tempdb如下:

第2步: 还原日志到「误操作前」时间点(关键!精准到秒)
RESTORE LOG testdb_Temp
FROM DISK = 'C:\Backup\testdb_log.trn'
WITH
RECOVERY,
STOPAT = '2026-03-02 15:10:00'; -- 改成误操作前的具体时间第3步:从临时库找回丢失数据(分2种情况)

原库中无删除的记录是id=2的记录
① 误删数据 → 直接插回原表(避免重复)
INSERT INTO 生产库.dbo.表名 (字段1,字段2,字段3)
SELECT 字段1,字段2,字段3
FROM 临时库.dbo.表名
WHERE ID BETWEEN 1 AND 3-- 只恢复你丢失的那部分数据范围
AND NOT EXISTS (
SELECT 1 FROM 生产库.dbo.表名
WHERE 生产库.dbo.表名.ID = 临时库.dbo.表名.ID
);
② 误更新数据 → 覆盖回正确值
UPDATE t1
SET t1.字段1 = t2.字段1,
t1.字段2 = t2.字段2
FROM 生产库.dbo.表名 t1
JOIN 临时库.dbo.表名 t2 ON t1.ID = t2.ID -- 用主键关联,确保数据对应
WHERE t1.ID BETWEEN 1 AND 3; -- 只还原误更新的部分第3步:验证数据,清理临时库
-- 检查恢复结果,确认数据无误
SELECT * FROM 生产库.dbo.表名 WHERE ID BETWEEN 1 AND 3;
-- 用完及时删除临时库,释放资源
DROP DATABASE 库名_Temp;三、方案2:无备份 → 日志急救(仅限紧急场景)
适用场景:没备份,但数据库是完整恢复模式,且日志未被截断、未收缩(应急用)。
原理:用 SQL Server 内置函数 `fn_dblog` 读取事务日志,逆向找回误操作的数据。
-- 查看目标表的删除/修改日志(筛选关键操作)
SELECT
[Transaction ID] 事务ID,
Operation 操作类型,
[Begin Time] 操作时间,
[RowLog Contents 0] 数据原文
FROM fn_dblog(NULL, NULL)
WHERE
AllocUnitName = 'dbo.你的表名' -- 格式:dbo.表名,替换为实际表名
AND Operation IN ('LOP_DELETE_ROWS','LOP_MODIFY_ROW') -- 筛选删除/修改操作
AND [Begin Time] BETWEEN '2026-03-02 09:00' AND '2026-03-02 11:00'; -- 误操作时间段
重要说明:
四、总结
如果在发现数据被误操作需要恢复时,记住如下3个保命提醒:
另外,只有完整恢复模式 + 备份/日志未被破坏的情况下才能恢复数据;无备份应急可以考虑用 fn_dblog`或第三方日志工具。
最靠谱的治本方案:生产库定时做全备+日志备份,做好权限管控,减少误操作。
你在生产上遇到过 SQL Server 误删数据吗?是怎么抢救回来的?欢迎在留言区交流经验,帮更多DBA避坑~
关注「数据库干货铺」,每天一条实战级 DBA 避坑指南。