收缩sql server数据库日志文件的存储过程,有时需要执行两次才能完成

 sysname,
        @MaxMinutes INT,
        
@NewSize INT


USE     DBName           -- 要操作的数据库名
SELECT  @LogicalFileName = 'DBName_log',  -- 日志文件名
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
        @NewSize = 10                 -- 你想设定的日志文件的大小(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

相关文章:

  • 2021-10-24
  • 2020-10-14
  • 2021-08-14
  • 2022-12-23
  • 2021-07-26
  • 2021-07-13
  • 2021-10-06
猜你喜欢
  • 2021-08-04
  • 2021-06-30
  • 2022-12-23
  • 2022-12-23
  • 2021-09-29
相关资源
相似解决方案