Sql Server 事务日志
Sql Server事务日志文件是数据库文件的重要组成部分,事务日志主要用来存放数据库的修改记录。数据库为了得到更高的写入效率和性能,同时保证ACID特性,数据在写入时,会将更新先写入事务日志,因为事务日志是连写的,所以写事务会比较快。简单来说,顺序写入时,磁盘的磁头会保持在一定的区域内连续写入,而数据写入数据文件时,有随机性,磁盘的磁头移动消耗的时间要比数据写入日志文件时多。
Sql Server对于事务日志文件的管理,是将日志文件在逻辑上分成若干个文件(VLFS),方便管理。
创建一个1M的日志文件
执行DBCC Loginfo
在此可以看到事务日志被分成了4个虚拟的日志文件,那么SQL Server创建数据库时,日志文件的大小和所分配的VLFS数量有什么关系呢?如果日志文件增加,VLFS是如何变化的呢 ?
VLFS个数由SQL Server管理,当Create或Alter Ldf文件时,SQL Server根据初始值或者增量的大小分配VLFS文件数。LDF文件每次增加的数值和每次分配的VLFS个数如下
ldf文件的大小 |
VLF的数量 |
1M到64M |
4 |
64M到1GB |
8 |
大于1GB |
16 |
对数据库的所有修改在写入数据文件之前,会先记录到事务日志中。日志记录会按照先后顺序记录到日志文件的逻辑末尾,并分配一个全局唯一的日志序列号(Log Sequence Number),这个序列号按照顺序分配。
在日志中,有活动日志的概念,可以理解为未写入数据文件的事务日志。
当数据库做CheckPoint,已提交的日志数据会刷新到数据文件中,则活动日志区间会前移,一直到未提交的日志序列号。
在简单日志模式下,CheckPoint之后,非活动日志的内容将会被清空,清空之后的日志空间可以被冲用。这也是简单日志模式下日志文件总是很小的原因。
在完整或批量日志模式下,只有备份日志后,日志空间才能被重用。
许多类型的操作都会被记录在事务日志中,这些操作包括:
每个事务的开始和结束
每次数据修改
每次分配或释放区或者页
创建删除表或者索引