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

None.gifSET NOCOUNT ON
None.gif
DECLARE @LogicalFileName sysname,
None.gif        
@MaxMinutes INT,
None.gif        
@NewSize INT
None.gif
None.gif
None.gif
USE     eservice_mts_test             -- 要操作的数据库名
None.gif
SELECT  @LogicalFileName = 'dbname_Log',  -- 日志文件名
None.gif
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
None.gif
        @NewSize = 1                  -- 你想设定的日志文件的大小(M)
None.gif

None.gif
-- Setup / initialize
None.gif
DECLARE @OriginalSize int
None.gif
SELECT @OriginalSize = size 
None.gif  
FROM sysfiles
None.gif  
WHERE name = @LogicalFileName
None.gif
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
None.gif        
CONVERT(VARCHAR(30),@OriginalSize+ ' 8K pages or ' + 
None.gif        
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
None.gif  
FROM sysfiles
None.gif  
WHERE name = @LogicalFileName
None.gif
CREATE TABLE DummyTrans
None.gif  (DummyColumn 
char (8000not null)
None.gif
None.gif
None.gif
DECLARE @Counter   INT,
None.gif        
@StartTime DATETIME,
None.gif        
@TruncLog  VARCHAR(255)
None.gif
SELECT  @StartTime = GETDATE(),
None.gif        
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
None.gif
None.gif
DBCC SHRINKFILE (@LogicalFileName@NewSize)
None.gif
EXEC (@TruncLog)
None.gif
-- Wrap the log if necessary.
None.gif
WHILE     @MaxMinutes > DATEDIFF (mi, @StartTimeGETDATE()) -- time has not expired
None.gif
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
None.gif      
AND (@OriginalSize * 8 /1024> @NewSize  
None.gif  
BEGIN -- Outer loop.
None.gif
    SELECT @Counter = 0
None.gif    
WHILE  ((@Counter < @OriginalSize / 16AND (@Counter < 50000))
None.gif      
BEGIN -- update
None.gif
        INSERT DummyTrans VALUES ('Fill Log')  
None.gif        
DELETE DummyTrans
None.gif        
SELECT @Counter = @Counter + 1
None.gif      
END   
None.gif    
EXEC (@TruncLog)  
None.gif  
END   
None.gif
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
None.gif        
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
None.gif        
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
None.gif  
FROM sysfiles 
None.gif  
WHERE name = @LogicalFileName
None.gif
DROP TABLE DummyTrans
None.gif
SET NOCOUNT OFF 
None.gif
None.gif

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

isql命令行指令可以参考SQL Server 帮助手册
3、在windows计划任务里面制定一个任务,应用指定为Compresslog.bat,Schedule可以安排在晚上进行,
这样每天早上过来上班日志永远都是1M.

转载于:https://www.cnblogs.com/xiongeee/archive/2006/08/30/490272.html

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