事务日志物理体系结构
数据库事务日志映射在一个或多个物理文件上。 从概念上讲,日志文件是一系列日志记录。 从物理上讲,日志记录序列被有效地存储在实现事务日志的物理文件集中。 每个数据库必须至少有一个日志文件。
虚拟日志文件 (VLF)
SQL Server 数据库引擎在内部将每个物理日志文件分成多个虚拟日志文件 (VLF)。 虚拟日志文件没有固定大小,且物理日志文件所包含的虚拟日志文件数不固定。 数据库引擎在创建或扩展日志文件时动态选择虚拟日志文件的大小。 数据库引擎会尝试维护一些虚拟文件。 在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。 管理员不能配置或设置虚拟日志文件的大小或数量。
创建虚拟日志文件
虚拟日志文件 (VLF) 的创建遵循此方法:
- 在 SQL Server 2014 (12.x) 及更高版本中,如果下一次增长少于当前日志物理大小的 1/8,则创建 1 个 VLF,补偿此增长大小。
- 如果下一次增长超过当前日志大小的 1/8,则使用 pre-2014 方法,即:
- 如果增长少于 64 MB,则创建 4 个 VLF,补偿此增长大小(例如,增长 1 MB,创建 4 个 256 KB 的 VLF)。
- 在 Azure SQL 数据库中,从 SQL Server 2022 (16.x)(所有版本)开始,逻辑略有不同。 如果增长小于或等于 64 MB,则数据库引擎只创建一个 VLF 来补偿此增长大小。
- 如果增长来自 64 MB(最多 1 GB),则创建 8 个 VLF,补偿此增长大小(例如,增长 512 MB,创建 8 个 64 MB 的 VLF)。
- 如果增长大于 1 GB,则创建 16 个 VLF,补偿此增长大小(例如,增长 8 GB,创建 16 个 512 MB 的 VLF)。
- 如果增长少于 64 MB,则创建 4 个 VLF,补偿此增长大小(例如,增长 1 MB,创建 4 个 256 KB 的 VLF)。
如果这些日志文件由于许多微小增量而增长到很大,则它们将具有很多虚拟日志文件。 这会降低数据库启动、日志备份和还原操作的速度,并导致事务副本 (replica)tion/CDC 和 Always On 重做延迟。 相反,如果日志文件设置得较大,但只有少量或仅一个增量,则它们将只包含几个非常大的虚拟日志文件。 有关如何正确估计事务日志的所需大小和自动增长设置的详细信息,请参阅管理事务日志文件的大小的“建议”部分。
参考:
SQL Server 事务日志体系结构和管理指南 - SQL Server | Microsoft Learn