事务日志物理体系结构
SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志文件。虚拟日志文件没有固定大小,且物理日志文件所包含的虚拟日志文件数不固定。数据库引擎在创建或扩展日志文件时动态选择虚拟日志文件的大小。数据库引擎尝试维护少量的虚拟文件。在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。管理员不能配置或设置虚拟日志文件的大小或数量。
事务日志是一种回绕的文件。例如,假设有一个数据库,它包含一个分成四个虚拟日志文件的物理日志文件。当创建数据库时,逻辑日志文件从物理日志文件的始端开始。新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。“MinLSN”是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。示例数据库中的事务日志的外观与下图所示相似。
当逻辑日志的末端到达物理日志文件的末端时,新的日志记录将回绕到物理日志文件的始端。
这个循环不断重复,只要逻辑日志的末端不到达逻辑日志的始端。如果经常截断旧的日志记录,始终为到下一个检查点前创建的所有新日志记录保留足够的空间,则日志永远不会填满。但是,如果逻辑日志的末端真的到达了逻辑日志的始端,将发生以下两种情况之一:
-
如果对日志启用了 FILEGROWTH 设置且磁盘上有可用空间,则文件就按 growth_increment 指定的数量扩展,并且新的日志记录将添加到扩展中。
-
如果未启用 FILEGROWTH 设置,或保存日志文件的磁盘的可用空间比 growth_increment 中指定的数量少,则会出现 9002 错误。
如果日志包含多个物理日志文件,则逻辑日志在回绕到首个物理日志文件始端之前,将沿着所有物理日志文件移动。
收缩数据库日志文件的最小单位为虚拟日志文件
SQL Server创建数据库时,根据日志文件(ldf)的大小,生成VLF(virtual log files)的数量公式如下:
ldf文件的大小 |
VLF的数量 |
1M到64M |
4 |
64M到1GB |
8 |
大于1GB |
16 |
查看某个db虚拟日志文件的数量