您的位置:首页 > 数据库

教你如何缩小SQLServer数据库日志文件

2008-05-01 01:43 357 查看
.Uic978{display:none;}问题:数据库实际大小为600MB,日志文件实际大小为33MB,但日志文件占用空间为2.8GB!试了多种方式,SHIRNKDATABASE,TRUNCATELOGFILE,都没办法将文件缩小。无论如何,这应该算SQLServer的一个BUG吧。
解决方法:
后来找到下面的代码,就可以将日志文件缩小到自己想要的大小了。把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可。

-----
SETNOCOUNTON
DECLARE@LogicalFileNamesysname,
@MaxMinutesINT,
@NewSizeINT

USE Marias
--要操作的数据库名
SELECT @LogicalFileName='Marias_log'
--日志文件名
@MaxMinutes=10,
--Limitontimeallowedtowraplog.
@NewSize=100
--你想设定的日志文件的大小(M)
--Setup/initialize
DECLARE@OriginalSizeint
SELECT@OriginalSize=size
FROMsysfiles
WHEREname=@LogicalFileName
SELECT'OriginalSizeof'+db_name()+'LOGis'+
CONVERT(VARCHAR(30),@OriginalSize)+'8Kpagesor'+
CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+'MB'
FROMsysfiles
WHEREname=@LogicalFileName
CREATETABLEDummyTrans
(DummyColumnchar(8000)notnull)

DECLARE@Counter INT,
@StartTimeDATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime=GETDATE(),
@TruncLog='BACKUPLOG'
+db_name()+'WITHTRUNCATE_ONLY'
DBCCSHRINKFILE(@LogicalFileName,@NewSize)
EXEC(@TruncLog)
--Wrapthelogifnecessary.
WHILE @MaxMinutes>DATEDIFF
(mi,@StartTime,GETDATE())--timehasnotexpired
AND@OriginalSize=(SELECTsize
FROMsysfilesWHEREname=@LogicalFileName)
AND(@OriginalSize*8/1024)>@NewSize
BEGIN--Outerloop.
SELECT@Counter=0
WHILE ((@Counter<@OriginalSize/16)
AND(@Counter<50000))
BEGIN--update
INSERTDummyTransVALUES('FillLog')
DELETEDummyTrans
SELECT@Counter=@Counter+1
END
EXEC(@TruncLog)
END
SELECT'FinalSizeof'+db_name()+'LOGis'+
CONVERT(VARCHAR(30),size)+'8Kpagesor'+
CONVERT(VARCHAR(30),(size*8/1024))+'MB'
FROMsysfiles
WHEREname=@LogicalFileName
DROPTABLEDummyTrans
SETNOCOUNTOFF
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: