DBCC SHRINKFILE 1 sproc用于多个数据库

时间:2010-03-30 20:47:32

标签: sql sql-server tsql sql-server-2008

我需要在同一个sproc中为多个db执行DBCC SHRINKFILE。 我可能创建多个sprocs,因此它在给定的上下文中运行,但是我很好奇是否有其他选择?

3 个答案:

答案 0 :(得分:2)

以下是我用来执行此操作以缩小以“MPS_”开头的简单恢复的数据库上的日志的代码。这可以设置为SQL执行任务维护计划并根据需要进行调度。当前代码将日志缩小到1 GB,这对我们来说可以很好地避免磁盘碎片。

请注意,这些都是易失性数据库。除非你真的知道自己在做什么,否则永远不要对生产数据库这样做。此外,只对每个简单的恢复模型数据库执行此操作。几个系统数据库(master,一个)是简单的恢复!

use [master]

set nocount on

declare @name sysname,
    @file_id int,
    @sqlcmd varchar(max)

DECLARE db_mps_simple_logs_cur CURSOR FOR
select d.name, mf.file_id
from sys.databases d
join sys.master_files mf
    on d.database_id = mf.database_id
where d.[name] like 'MPS_%'
    and d.recovery_model = 3 --simple only
    and mf.type = 1 --0 is data, 1 is log

open db_mps_simple_logs_cur
fetch next from db_mps_simple_logs_cur into @name, @file_id

while @@fetch_status = 0 begin

    set @sqlcmd = 'use ' + QUOTENAME(@name) + '; checkpoint; dbcc shrinkfile ( ' + cast(@file_id as varchar) + ', 1024 );'
    exec ( @sqlcmd )


    fetch next from db_mps_simple_logs_cur into @name, @file_id
end

close db_mps_simple_logs_cur
deallocate db_mps_simple_logs_cur
go

这是一个很好的命令,它将显示为简单恢复模型数据库调整大小的当前事务日志,以便您可以轻松查看结果:

select 
    d.database_id,
    d.name,
    d.recovery_model_desc,
    mf.name [file_name],
    mf.size * 8 / 1024 [size_in_mb],
    d.log_reuse_wait_desc
from sys.databases d
join sys.master_files mf
    on d.database_id = mf.database_id
where d.[name] like 'MPS_%'
    and d.recovery_model = 3 --simple only
    and mf.type = 1 --0 is data, 1 is log
order by mf.size desc

答案 1 :(得分:-1)

EXEC sp_MSForEachDB 'USE ? DBCC SHRINKFILE (fileid, targetsize)'

未记录的sp_MSForEachDB是你的朋友

在Raj的评论之后编辑

EXEC sp_MSForEachDB '
    USE ?
    IF DB_NAME() IN (''DB1'', ''DB1'', ''DB1'')
       DBCC SHRINKFILE (fileid, targetsize)
     '

修改

对于downvoters,最高投票答案中的动态SQL基本上是削减sp_MSForEachDB

答案 2 :(得分:-1)

到目前为止,您的最佳方法是永远不会编写缩小数据库文件的脚本。从你可以用数据库做的百万次破坏性事情中,缩小它就在前3位。见Auto-shrink – turn it OFF!