前言SQLServer2008中如何收缩日志文件,在邀月工作室的日志已经详细描述(点击查看),这里不再赘述。本文的重点是与大家分享日志截断、收缩后,物理文件的尺寸依然没有减小到期望尺寸的问题。 解决方案我的一个数据库,数据文件10+G ,事务日志达20+G,而且使用常规的截断、收缩方法均无法减小日志物理文件的尺寸,经过一番寻找,终于找到了解决方法。 查看日志信息在查询分析器中执行如下代码来查看日志信息: 1 DBCC LOGINFO('数据库名称') 我们看到status=0的日志,代表已经备份到磁盘的日志文件;而status=2的日志还没有备份。当我们收缩日志文件时,收缩掉的空间其实就是status=0的空间,如果日志物理文件无法减小,这里一定能看到非常多status=2的记录。接下来分析为什么会有这么多status=2的记录 查看日志截断延迟原因活跃(active)的日志无法通过收缩来截断,有各种原因会使日志截断延迟,具体表现就是事务日志的物理文件无法通过截断、收缩来减小,通过下面的代码可以看到实例上每个数据库的日志截断延迟原因: 1 USE [master] 2 SELECT [name] ,[database_id] ,[log_reuse_wait] ,[log_reuse_wait_desc] FROM [sys].[databases] 各种原因及解释如下:
针对延迟日志截断原因的部分解决方案
小技巧一般收缩日志的代码中都要求指定日志的文件名称,下面的代码则可以自动获取日志文件名称: 1 USE [数据库名称] 2 DECLARE @LogFileLogicalName sysname 3 SELECT @LogFileLogicalName=Name FROM sys.database_files WHERE Type=1 4 PRINT @LogFileLogicalName 5 DBCC SHRINKFILE (@LogFileLogicalName, 1); |