怎么把数据库回滚到指定时间点
SQL Server 时间点还原的完整流程:完整备份 + 差异 + 日志链的还原顺序、STOPAT 参数用法,以及前提条件与常见失败原因。
结论先行
时间点还原的前提是完整恢复模型(或大容量日志模型)且日志备份链完整。流程是:最近完整备份(NORECOVERY)→ 最近差异(NORECOVERY)→ 逐个日志备份叠加,最后一个用 WITH STOPAT = '目标时间' 收口。只要日志链断了,能回到的就是断裂点之前。
操作步骤
-- 1. 完整备份(NORECOVERY 保持待恢复状态)
RESTORE DATABASE Sales FROM DISK = N'E:\backup\sales_full.bak' WITH NORECOVERY;
-- 2. 差异备份(可选,加快起点)
RESTORE DATABASE Sales FROM DISK = N'E:\backup\sales_diff.bak' WITH NORECOVERY;
-- 3. 逐段日志备份,最后一段指定停止点
RESTORE LOG Sales FROM DISK = N'E:\backup\sales_log_0900.trn' WITH NORECOVERY;
RESTORE LOG Sales FROM DISK = N'E:\backup\sales_log_0930.trn' WITH STOPAT = N'2026-11-11 09:25:00', RECOVERY;
STOPAT也支持STOPATMARK(指定日志标记)与STOPBEFORETIME(恢复到标记之前),适合精确定位某条误操作事务。
前提条件与限制
- 恢复模型必须是 FULL 或 BULK_LOGGED;简单模型下日志已自动截断,根本没有可叠加的日志链。
- 日志备份必须时间线连续:漏一次日志备份,之后所有日志都用不上。
- 备份必须来自同版本或更低版本的引擎,跨版本还原方向是单向的(低 → 高)。
- 库须处于独占可访问状态,还原前断开所有连接。
常见失败原因速查
| 现象 | 根因 |
|---|---|
| 报「备份链不完整」 | 日志链缺段或顺序错 |
| 还原成功但没到目标时间 | STOPAT 时间早于链起点,只能退到最近可用备份 |
| 权限不足 | 需数据库所有者或 sysadmin 角色 |
用 SSMS 管理工具条目 的还原向导也能图形化完成同样流程,勾选「在指定时间点还原数据库」后选时间。SQL Server 2022 Developer、SQL Server 产品族条目 各引擎行为一致。