Назад | Перейти на главную страницу

Как создать сценарий резервного копирования для каждой базы данных на SQL Engine?

Нам нужно сделать резервную копию 40 баз данных внутри MS SQL Server Engine. Мы делаем резервную копию каждой базы данных с помощью следующего скрипта:

BACKUP DATABASE [dbname1] TO  DISK = N'J:\SQLBACKUPS\dbname1.bak' WITH NOFORMAT, INIT,  NAME = N'dbname1-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'dbname1' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'dbname1' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''dbname1'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N'J:\SQLBACKUPS\dbname1.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
GO

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

Я ищу что-то вроде этого:

For each database in database-list
    sp_backup(database) // this is the call to the script above.
End For

Любые идеи?

Вы можете сделать это, используя недокументированную процедуру зацикливания базы данных.

use [master]
go

set quoted_identifier off

exec sp_MSforeachdb "
if ( '?' not in ( 'master', 'msdb', 'model', 'tempdb' ) )
begin

BACKUP DATABASE [?] TO  DISK = N'J:\SQLBACKUPS\?.bak' WITH NOFORMAT, INIT,  NAME = N'?-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

declare @backupSetId as int

select @backupSetId = position from msdb..backupset where database_name=N'?' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'?' )

if ( @backupSetId is null )
begin
    raiserror(N'Verify failed. Backup information for database ''?'' not found.', 16, 1)
end

RESTORE VERIFYONLY FROM  DISK = N'J:\SQLBACKUPS\?.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND

end
"

Я знаю, что это не прямой ответ на ваш вопрос, так как вы хотите что-то с вашим конкретным скриптом, но я подумал, что выброшу это там.

Если у вас есть полная версия MS SQL, а не MS SQL Express, вы можете выполнить маршрут плана обслуживания. Вот PDF-файл от Sunbelt Software, который дает довольно хорошее представление о том, как его использовать, вы можете выбрать здесь базы данных, для которых хотите создать резервную копию: SQL-2005-maintenance-plan.pdf

Что-то вроде:

  1. Создайте курсор для `SELECT name FROM master..sysdatabases WHERE name NOT IN ('list', 'of', 'dbs', 'to', 'skip')
  2. Проходим это и в каждом цикле:
    1. создайте свой сценарий как специальную строку SQL
    2. (имейте указанный выше специальный журнал SQL, какие-либо результаты в небольшой базе данных журналов где-нибудь)
    3. запустите его с помощью EXEC (@sql)
  3. Выведите простой отчет на основе сохраненных результатов для проверки работоспособности

должен сделать свое дело.

На рынке также есть ряд продуктов, которые обеспечивают очень гибкие варианты резервного копирования для SQL Server, которые могут быть лучше для производственного использования, если сценарий усложняется (хотя они, несомненно, недешевы).

Я бы улучшил ваш сценарий:

:: copyonlybackup.bat
IF EXIST "%1_COPYONLY.BAK" (
  sqlcmd -U sa -P xxxxxxx -S SQL-DB -Q "BACKUP DATABASE %1 TO DISK = '%1_COPYONLY.BAK' WITH COPY_ONLY,INIT;"
echo Overwriting previous COPY_ONLY backup of %1 .
) ELSE (
  sqlcmd -U sa -P xxxxxxx -S SQL-DB -Q "BACKUP DATABASE %1 TO DISK = '%1_COPYONLY.BAK' WITH COPY_ONLY;"
  echo Creating new COPY_ONLY backup of %1 .
)

А затем назовите его

:: RUNSCRIPTS.bat
F:
CD "F:\Microsoft SQL Server\MSSQL.1\MSSQL\Backup"

@REM  Doing simple copies just in case
call COPYONLYBACKUP.bat db1
call COPYONLYBACKUP.bat db2
call COPYONLYBACKUP.bat db3
...

Наконец, если вам нужен цикл, сделайте это в файле RUNSCRIPTS.bat, который я показываю выше, используя что-то вроде этого:

for /f %%a IN (myfile.txt) do call copyonlybackup.bat %%a

Чтобы сгенерировать myfile.txt, вы, вероятно, можете заставить SQL каким-то образом сгенерировать его:

EXEC sp_msForEachDB 'PRINT ''?'''