我有一些不会截断事务日志的数据库。
这些数据库都处于 SIMPLE 恢复模式,我们可以每天进行一次完整备份。
我检查的第一件事是,是否有某些排序或打开的交易或某些事情阻止重新使用日志。
SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE log_reuse_wait <> 0
给了我以下结果:
为了摆脱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它。
答案 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的使用效果很好