日志序列号和还原计划
本主题与使用完整恢复模式的 SQL Server 数据库相关。
对于还原计划,最重要的日志序列号 (LSN) 是第一个和最后一个 LSN。可以从下列位置获取这些 LSN:
msdb 中的 backupset 表。名为 first_lsn 和 last_lsn 的列。
RESTORE HEADERONLY 语句。名为 FirstLSN 和 LastLSN 的列。
下表给出了这些术语用于不同备份的定义。
主题 |
定义 |
---|---|
first_lsn 或 FirstLSN |
备份集中第一个或最早日志记录的日志序列号。 对于数据备份和差异备份,第一个 LSN 标识的是需要使用此备份执行恢复的最早日志记录。 对于日志备份,第一个 LSN 标识的是备份中包含的第一个日志记录。 |
last_lsn 或 LastLSN |
备份集之后的下一条日志记录的日志序列号。 最后一个 LSN 标识的是备份结束后的下一个日志记录。对于数据备份和差异备份(以及包含大容量日志操作的日志备份),必须至少前滚到此 LSN。否则,还原期间复制的数据会出现不一致。 对于日志备份,它包含的日志记录最多到(但不包含)此 LSN。 |
日志序列号和数据备份或差异备份
对于数据备份和差异备份,first_lsn 和 last_lsn 之间的日志数据包含在备份中。这使得使用该备份(而无需日志备份)就可以恢复到 last_lsn。
对于数据备份或差异备份,如果按还原顺序使用备份,则 last_lsn 可能是最早的恢复点。如果需要更早的恢复点,则必须使用更早的备份。
当您计划在还原数据备份或差异备份后使用哪个日志备份前滚时,通常将从该数据备份或差异备份之后的第一个日志备份开始。检查备份的属性时,您就会发现这样一个日志备份,其 first_lsn 小于或等于数据备份或差异备份中的 last_lsn,并且 last_lsn 大于数据日志备份或差异日志备份中的 last_lsn。
日志序列号和日志链中的日志备份
新的日志链将随数据库创建后的第一个完整数据库备份而启动,或在从简单恢复模式切换到完整或大容量日志恢复模式后启动。在链的第一个日志备份中,backupset.begins_log_chain= 1。
first_lsn 和 last_lsn 用于将日志备份连成一个连续的序列(即日志链)。您可以使用连续日志备份序列前滚数据库(可以从最近的数据备份或差异备份前滚,也可以从丢失或损坏的数据备份和差异备份的早期备份前滚)。
在日志备份中,first_lsn 是备份中第一个日志记录的 LSN,从此日志记录开始,日志备份最多包含到 LSN 为 last_lsn 的日志记录(但不包含该日志记录)。当且仅当早期备份 (Backup_A) 中的最后一个日志记录的 LSN 大于或等于后期备份 (Backup_B) 中的第一个日志记录的 LSN 时,两个日志备份才是连续的;也就是说,Backup_A.last_lsn>= Backup_B.first_lsn。如果不是这样,则两个备份之间将存在空白。
这些 LSN 之间关系的意义如下:
A.last_lsn= B.first_lsn
如果 A.last_lsn= B.first_lsn,则 B 通常是紧跟在 A 后进行的日志备份。
下图说明了此关系。请注意,日志备份 B 中出现的日志记录 n,在日志备份 A 中记录为 last_lsn,在日志备份 B 中记录为 first_lsn。
A.last_lsn> B.first_lsn
如果 A.last_lsn> B.first_lsn,则存在重叠。重叠通常是由于创建仅复制日志备份或在时点恢复后备份第一个日志引起的。重叠可能会涉及不同的恢复分叉。有关详细信息,请参阅恢复路径。
日志链断开的原因
通常,SQL Server 数据库引擎会防止日志备份序列中出现空白,从而使日志链保持完整。但是,如果数据库管理员先将恢复模式更改为简单恢复模式,然后再将其更改回完整或大容量日志恢复模式,会使日志链断开。
由于日志链已断开,因此无法在涉及简单恢复模式的恢复模式切换中前滚。更改到完整或大容量日志恢复模式后,应使用新的差异基准或差异基准集。此外,也可以使用差异备份填补空白。