事务日志逻辑体系结构
SQL Server 事务日志按逻辑运行,就好像事务日志是一串日志记录一样。 每条日志记录由一个日志序列号 (LSN) 标识。 每条新日志记录均写入日志的逻辑结尾处,并使用一个比前面记录的 LSN 更高的 LSN。 日志记录按创建的串行序列存储:如果 LSN2 大于 LSN1,则 LSN2 所标识的日志记录描述的更改发生在日志记录 LSN1 描述的更改之后。 每条日志记录都包含其所属事务的 ID。 对于每个事务,与事务相关联的所有日志记录通过使用可提高事务回滚速度的向后指针挨个链接在一个链中。
LSN 的基本结构是 [VLF ID:Log Block ID:Log Record ID]。 有关详细信息,请参阅 VLF 和日志块部分。
下面是 LSN 的示例:00000031:00000da0:0001,其中 0x31 是 VLF 的 ID,0xda0 是日志块 ID,0x1 是该日志块中的第一条日志记录。 有关 LSN 的示例,请查看 sys.dm_db_log_info DMV 的输出并检查 vlf_create_lsn 列。
数据修改的日志记录会记录所执行的逻辑操作,或者记录已修改数据的前像和后像。 前像是执行操作前的数据副本;后像是执行操作后的数据副本。
操作的恢复步骤取决于日志记录的类型:
记录逻辑操作
- 要前滚逻辑操作,请再次执行该操作。
- 要回滚逻辑操作,请执行相反的逻辑操作。
记录前像和后像
- 要前滚操作,请应用后像。
- 要回滚操作,请应用前像。
许多类型的操作都记录在事务日志中。 这些操作包括:
每个事务的开始和结束。
每次数据修改(插入、更新或删除)。 修改包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。
每次分配或释放区和页。
创建或删除表或索引。
回滚操作也记录在日志中。 每个事务都在事务日志中保留空间,以确保存在足够的日志空间来支持由显式回滚语句或遇到错误引起的回滚。 保留的空间量取决于在事务中执行的操作,但通常等于用于记录每个操作的空间量。 事务完成后将释放此保留空间。
日志文件中从必须存在以确保数据库范围内成功回滚的第一条日志记录到最后写入的日志记录之间的部分称为日志的活动部分,即“活动日志”或“日志尾部”。 这是进行数据库完整恢复所需的日志部分。 永远不能截断活动日志的任何部分。 这个第一个日志记录的日志序列号 (LSN),称为最小恢复 LSN (MinLSN)。 有关事务日志支持的操作的详细信息,请参阅事务日志 (SQL Server)。
差异和日志备份将还原的数据库推到稍后的时间,该时间与一个更高的 LSN 相对应。




