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

王朝学院·作者佚名  2009-11-13
窄屏简体版  字體: |||超大  

数据处理是当前数据库常见的应用。一些数据库组成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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航