也谈如何缩小SQL SERVER日志文件. (附代码)    --------------------------------------------------------------------------------
 几回魂梦 于 8/24/2001 4:03:18 AM 加贴在 数据库探讨 ←返回版面:   
前几天也碰到日志文件过大的问题,数据库实际大小为600M, 日志文件实际大小为33M, 但日志文件占用空间为2.8G!!!
试了多种方式,SHIRNK DATABASE, TRUNCATE LOG FILE, 都没办法将文件缩小。无论如何,这应该算SQL SERVER的一个BUG吧。后来找到下面的代码,就可以将日志文件缩小到自己想要的大小了。把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可(我已经用过多次了)
-----
SET NOCOUNT ON
DECLARE @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 / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
  FROM sysfiles
  WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  FROM sysfiles
  WHERE name = @LogicalFileName
CREATE 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 not expired
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
      AND (@OriginalSize * 8 /1024) > @NewSize  
  BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
      BEGIN -- update
        INSERT DummyTrans VALUES ('Fill Log')  
        DELETE DummyTrans
        SELECT @Counter = @Counter + 1
      END   
    EXEC (@TruncLog)  
  END   
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  FROM sysfiles 
  WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

解决方案 »

  1.   


      
    1、dbcc checkTable(syslogs)
    go
    2、DUMP TRANSACTION dbname WITH NO_LOG 
    go
    3 dbcc SHRINKDB(dbname) 
    go
    目的,查出可以紧缩的大小
    4 dbcc SHRINKDB(dbname,new_size) 
    go
    紧缩整个库,使用第3步得出的大小
    5 再用ALTER DATABASE 增加数据库的数据和日志6、一切OK后,还是要想从根本上防止这个问题的方法,制定可行的备份计划! 以上1-6步贴过好多次了!呵呵,日记文件?幸亏不能删除主数据文件或者主日记文件,否则麻烦了,呵呵。
     
      

  2.   

    1.
    exec sp_detach_db yourDBName,true;2.
    刪掉日誌文件3.
    exec sp_attach_single_file_db yourDBName,'mdf文件所在路徑'
    -- MSSQL會自動給你分配一個500K大小的log文件