DBCC SHRINKFILE 1 sproc для нескольких баз данных - PullRequest
1 голос
/ 31 марта 2010

Мне нужно выполнить DBCC SHRINKFILE для нескольких дБ в одном и том же sproc. Я мог бы создать несколько sprocs, чтобы он работал в данном контексте, но мне было любопытно, были ли альтернативы?

Ответы [ 3 ]

2 голосов
/ 08 октября 2012

Вот код, который я использую для выполнения этой операции, чтобы сжать журналы в базах данных, начиная с 'MPS_', которые являются простым восстановлением. Это можно установить как план обслуживания задачи выполнения SQL и запланировать соответствующим образом. Текущий код сокращает журнал до 1 ГБ, что делает нас достойными, чтобы избежать фрагментации диска.

Обратите внимание, что это все изменчивые базы данных. Никогда не делайте этого с производственными базами данных, если вы действительно не знаете, что делаете. Кроме того, не просто делает это для каждой простой базы данных модели восстановления. Несколько системных баз данных (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
0 голосов
/ 31 марта 2010

Наилучшим подходом, безусловно, является никогда не писать скрипт, который сокращает файл базы данных . Из миллиона разрушительных вещей, которые вы можете сделать с базой данных, ее сжатие находится прямо на вершине 3. См. Автоусадка - выключите ее! .

0 голосов
/ 31 марта 2010
EXEC sp_MSForEachDB 'USE ? DBCC SHRINKFILE (fileid, targetsize)'

Недокументированный sp_MSForEachDB ваш друг здесь

Редактировать, после комментария Радж

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

Редактировать

Примечание для downvoters, динамический SQL в ответе с наибольшим количеством голосов в основном сокращен sp_MSForEachDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...