You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

差异备份时间点恢复遇阻:LSN链中断无法创建恢复计划

问题根源:日志备份链被破坏(备份文件重复覆盖/混存)

你遇到的LSN链中断问题,核心是日志备份没有形成连续、完整的独立备份链,你的备份策略里犯了两个关键错误:

1. 日志备份与完整/差异备份混存到同一个文件路径(甚至同一文件)

你把凌晨1点的日志备份写到和完整备份同一个@BackupPath,又把每小时的日志备份写到差异备份的@DIFFERENTIALBackupPath里。如果这些变量指向的是固定文件名而非按时间生成的唯一文件名,每次备份都会覆盖之前的文件——这意味着你只有最后一次日志备份,中间的所有日志都丢失了,LSN链自然断了。

就算是用追加模式(默认行为),把不同类型的备份(完整、差异、日志)混在同一个备份设备里,也会让SQL Server在恢复时难以正确解析日志链的顺序,增加出错概率。

2. 日志备份的存储逻辑缺失唯一性

差异备份本身不会中断日志链,但你每小时的日志备份如果没有唯一标识,就会直接覆盖之前的日志备份。没有连续的日志备份记录,自然无法还原到中间的时间点。


修正后的备份策略(实现时间点恢复)

要保证LSN链连续,必须让每个日志备份都有唯一的文件名,且不与其他类型备份混存。调整如下:

每日凌晨1点(完整备份+初始日志备份)

-- 完整备份:按日期生成唯一文件名
DECLARE @FullBackupPath NVARCHAR(256) = 'D:\Backups\MyDB_Full_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak';
BACKUP DATABASE MyDatabase TO DISK = @FullBackupPath WITH INIT; -- INIT覆盖当前文件(每日生成新文件,无数据丢失)

-- 完整备份后立即做一次日志备份,开启新的日志链
DECLARE @LogBackupPath NVARCHAR(256) = 'D:\Backups\MyDB_Log_' + CONVERT(VARCHAR(14), GETDATE(), 112) + REPLACE(CONVERT(VARCHAR(5), GETDATE(), 108), ':', '') + '.trn';
BACKUP LOG MyDatabase TO DISK = @LogBackupPath WITH INIT;

每小时执行(差异备份+日志备份)

-- 差异备份:按日期时间生成唯一文件名
DECLARE @DiffBackupPath NVARCHAR(256) = 'D:\Backups\MyDB_Diff_' + CONVERT(VARCHAR(14), GETDATE(), 112) + REPLACE(CONVERT(VARCHAR(5), GETDATE(), 108), ':', '') + '.bak';
BACKUP DATABASE MyDatabase TO DISK = @DiffBackupPath WITH DIFFERENTIAL, INIT;

-- 日志备份:必须生成唯一文件名,确保不覆盖之前的日志
DECLARE @LogBackupPath NVARCHAR(256) = 'D:\Backups\MyDB_Log_' + CONVERT(VARCHAR(14), GETDATE(), 112) + REPLACE(CONVERT(VARCHAR(5), GETDATE(), 108), ':', '') + '.trn';
BACKUP LOG MyDatabase TO DISK = @LogBackupPath WITH INIT;

注:用REPLACE去掉时间里的冒号是避免文件名非法字符;WITH INIT因为我们用了唯一文件名,所以直接覆盖新文件即可,不会丢失历史备份。


正确的时间点恢复步骤

假设你要恢复到今天上午10:30的状态:

  1. 恢复最新的、早于目标时间点的完整备份(比如今天凌晨1点的完整备份),带NORECOVERY:
    RESTORE DATABASE MyDatabase FROM DISK = 'D:\Backups\MyDB_Full_20240520.bak' WITH NORECOVERY;
    
  2. 恢复最新的、早于目标时间点的差异备份(比如今天上午10点的差异备份),带NORECOVERY:
    RESTORE DATABASE MyDatabase FROM DISK = 'D:\Backups\MyDB_Diff_202405201000.bak' WITH NORECOVERY;
    
  3. 按时间顺序应用从差异备份之后到目标时间点之前的所有日志备份,最后一个日志备份用STOPAT指定恢复时间,再完成恢复:
    -- 应用11点的日志备份,用STOPAT截断到10:30的状态
    RESTORE LOG MyDatabase FROM DISK = 'D:\Backups\MyDB_Log_202405201100.trn' WITH NORECOVERY, STOPAT = '2024-05-20 10:30:00';
    -- 最后执行恢复,让数据库可用
    RESTORE DATABASE MyDatabase WITH RECOVERY;
    

如果不用差异备份,直接从完整备份之后按顺序应用所有日志备份直到目标时间点即可。


内容的提问来源于stack exchange,提问作者user197505

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:03