日志文件的截断与收缩
一.虚拟日志文件
数据库的日志文件被分成多个虚拟日志文件(VLF)。一个VLF可以是下面4种状态之一:
1.活动 日志的活动部分以MinLSN为起点,代表一个活动(未提交)事务。日志的活动部分以最后写入的LSN为终点。任何包含有活动日志任意部分的VLF都被认为是活动的VLF。
2.可恢复 最老的事务之前的日志部分的唯一作用是保持一系列的日志备份,以便能够还原数据库到先前某一状态。
3.可复用 如果事务日志备份没有得到保持(见下面的日志的自动截断),或者我们已经备份了日志(见下面的日志备份),那么最老活动事务之前的VLF将不再有任何作用并且可以被重新使用。截断或者备份事务日志会改变VLF可恢复状态到可复用状态。
4.未用 如果没有足够的会被日志记载的活动发生,或者之前的VLF已经被标记为可复用并且已经被复用,那么日志文件结尾的一个或多个VLF也许还未被使用。
使用dbcc loginfo命令查看VLF时,状态值为0表示可复用或未用;状态值为2表示活动或可恢复。日志截断后不包含任何活动日志记录的VLF,其状态值从2变成0。
二.日志的自动截断
在下面这些情况下,日志会自动截断:
1.系统日志恢复模型为简单
2.创建数据库以来从未进行过完全备份。
3.曾经使用BACKUP LOG WITH NO_LOG / TRUNCATE_ONLY
当发生检查点时,会将MinLSN(最小恢复LSN)之前的所有日志记录截断。所谓MinLSN是指下面三者中的最小值:
1.最后一个检查点的LSN
2.最老的一个事务的LSN。
3.尚未传递给分发数据库的最早的复制事务起点的 LSN。
检查点可以是自动执行命令CHECKPOINT。也可以是系统扫面,当系统发现日志比较大,以至于下次启动时重做时间需要超过恢复间隔(recovery interval)就会自动执行检查点动作。
三.日志备份
如果进行过完全备份,并且恢复模型为完全恢复或者大日志恢复,则必须进行日志备份才会截断日志。
备份日志时,首先生成一个检查点,然后将所有日志备份,最后将MinLSN之前的所有日志截断。只有日志备份会截断日志,数据备份不会截断日志的。
四.日志疯长
在实际操作中,常常有一些数据库的日志文件会疯长,疯长的原因有多种,但是下面两种是最常见的。
1.事务不提交。我们知道日志MinLSN是检查点和最老事务的最小者。若一个事务一致不提交(可以通过命令dbcc opentran查看),那么MinLSN就一直是这个事务,因此它之后的日志总是截断不了,于是随着时间的推移,日志文件会原来越大。
2.没有定期备份日志。在非简单模式下,必须维护好备份计划,定期备份日志记录。因为这种情况下,只有备份日志才会截断日志。
五.收缩
在保证一个基础大小的前提下,将不活动的VLF删除。
本文转自 http://blog.csdn.net/misterliwei/article/details/5881393