事务日志逻辑体系结构

SQL Server 事务日志按逻辑运行,就好像事务日志是一串日志记录一样。每条日志记录由一个日志序列号 (LSN) 标识。每条新日志记录均写入日志的逻辑结尾处,并使用一个比前面记录的 LSN 更高的 LSN。

日志记录按创建时的串行序列存储。每条日志记录都包含其所属事务的 ID。对于每个事务,与事务相关联的所有日志记录通过使用可提高事务回滚速度的向后指针挨个链接在一个链中。

数据修改的日志记录或者记录所执行的逻辑操作,或者记录已修改数据的前像和后像。前像是执行操作前的数据副本;后像是执行操作后的数据副本。

操作的恢复步骤取决于日志记录的类型:

  • 记录逻辑操作

    • 若要前滚逻辑操作,请再次执行该操作。

    • 若要回滚逻辑操作,请执行相反的逻辑操作。

  • 记录前像和后像

    • 若要前滚操作,请应用后像。

    • 若要回滚操作,请应用前像。

许多类型的操作都记录在事务日志中。这些操作包括:

  • 每个事务的开始和结束。

  • 每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。

  • 每次分配或释放区和页。

  • 创建或删除表或索引。

回滚操作也记录在日志中。每个事务都在事务日志中保留空间,以确保存在足够的日志空间来支持由显式回滚语句或遇到错误引起的回滚。保留的空间量取决于在事务中执行的操作,但通常等于用于记录每个操作的空间量。事务完成后将释放此保留空间。

日志文件中从必须存在以确保数据库范围内成功回滚的第一条日志记录到最后写入的日志记录之间的部分称为日志的活动部分,即“活动日志”。这是进行数据库完整恢复所需的日志部分。永远不能截断活动日志的任何部分。