『收藏』收缩日志文件的SQL脚本

发表于:2007-07-02来源:作者:点击数: 标签:
/* 本文由微软新闻组摘录下来的。一段非常有用的脚本。*/ 前几天也碰到日志文件过大的问题, 数据库 实际大小为600M, 日志文件实际大小为33M,但日志文件占用空间为2.8G!!! 试了多种方式,SHIRNK DATABASE, TRUNCATE LOG FILE, 都没办法将文件缩

/* 本文由微软新闻组摘录下来的。一段非常有用的脚本。*/

前几天也碰到日志文件过大的问题,数据库实际大小为600M, 日志文件实际大小为33M,但日志文件占用空间为2.8G!!! 试了多种方式,SHIRNK DATABASE, TRUNCATE LOG FILE, 都没办法将文件缩小。无论如何,这应该算SQL SERVER的一个BUG吧。

后来找到下面的代码,就可以将日志文件缩小到自己想要的大小了。把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可(我已经用过多次了)-----SET NOCOUNT ONDECLARE @LogicalFileName sysname,@MaxMinutes INT,@NewSize INT

USE Marias -- 要操作的数据库名SELECT @LogicalFileName = @#Marias_log@#, -- 日志文件名@MaxMinutes = 10, -- Limit on time allowed to wrap log.@NewSize = 100 -- 你想设定的日志文件的大小(M)

-- Setup / initializeDECLARE @OriginalSize intSELECT @OriginalSize = sizeFROM sysfilesWHERE name = @LogicalFileNameSELECT @#Original Size of @# + db_name() + @# LOG is @# +CONVERT(VARCHAR(30),@OriginalSize) + @# 8K pages or @# +CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + @#MB@#FROM sysfilesWHERE name = @LogicalFileNameCREATE TABLE DummyTrans(DummyColumn char (8000) not null)

DECLARE @Counter INT,@StartTime DATETIME,@TruncLog VARCHAR(255)SELECT @StartTime = GETDATE(),@TruncLog = @#BACKUP LOG @# + db_name() + @# WITH TRUNCATE_ONLY@#

DBCC SHRINKFILE (@LogicalFileName, @NewSize)EXEC (@TruncLog)-- Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has notexpiredAND @OriginalSize = (SELECT size FROM sysfiles WHERE name =@LogicalFileName)AND (@OriginalSize * 8 /1024) > @NewSizeBEGIN -- Outer loop.SELECT @Counter = 0WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))BEGIN -- updateINSERT DummyTrans VALUES (@#Fill Log@#)DELETE DummyTransSELECT @Counter = @Counter + 1ENDEXEC (@TruncLog)ENDSELECT @#Final Size of @# + db_name() + @# LOG is @# +CONVERT(VARCHAR(30),size) + @# 8K pages or @# +CONVERT(VARCHAR(30),(size*8/1024)) + @#MB@#FROM sysfilesWHERE name = @LogicalFileNameDROP TABLE DummyTransSET NOCOUNT OFF

 

原文转自:http://www.ltesting.net