Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87454
  • 博文数量: 7
  • 博客积分: 2545
  • 博客等级: 少校
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-10 11:29
文章分类

全部博文(7)

文章存档

2009年(1)

2008年(6)

我的朋友

分类: 数据库开发技术

2008-09-16 15:04:35

   某日发现磁盘空间很小了,经过检查发现是因为sqlserver的日志文件过大造成的。我是数据文件有600M,可日志文件大小到了3.7G,郁闷啊。用收缩数据库功能也没法改小,今天上网找到了一段代码,运行后发现很有作用,可惜自己sqlserver水平有限,知其然不知其所以然,先贴在上来,有机会再研究吧。                                                                                                 

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

USE DBNAME -- 要操作的数据库名
SELECT @LogicalFileName = 'DBNAME_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'

EXEC (@TruncLog)--把log中能够shrink的transaction的log标记为可以清除
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
--shrink文件

-- 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

阅读(969) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~