SQL Server 日志备份是什么
完整恢复模型下,事务日志记录每一次已提交变更,日志备份把这些记录搬出数据库文件。有了连续的全量 + 日志链,就能把库还原到日志覆盖范围内的任意时间点,RPO 由日志备份频率决定,常见节奏是 5 到 15 分钟。数据库损坏时还要抢在日志文件消失前做一次结尾日志备份,否则最近几个小时的事务无法找回。
基本信息
| 适用平台 | SQL Server 各版本(完整恢复模型或大容量日志恢复模型) |
|---|---|
| 前提 | 数据库处于 FULL 或 BULK_LOGGED 恢复模型,且日志链完整未断 |
| 结尾日志备份 | 数据库在线时用 WITH NORECOVERY;数据文件损坏但日志仍可访问时用 WITH NO_TRUNCATE |
| 权限要求 | BACKUP DATABASE / BACKUP LOG 权限,或 db_owner、sysadmin 角色 |
| 频率设定 | 按 RPO 定;频率越高丢失窗口越小,但备份文件与 IO 开销越多 |
典型使用场景
- 误删数据的时间点恢复:全量 + 日志还原到删除动作前的时刻
- 分钟级 RPO 要求:高频日志备份把可丢失数据压缩到几分钟
- 灾难前的最后抢救:磁盘故障后先备份结尾日志,保住未入备份的事务
- 日志空间治理:定期日志备份本身会截断可截断部分,防止日志文件膨胀
- 日志传送与 Always On:日志备份是日志传送与部分同步方案的基础
日志备份与结尾日志
日志备份与结尾日志
# 确认恢复模型:SIMPLE 模型无法做日志备份
ALTER DATABASE [AppDB] SET RECOVERY FULL;
# 常规日志备份,INIT 覆盖文件、COMPRESSION 省空间
BACKUP LOG [AppDB] TO DISK = N'D:\backup\AppDB-log.trn' WITH INIT, COMPRESSION;
# 灾难前保住结尾日志(数据库仍在线)
BACKUP LOG [AppDB] TO DISK = N'D:\backup\AppDB-tail.trn' WITH NORECOVERY;
# 数据文件损坏但仍能访问日志时用 NO_TRUNCATE
BACKUP LOG [AppDB] TO DISK = N'D:\backup\AppDB-tail2.trn' WITH NO_TRUNCATE;
# 查看各库最近的备份与恢复模型
SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases;恢复模型对照
| 恢复模型 | 能否日志备份 | 时间点恢复 |
|---|---|---|
| FULL | 可以 | 支持,需全量 + 日志链完整 |
| BULK_LOGGED | 可以 | 支持,但含大容量操作的日志可能最小化记录 |
| SIMPLE | 不可以 | 不支持,日志在检查点后被自动截断 |
日志链一旦中断(例如中途切换恢复模型、或用备份覆盖还原数据库),需要重新做一次全量或差异备份重开链条,后续日志备份才能在还原时衔接。
SIMPLE 恢复模型的库无法做日志备份;把生产库设为 SIMPLE 就等于放弃时间点恢复能力,变更前应确认业务是否接受只恢复到最近一次全量。