Shrinklog всех пользовательских баз данных в SQL2008 - PullRequest
0 голосов
/ 06 октября 2010

Привет! Я использую этот скрипт в процессе еженедельного обслуживания, предложите лучший подход / скрипты для создания shrinklog.В настоящее время получаю сообщение об ошибке с помощью приведенного ниже сценария

declare @s nvarchar(4000)
set @s= '
        if ''?'' not in (''tempdb'',''master'',''model'',''msdb'') 
        begin
            use [?] 
            Alter database [?] SET Recovery simple
        end '

exec sp_msforeachdb @s
set @s= '
        if ''?'' not in (''tempdb'',''master'',''model'',''msdb'') 
        begin     
            use [?]  
            Declare @LogFileLogicalName sysname
            select @LogFileLogicalName=Name from sys.database_files where Type=1
            DBCC Shrinkfile(@LogFileLogicalName,1) 
        end'
exec sp_msforeachdb @s

Описание ошибки:

ShrinkLog Выполнить SQL Задача Описание: Выполнение запроса "Declare @S nvarchar (4000) set @s= '... "не удалось из-за следующей ошибки:« Невозможно установить параметр «RECOVERY» в базе данных «tempdb». Невозможно сжать файл журнала 2 (DBServices_Log), поскольку общее количество файлов логического журнала не может быть меньше 2. Выполнение DBCC завершено ». Если DBCC напечатал сообщения об ошибках, обратитесь к системному администратору.

Примечание: я избегаю tempdb (все системные db) в моем скрипте, но сообщение об ошибке показывает tempdb?

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Это, вероятно, худший сценарий обслуживания, который я видел в прошлом году.Сценарий обслуживания, который каждую неделю разрывает цепочку журналов и делает базу данных невосстановимой ??О, МОЙ БОГ.Не говоря уже о том, что простая предпосылка сокращения журнала задачи обслуживания неверна.Если журнал базы данных вырос до определенного размера, тогда этот размер необходим.Чтобы избежать этого, планируйте резервное копирование журнала чаще, но не планируйте операции сжатия журнала.

0 голосов
/ 02 апреля 2014

Вы можете избежать ошибки 5058, используя инструкцию exec для изменения модели восстановления базы данных. Следующий скрипт установит для каждой пользовательской базы данных простую модель восстановления. (Он использует ответ Джимми для обнаружения системных баз данных.)

exec sp_msforeachdb 'if exists (select name from sys.databases d where case when d.name in (''master'',''model'',''msdb'',''tempdb'') then 1 else d.is_distributor end = 0
    and name = ''?'' and recovery_model_desc != ''SIMPLE'')
begin
    declare @previousRecoveryModel varchar(100) = (select recovery_model_desc from sys.databases where name = ''?'');
    print ''Changing recovery model for ? from '' + @previousRecoveryModel + '' to SIMPLE.'';
    use master;
    -- Using exec avoids a compile-time 5058 error about tempdb, which is a branch that will never be executed in this code.
    exec (''alter database [?] set recovery simple'');
end';

Тогда вы не получите ошибку времени компиляции о базе данных tempdb, поскольку инструкция exec скомпилирует свою инструкцию с уже подставленной переменной имени базы данных.

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