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

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

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

2、编写批处理文件compresslog.bat
自动压缩MS SQL数据库日志isql -U dbuser -P dbpass -S dbservername -d dbname -i compresslog.sql -o 1.log

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

相关文章:

  • 2022-12-23
  • 2021-10-12
  • 2022-01-03
  • 2022-01-19
  • 2022-12-23
  • 2021-08-13
  • 2022-03-09
猜你喜欢
  • 2021-07-15
  • 2022-12-23
  • 2021-10-13
  • 2021-10-11
  • 2021-10-31
相关资源
相似解决方案