事务日志物理体系结构
事务日志用于确保数据库的数据完整性以及用于数据恢复。本部分中的主题提供了有关事务日志的物理体系结构的信息。了解物理体系结构可以提高您在管理事务日志时的效率。
数据库中的事务日志映射在一个或多个物理文件上。从概念上讲,日志文件是一系列日志记录。从物理上讲,日志记录序列被有效地存储在实现事务日志的物理文件集中。
SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志文件。虚拟日志文件没有固定大小,且物理日志文件所包含的虚拟日志文件数不固定。数据库引擎在创建或扩展日志文件时动态选择虚拟日志文件的大小。数据库引擎尝试维护少量的虚拟文件。在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。管理员不能配置或设置虚拟日志文件的大小或数量。
只有当日志文件使用较小的 size 和 growth_increment 值定义时,虚拟日志文件才会影响系统性能。如果这些日志文件由于许多微小增量而增长到很大,则它们将具有很多虚拟日志文件。这会降低数据库启动以及日志备份和还原操作的速度。建议您为日志文件分配一个接近于最终所需大小的 size 值,并且还要分配一个相对较大的 growth_increment 值。
事务日志是一种回绕的文件。例如,假设有一个数据库,它包含一个分成四个虚拟日志文件的物理日志文件。当创建数据库时,逻辑日志文件从物理日志文件的始端开始。新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。“MinLSN”是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。示例数据库中的事务日志的外观与下图所示相似。
当逻辑日志的末端到达物理日志文件的末端时,新的日志记录将回绕到物理日志文件的始端。
这个循环不断重复,只要逻辑日志的末端不到达逻辑日志的始端。如果经常截断旧的日志记录,始终为到下一个检查点前创建的所有新日志记录保留足够的空间,则日志永远不会填满。但是,如果逻辑日志的末端真的到达了逻辑日志的始端,将发生以下两种情况之一:
如果对日志启用了 FILEGROWTH 设置且磁盘上有可用空间,则文件就按 growth_increment 指定的数量扩展,并且新的日志记录将添加到扩展中。有关 FILEGROWTH 设置的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
如果未启用 FILEGROWTH 设置,或保存日志文件的磁盘的可用空间比 growth_increment 中指定的数量少,则会出现 9002 错误。
如果日志包含多个物理日志文件,则逻辑日志在回绕到首个物理日志文件始端之前,将沿着所有物理日志文件移动。