SQL Server中的事务日志无疑是SQL Server中最重要的部分之一,其重要程度甚至比数据文件尤甚。因为SQL Server利用事务日志来确保数据持久性(Durability)和事务回滚(Rollback)。因此,小D觉得有必要了解一下事务日志的结构。
事务日志的物理组织构架
事务日志仅仅是记录与其对应数据库上的事务行为和对数据库修改的日志文件。在新建数据库时,伴随着数据库文件,会有一个默认以ldf为扩展名的事务日志文件。当然,一个数据库也可以配有多个日志文件,但是在逻辑上,他们可以看成一个。
SQL Server对于日志文件的管理,是将逻辑上的一个ldf文件划分成多个逻辑上的虚拟日志文件(Virtual Log Files,简称VLF)以便于管理。就好比,日志文件(ldf)是一趟火车,每一节车厢都是一个虚拟日志文件。SQL Server通过这种方式使得存储引擎管理事务日志更加有效,因为使用VLF作为收缩数据库的最小单位无疑是更加高效的。
VLF的个数和大小无法通过配置进行设定,而是由SQL Server进行管理的。当create或alter数据库时,SQL Server通过ldf文件的大小来决定VLF的大小和数量。在日志文件增长时,SQL Server也会重新规划VLF的数量。
ldf大小 | VLF数量 |
---|---|
1M~64M | 4 |
64M~1GB | 8 |
>1GB | 16 |
小D笔记
如果设置日志文件的增量过小,则会产生过多的VLF(即日志文件碎片),这样会拖累SQL Server性能。通常情况下的推荐做法是,设置日志文件的增量为100M~500M之间。
事务日志的逻辑组织构架
在针对数据库对象所做的任何修改保存到数据库之前,相应的日志会先被记录到日志文件。这个记录会被按照先后顺序记录到日志文件的逻辑末尾,并分配一个全局唯一的日志序列号(Log Sequence Number,LSN),这个序列号完全是按照顺序生成的,如果日志中两个序列号LSN2>LSN1,则说明LSN2是在LSN1之后发生的。LSN号可以看作是日志文件和其记录数据之间的纽带。
每一条日志不仅有LSN号,还有其对应事务的事务日志,许多类型的操作都记录在事务日志中。这些操作包括:
- 每个事务的开始和结束。
- 每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。
- 每次分配或释放区和页。
- 创建或删除表或索引。
小D笔记
将日志文件分为多个文件除了磁盘空间的考虑之外,完全不会像数据那样可以并行访问,所以将日志文件分为多个完全不会有性能上的提升。
网友评论