buhao 发表于 2016-11-1 09:57:16

如何缩小SQL SERVER日志文件

如何缩小SQL SERVER日志文件
文章来源:岚山夜话
HTTP://WWW.33D9.COM
前几天也碰到日志文件过大的问题,数据库实际大小为600M,日志文件实际大小为33M,但日志文件占用空间为2.8G!!!
试了多种方式,SHIRNKDATABASE,TRUNCATELOGFILE,都没办法将文件缩小。无论如何,这应该算SQLSERVER的一个BUG吧。  
  后来找到下面的代码,就可以将日志文件缩小到自己想要的大小了。把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可(我已经用过多次了)
-----
SETNOCOUNTON
DECLARE@LogicalFileNamesysname,
@MaxMinutesINT,
@NewSizeINT
  
USEMarias--要操作的数据库名
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@CounterINT,
@StartTimeDATETIME,
@TruncLogVARCHAR(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=(SELECTsizeFROMsysfilesWHEREname=@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
  

页: [1]
查看完整版本: 如何缩小SQL SERVER日志文件