簡體   English   中英

用於多個數據庫的DBCC SHRINKFILE 1 sproc

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM