您的位置:首页 > 数据库

数据日志文件收缩

2007-04-09 09:27 274 查看
前几天也碰到日志文件过大的问题,数据库实际大小为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  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息