Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
Коллеги, есть большое количество баз данных на сервере SQL, которым необходимо поменять модель восстановления с "Full" на "Simple", вручную для каждой базы это делать очень нехочется.

Проще говоря, необходимо скрестить 2 запроса :)

SELECT  
 name as 'DatabaseName',   
 recovery_model_desc
FROM sys.databases
WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')


и

ALTER DATABASE DatabaseName SET RECOVERY SIMPLE


Коллеги, подскажите.

ps: буду рад даже намёку :)

ps2: MS SQL 2008R2
23 авг 12, 15:44    [13056000]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
gang
Member

Откуда:
Сообщений: 1394
sp_msforeachdb 'select ''?'''
?
23 авг 12, 15:46    [13056007]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
nicescar
Member

Откуда:
Сообщений: 94
xm?!_(mo3roBa9_akTuBHocTb),

Лучше так:

SELECT 'ALTER DATABASE [' + name + '] SET RECOVERY SIMPLE'
 name as 'DatabaseName',   
 recovery_model_desc
FROM sys.databases
WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')


И выполняйте себе на здоровье.
23 авг 12, 16:15    [13056160]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
nicescar
Member

Откуда:
Сообщений: 94
Запятую забыл, однако, после текстовой строки :)
23 авг 12, 16:16    [13056165]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'
23 авг 12, 16:19    [13056183]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
gang
Member

Откуда:
Сообщений: 1394
stavgreengo
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'
ну вы блин даете, ни миллиметра для свободы творчества ТС. ;=)
23 авг 12, 16:22    [13056213]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
gang
stavgreengo
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'
ну вы блин даете, ни миллиметра для свободы творчества ТС. ;=)


при определенных обстоятельствах скрипт нерабочий
23 авг 12, 16:32    [13056276]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
а вроде not in, прикольно, да?
Guest
stavgreengo
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'


Msg 5058, Level 16, State 1, Line 1
Option 'RECOVERY' cannot be set in database 'tempdb'.
23 авг 12, 16:33    [13056283]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
Всем спасибо, особенно stavgreengo :)

С ошибками, но работает:
stavgreengo
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'


Msg 5058, Level 16, State 1, Line 1
Option 'RECOVERY' cannot be set in database 'tempdb'.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '-'.
Msg 195, Level 15, State 7, Line 1
'RECOVERY' is not a recognized SET option.
23 авг 12, 16:49    [13056372]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
Это всего это реакция на имена баз данных:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '-'.
23 авг 12, 16:52    [13056393]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
Хотел написать "Скорее всего это реакция на имена баз данных" :)

xm?!_(mo3roBa9_akTuBHocTb)
Это всего это реакция на имена баз данных:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '-'.
23 авг 12, 16:53    [13056399]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
не обрабатывает имена баз данных, в которых есть символ "-".
23 авг 12, 17:01    [13056454]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
xm?!_(mo3roBa9_akTuBHocTb),

exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE [?] SET RECOVERY SIMPLE'
23 авг 12, 17:10    [13056526]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
а вроде not in, прикольно, да?
stavgreengo
exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE ? SET RECOVERY SIMPLE'


Msg 5058, Level 16, State 1, Line 1
Option 'RECOVERY' cannot be set in database 'tempdb'.

хех и правда, получается проверка на встроенный запрет перевода модели БД tempdb первична к исполнению, а только потом уже условие not in отрабатывает...занятненько :)
23 авг 12, 17:11    [13056530]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
xm?!_(mo3roBa9_akTuBHocTb)
Member

Откуда:
Сообщений: 267
Спасибо!
Даже не обратил внимание на такое решение проблемы с именами.

Minamoto
xm?!_(mo3roBa9_akTuBHocTb),

exec sp_MSforeachdb 'if ''?'' not in (''master'', ''model'', ''msdb'', ''tempdb'') ALTER DATABASE [?] SET RECOVERY SIMPLE'
23 авг 12, 17:18    [13056594]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
кстати о птичках
Guest
There are many other uses of sp_msforeachdb, such as the following statement which sets all of your databases in to FULL recovery mode except for master, msdb, tempdb and model. TempDB is the only database that you are not allowed to set in to FULL recovery mode – so it must be ignored. Notice this script checks to make sure that the database is not already in FULL recovery mode before it changes it.


