问题描述
发现有的数据库日志文件太大,无论如何收缩执行几次SQL语句都不行。事务日志达30+G,而且使用常规的截断、收缩方法均无法减小日志物理文件的尺寸,经过一番寻找,终于找到了解决方法。
查看日志信息
在查询分析器中执行如下代码来查看日志信息: DBCC LOGINFO('数据库名称')
我们看到status=0的日志,代表已经备份到磁盘的日志文件;而status=2的日志还没有备份。当我们收缩日志文件时,收缩掉的空间其实就是status=0的空间,如果日志物理文件无法减小,这里一定能看到非常多status=2的记录。接下来分析为什么会有这么多status=2的记录
查看日志截断延迟原因
活跃(active)的日志无法通过收缩来截断,有各种原因会使日志截断延迟,具体表现就是事务日志的物理文件无法通过截断、收缩来减小,通过下面的代码可以看到实例上每个数据库的日志截断延迟原因:
USE master
go
SELECT name, database_id, log_reuse_wait, log_reuse_wait_desc, is_published
FROM sys.databases
go
参考官方解释,可能延迟日志截断的因素:https://msdn.microsoft.com/zh-cn/library/ms345414.aspx
针对延迟日志截断原因的部分解决方案
LOG_BACKUP
备份日志后再执行收缩即可backup log [database] with nolog
REPLICATION
这种情况我遇到过两次,但我根本没有启用过REPLICATION,据查,这好像是SQLSERVER2008的一个BUG,解决方法是给标有“REPLICATION”的数据库任意一个表创建数据库事务复制(TRANSACTION REPLICATION),然后再删除,执行数据库与日志备份后,就可以收缩了。
附,sqlserver收缩日志:
http://www.cnblogs.com/zhaoguan_wang/p/4949176.html