免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3571 | 回复: 4
打印 上一主题 下一主题

请教ldf文件收缩的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-01 09:02 |只看该作者 |倒序浏览
由于近期的数据库数据操作频繁,并且备份日志的磁盘不断增大,导致空间不足,日志备份失败.

这两天发现事务日志文件狂增到10多g,首先在查询分析器中进行

backup log dbname with truncate_only折断了事务日志,由10多g变为了

200多M,但是ldf文件占用的空间还是10多g;

利用收缩文件的功能进行收缩ldf文件,收缩成功,但发现操作系统中

的ldf文件还是占用了10多g的空间;

想过分离数据库重建日志文件,但是库是实时生产系统,不能随便停

请问各位怎么操作才能令ldf文件占用的物理空间变小???

论坛徽章:
0
2 [报告]
发表于 2005-12-01 11:29 |只看该作者
分离数据库,再把LDF删了。。再附加一下就好了。

论坛徽章:
0
3 [报告]
发表于 2005-12-01 12:33 |只看该作者
分离是可以,不过实时的生产系统,一般都不轻易停啊...看有没有什么办法可以不停库弄好的

我在其他的一样的2000server+sql server2000的系统中,backup log之后然后收缩ldf文件

相应的操作系统上的ldf文件占用空间马上变小了,就是这个系统不行,个人怀疑是库出了问题

或者操作系统非得重启不可啊...

论坛徽章:
0
4 [报告]
发表于 2005-12-01 12:40 |只看该作者
给你段代码试试,我用过(但没有详细了解过),可以减小LDF文件,建议你可以试试。
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
        @MaxMinutes INT,
        @NewSize INT


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

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- 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

论坛徽章:
0
5 [报告]
发表于 2005-12-01 17:34 |只看该作者
谢谢啊...先了解一下...不敢茫然用啊..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP