前段时间做一个WEB项目时,要求做大数据量测试,数据库服务器硬盘很小,项目组几个人没几天就把服务器硬盘撑满了, 于是上网找了一段压缩数据库的脚本,改动了一下,这样不用每天去人为清除日志了,大家知道常见的清除日志的方法(当初偶应聘现在的公司时,老板就问我怎么清除数据库日志,偶当时懵了,没搞过,胡乱说先备份再回复,备份时不备份日志就可以了,谁知这个方法也是对了,只是操作有点麻烦),先分离数据库,然后再把日志文件删除,再附加数据库就OK了。脱离主题啦,还是谈谈刚才的话题:
1、编写压缩日志脚本compresslog.sql

SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
        
@MaxMinutes INT,
        
@NewSize INT


USE     eservice_mts_test             -- 要操作的数据库名
SELECT  @LogicalFileName = 'dbname_Log',  -- 日志文件名
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
        @NewSize = 1                  -- 你想设定的日志文件的大小(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 (8000not 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, @StartTimeGETDATE()) -- 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 / 16AND (@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 


2、编写批处理文件compresslog.bat
isql -U dbuser -P dbpass -S dbservername -d dbname -i compresslog.sql -o 1.log

isql命令行指令可以参考SQL Server 帮助手册
3、在windows计划任务里面制定一个任务,应用指定为Compresslog.bat,Schedule可以安排在晚上进行,
这样每天早上过来上班日志永远都是1M.
posted on 2006-08-30 11:55  冷火  阅读(557)  评论(0编辑  收藏  举报