[英]DBCC SHRINKFILE 1 sproc for multiple databases
我需要在同一存儲過程中為多個數據庫執行DBCC SHRINKFILE。 我可以創建多個sproc,以便它在給定的上下文中運行,但是我很好奇是否有替代方案?
這是我用來執行此操作的代碼,以縮小以“ 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
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)
'
編輯
向下注者注意,投票率最高的答案中的動態SQL本質上是減少了sp_MSForEachDB
到目前為止,最好的方法是永遠不要編寫收縮數據庫文件的腳本 。 使用數據庫可以完成的上百萬項破壞性工作, 將其緊縮在前3位。請參見自動收縮–將其關閉! 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.