sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件
可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候,自动增长就会生成新的文件,这些文件叫做VLF(虚拟日志文件),所以说在这个层面上来说,我们可以简单的把数据库日志理解为一列火车,一节一节的车厢理解为数据库的虚拟日志文件,当然如果不够存的下事务日志的时候,就要扩充,就是加一个火车厢.
所以说数据库事务日志其实是由很多个独立的虚拟事务日志文件组成的,我们看一下,大概就知道数据库的虚拟日志文件有自己的状态,也有自己的LSN标识.那在数据库的层面是怎么管理这些数据库日志文件呢.
看一下LSN的作用
1:就是LSN用来标识VLF的序列号
2:LSN标识日志在VLF文件中的具体位置
我们分析一下数据库日志的逻辑管理
我们简单的理解数据库日志是有两种状态的,活动日志和非活动日志(虽然日志有四种状态,但是我们理解这两种状态应该就足够了),活动日志的头部和尾部的标记就是头日志和尾日志,中间部分就是数据库活动日志,其实这个图还是不太直观的,因为数据库日志管理的话,更像一个圆形的管理,是可以达到连续管理的,当数据库头日志到达数据的尾部时候,如果第一个日志文件是可用的,事务日志则不会自动增长,而是去占用第一个数据库的VLF,这一点是很重要的,我们可以看一下,数据库的头日志是不断的往前走而尾日志什么时候才能改变位置呢.
如果想要改变尾日志的位置,只有活动日志减少,活动日志减少就意味着数据库日志的截断,所以说,每次发生数据库事务日志截断的时候尾日志才会向后推移.
数据库日志文件有一个状态,status,大家细心观察一下就会发现,其实有0,2两种状态,0就是代表空闲,2代表使用.
千万不要小看这个状态,对于收缩数据库日志文件来说,这个状态是很重要的
日志文件能被收缩的原因是该文件尾部的数据被清除了,使得该部分空间被释放,而不是逃过尾部去删除文件首部或者中间部分的内容。
sqlserver数据库的收缩是从最后一个数据库日志文件开始进行压缩的,所以说只有当最后一个VLF的状态为0的时候,DBCC SHRINKFILE才能发挥作用,否则收缩数据库日志文件是不会有效果的.