Нам нужно сделать резервную копию 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
Что-то вроде:
должен сделать свое дело.
На рынке также есть ряд продуктов, которые обеспечивают очень гибкие варианты резервного копирования для 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 ''?'''