SQL Server 还原链是什么
SQL Server 的数据库还原不是『打开一个文件』,而是把全量备份、差异备份、事务日志备份按顺序依次应用,形成一条还原链。中间每一步都用 WITH NORECOVERY 让数据库停在还原态,最后一步才用 WITH RECOVERY 开放数据库;只要链条没断,就能把库还原到日志覆盖范围内的任意时间点(STOPAT)。
基本信息
| 适用平台 | SQL Server 2016 及以上(RESTORE 语法各版本基本一致) |
|---|---|
| 前提 | 库须为完整恢复模式,日志链未断才能做日志还原 |
| 权限 | sysadmin / dbcreator 服务器角色,或目标库 db_owner |
| 关键选项 | NORECOVERY(保留还原态)、RECOVERY(开放库)、MOVE(重定向数据文件)、STOPAT(时间点) |
典型使用场景
- 误删数据后精确还原:用日志还原 + STOPAT 回到删除动作前一秒
- 整库恢复:全量 + 差异 + 增量日志按顺序补齐到最近可用点
- 还原验证:把备份还原成临时库名,检查数据后再决定是否切换
- 跨实例迁移:用备份文件还原到另一台服务器,路径不同时靠 MOVE 重定向
- 灾难恢复:磁盘损坏后用离线备份文件在备机重建数据库
还原前先读备份集内容
还原前先读备份集内容
# 查看备份文件里有哪些备份集、类型与 LSN 区间
RESTORE HEADERONLY FROM DISK = N'D:\backup\AppDB-full.bak';
# 取出逻辑文件名与原始路径,还原到新路径时要用 MOVE 重定向
RESTORE FILELISTONLY FROM DISK = N'D:\backup\AppDB-full.bak';
# 日志备份文件同理,先确认其 LSN 能与全量接上
RESTORE HEADERONLY FROM DISK = N'D:\backup\AppDB-log.trn';完整链还原示例
完整链还原示例
# 全量与差异都保持在还原态,等待后续日志
RESTORE DATABASE [AppDB_restore] FROM DISK = N'D:\backup\AppDB-full.bak' WITH NORECOVERY,
MOVE N'AppDB' TO N'D:\data\AppDB_restore.mdf',
MOVE N'AppDB_log' TO N'D:\data\AppDB_restore_log.ldf';
RESTORE DATABASE [AppDB_restore] FROM DISK = N'D:\backup\AppDB-diff.bak' WITH NORECOVERY;
# 最后一条日志才开放数据库,并可指定时间点
RESTORE LOG [AppDB_restore] FROM DISK = N'D:\backup\AppDB-log.trn'
WITH RECOVERY, STOPAT = N'2026-10-12T10:29:00';HEADERONLY 输出读法
| 列 | 含义 | 正常/异常 |
|---|---|---|
| BackupType | 备份类型:1 全量、5 差异、2 日志 | 与文件名标注不符时说明文件被改过名 |
| DatabaseName | 备份来源库名 | 与目标库不一致时须用 MOVE/换名还原 |
| FirstLSN / LastLSN | 该备份集的日志序列号区间 | 区间接不上说明中间缺备份,链条已断 |
| Position | 备份集在文件内的序号,还原时用 FILE = N 指定 | 一个 .bak 里放多个备份集时要显式指定 |
中间步骤误写 WITH RECOVERY 会提前开放数据库并截断还原链,后续日志备份再无法应用;写脚本时把 RECOVERY 固定放在最后一条日志还原上。
STOPAT 只能落在备份日志覆盖的时间区间内,且要求日志序列完整;没有做过日志备份、或中途做过日志截断(如切换到简单恢复模式)的库,日志还原无法补齐。