事务日志逻辑体系结构
SQLservers事务日志按逻辑运行,就好像事务日志是一串日志记录一样。每条日志记录由一个日志序列号(LSN)标识。每条新日志记录均写入日志的逻辑结尾处,并使用一个比前面记录的LSN更高的LSN。
日志记录按创建时的串行序列存储。每条日志记录都包含其所属事务的ID。对于每个事务,与事务相关联的所有日志记录通过使用可提高事务回滚速度的向后指针挨个链接在一个链中。
数据修改的日志记录或者记录所执行的逻辑操作,或者记录已修改数据的前像和后像。前像是执行操作前的数据副本;后像是执行操作后的数据副本。
记录逻辑操作
1. 若要前滚逻辑操作,请再次执行该操作。
2. 若要回滚逻辑操作,请执行相反的逻辑操作。
记录前像和后像
1. 若要前滚操作,请应用后像。
2. 若要回滚操作,请应用前像。
许多类型的操作都记录在事务日志中。这些操作包括:
1. 每个事务的开始和结束。
2. 每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。
3. 每次分配或释放区和页。
4. 创建或删除表或索引。
回滚操作也记录在日志中。每个事务都在事务日志中保留空间,以确保存在足够的日志空间来支持由显式回滚语句或遇到错误引起的回滚。保留的空间量取决于在事务中执行的操作,但通常等于用于记录每个操作的空间量。事务完成后将释放此保留空间。
日志文件中必须存在以确保数据库范围内成功回滚的第一条日志记录到最后写入的日志记录之间的部分称为日志的活动部分,即“活动日志”。这是进行数据库完整恢复所需的日志部分。永远不能截断活动日志的任何部分。
事务日志物理体系结构
事务日志用于确保数据库的数据完整性以及用于数据恢复。
数据库中的事务日志映射在一个或多个物理文件上。从概念上讲,日志文件是一系列日志记录。从物理上讲,日志记录序列被有效地存储在实现事务日志的物理文件集中。
SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志文件。虚拟日志文件没有固定大小,且物理日志文件所包含的虚拟日志文件数不固定。数据库引擎在创建或扩展日志文件时动态选择虚拟日志文件的大小。数据库引擎尝试维护少量的虚拟文件。在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。管理员不能配置或设置虚拟日志文件的大小或数量。
只有当日志文件使用较小的 size 和 growth_increment 值定义时,虚拟日志文件才会影响系统性能。如果这些日志文件由于许多微小增量而增长到很大,则它们将具有很多虚拟日志文件。这会降低数据库启动以及日志备份和还原操作的速度。建议您为日志文件分配一个接近于最终所需大小的size 值,并且还要分配一个相对较大的 growth_increment 值。
事务日志是一种回绕的文件。例如,假设有一个数据库,它包含一个分成四个虚拟日志文件的物理日志文件。当创建数据库时,逻辑日志文件从物理日志文件的始端开始。新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。“MinLSN”是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。示例数据库中的事务日志的外观与下图所示相似。
当逻辑日志的末端到达物理日志文件的末端时,新的日志记录将回绕到物理日志文件的始端。
这个循环不断重复,只要逻辑日志的末端不到达逻辑日志的始端。如果经常截断旧的日志记录,始终为到下一个检查点前创建的所有新日志记录保留足够的空间,则日志永远不会填满。但是,如果逻辑日志的末端真的到达了逻辑日志的始端,将发生以下两种情况之一:
· 如果对日志启用了 FILEGROWTH 设置且磁盘上有可用空间,则文件就按 growth_increment 指定的数量扩展,并且新的日志记录将添加到扩展中。有关 FILEGROWTH 设置的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
· 如果未启用 FILEGROWTH 设置,或保存日志文件的磁盘的可用空间比 growth_increment中指定的数量少,则会出现 9002 错误。
如果日志包含多个物理日志文件,则逻辑日志在回绕到首个物理日志文件始端之前,将沿着所有物理日志文件移动。