DBCC SHRINKFILE截断事务日志

时间:2014-05-06 11:22:51

标签: sql-server sql-server-2008 transactions sql-server-2012

我有一些不会截断事务日志的数据库。

这些数据库都处于 SIMPLE 恢复模式,我们可以每天进行一次完整备份。

我检查的第一件事是,是否有某些排序或打开的交易或某些事情阻止重新​​使用日志。

SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE log_reuse_wait <> 0

给了我以下结果:

two databases waiting for LOG BACKUP reuse

为了摆脱LOG_BACKUP,我做了:

USE [master]
GO
ALTER DATABASE mydb SET RECOVERY BULK_LOGGED WITH NO_WAIT

然后回到SIMPLE:

USE [master]
GO
ALTER DATABASE mydb SET RECOVERY SIMPLE WITH NO_WAIT

对LOG_BACKUP进行了排序,但我仍然没有磁盘空间问题。

所以我拼命运行以下命令:

DBCC SHRINKFILE (N'wslogdb70_27_log', 0, TRUNCATEONLY)

我希望TRUNCATED事务日志,而不是SHRINKING它。

  • 我说错了吗?
  • 是否有任何文章/书籍引用了这个?

2 个答案:

答案 0 :(得分:4)

首先,如果数据库处于LOG_BACKUP恢复状态,则不能将SIMPLE作为log_reuse_wait,因为除非恢复模式为FULL,否则甚至无法进行日志备份或BULK_LOGGED

此外,根据docs

  

TRUNCATEONLY选项不会在日志中移动信息,但会从日志文件的末尾删除不活动的VLF。

要缩小日志文件,请使用

DBCC SHRINKFILE (wslogdb70_27_log, X)

其中X是以MB为单位的目标大小。

注意不要过度缩小日志,文件中需要一些空闲空间才能工作,否则它会再次自动增长。

关于自动增长,请尝试以MB为单位指定自动增长因子,而不是百分比。多少完全取决于您未提及的一些因素(例如,日志和数据文件的大小)。

实际上,监控您的数据库并进行相应调整是最好的选择。

答案 1 :(得分:3)

DBCC SHRINKFILE (N'wslogdb70_27_log', 0, TRUNCATEONLY)

似乎SQL Server 2008 R2的使用效果很好