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