EXECUTE sp_msforeachdb '
IF (''?'' NOT IN(''master'',''msdb'',''tempdb'',''model''))
BEGIN
    IF (DATABASEPROPERTYEX (''?'', ''Recovery'') != N''FULL'')
        BEGIN
            EXECUTE sp_executesql N''ALTER DATABASE [?] SET RECOVERY FULL''
            PRINT ''Updated recovery mode of ? to FULL''
        END
    ELSE
        BEGIN
            PRINT ''Recovery mode of ? is already set to FULL''
        END
END'


There is one last thing to note about the above script, it used sp_executesql to alter the database, because if you execute the script below, you will get an ERROR on tempdb as contrairy to common sense, sp_msforeachdb becomes unstable when there is an ALTER DATABASE in the statement.


EXECUTE sp_msforeachdb '
IF ''?'' NOT IN(''master'',''msdb'',''tempdb'',''model'')
ALTER DATABASE [?] SET RECOVERY FULL'


Generates this error:

Msg 5058, Level 16, State 1, Line 3
Option ‘RECOVERY’ cannot be set in database ‘tempdb’.

взято отсюда
23 авг 12, 17:27    [13056650]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
Ибо компиляция.

EXECUTE sp_msforeachdb '
IF ''?'' NOT IN(''master'',''msdb'',''tempdb'',''model'')
exec ( ''ALTER DATABASE [?] SET RECOVERY FULL'')'
23 авг 12, 17:30    [13056679]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
почему?
Guest
Гавриленко Сергей Алексеевич
Ибо компиляция.

EXECUTE sp_msforeachdb '
IF ''?'' NOT IN(''master'',''msdb'',''tempdb'',''model'')
exec ( ''ALTER DATABASE [?] SET RECOVERY FULL'')'


так если была ошибка компиляции, почему для остальных баз выполнилось?
23 авг 12, 17:42    [13056756]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
почему?
так если была ошибка компиляции, почему для остальных баз выполнилось?
Потому что компиляция строки "ALTER DATABASE [tempdb] SET RECOVERY FULL" дает ошибку, а компиляция строки "ALTER DATABASE [любая другая база] SET RECOVERY FULL" -- нет.
23 авг 12, 17:54    [13056847]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
почему?
Guest
Гавриленко Сергей Алексеевич
почему?
так если была ошибка компиляции, почему для остальных баз выполнилось?
Потому что компиляция строки "ALTER DATABASE [tempdb] SET RECOVERY FULL" дает ошибку, а компиляция строки "ALTER DATABASE [любая другая база] SET RECOVERY FULL" -- нет.


это мне понятно.
непонятно, почему "строку компилируем, строку выполняем", а не "все строки компилируем, а потом выполняем".
23 авг 12, 22:59    [13057819]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
почему?
Гавриленко Сергей Алексеевич
пропущено...
Потому что компиляция строки "ALTER DATABASE [tempdb] SET RECOVERY FULL" дает ошибку, а компиляция строки "ALTER DATABASE [любая другая база] SET RECOVERY FULL" -- нет.

это мне понятно.
непонятно, почему "строку компилируем, строку выполняем", а не "все строки компилируем, а потом выполняем".
бай дизайн, решили, что так лучьше (для типичных применений так действительно лучьше)

Там просто курсор и выполнение текста в каждой базе, ничего магического.
23 авг 12, 23:49    [13057915]     Ответить | Цитировать Сообщить модератору
 Re: Изменить RECOVERY MODEL для множества баз данных скриптом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
почему?
непонятно, почему "строку компилируем, строку выполняем", а не "все строки компилируем, а потом выполняем".
Потому что так написано в процедуре sp_msforeachdb. С ее текстом вы можете ознакомиться самостоятельно.
24 авг 12, 10:08    [13058555]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить