快速业务通道

SQL使用--Shrink所有数据库的Log

作者 佚名技术 来源 数据库编程 浏览 发布时间 2012-03-21
数据处理是当前数据库常见的应用。一些数据库组成DATA mart从数据源里抽取关心的表进行聚合,将结果推送到算法中进行处理,从而高性能的回答用户的查询。

总所周知,Log文件是记录数据库操作的文件,对数据库的完整性,一致性有着重要的意义。作为数据处理的一个常见后果是Log文件的超级庞大。虽然将数据库的恢复模式设置成Simple可以提醒数据库尽量使用已有的Log空间,而不是申请新的,后者将会导致文件的增长。但是对于活动的事务,如果一个事务中记录的Log 行数很多,必然会导致Log文件的庞大。有时这种事务是不能避免的,因为至少一个SQL语句就是一个天然的事务。加入你的Update语句涉及到3千万行数据,结果必然导致众多的Log行被写入,当Update结束的时候,log文件就会增加到200G。

问题是当事务结束后,log文件并不会因为事务已经提交而自动缩短。后果就是10几个数据库的log 文件都处在自己的最大值上,也许这需要几个T的空间,但事实上,同一时刻只有一个数据库在活动,也就是说500G就够了。

下面的这个SQL可以自动缩短数据库服务器上所有的Log文件。

declare @ssql nvarchar(4000)
set @ssql= ''
        if ''''?'''' not in (''''tempdb'''',''''master'''',''''model'''',''''msdb'''') begin
        use [?]
        declare @tsql nvarchar(4000) set @tsql = ''''''''
        declare @iLogFile int
        declare LogFiles cursor for

        --找出所有的Log文件,Log文件的status是0x40
        select fileid from sysfiles where  status & 0x40 = 0x40
        open LogFiles
        fetch next from LogFiles into @iLogFile
        while @@fetch_status = 0
        begin

          --使用DBCC名字缩短Log文件
          set @tsql = @tsql + ''''DBCC SHRINKFILE(''''+cast(@iLogFile as varchar(5))+'''', 1) ''''
          fetch next from LogFiles into @iLogFile
        end

        --DBCC shrink只能释放标记为无效的Log区段,使用backup log可以完成这个标记
        set @tsql = @tsql + '''' BACKUP LOG [?] WITH TRUNCATE_ONLY '''' + @tsql
        --PRint @tsql
        exec(@tsql)
        close LogFiles
        DEALLOCATE LogFiles
        end''
--依次遍历所有的数据库,用数据库名字替换@ssql中的?,并执行语句
exec sp_msforeachdb @ssql 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号