我们需要在MS SQL Server Engine中备份40个数据库。 我们用以下脚本备份每个数据库:
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
我们希望在脚本中添加采用每个数据库的function,并将其replace为上面的脚本。 基本上是一个脚本,将创build和validation引擎的每个数据库备份。
我正在寻找这样的东西:
For each database in database-list sp_backup(database) // this is the call to the script above. End For
有任何想法吗?
您可以使用未logging的数据库循环过程来做到这一点。
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 "
就像是:
应该做的伎俩。
市场上也有很多产品为SQL Server提供了非常灵活的备份选项,如果你的脚本变得更复杂(尽pipe它们毫无疑问不便宜),这对产品的使用可能会更好。
我知道这不是对你的问题的直接回应,因为你想要的东西与你的具体脚本,但我想我把它扔在那里。
如果您有完整版本的MS SQL,而不是MS SQL Express,则可以执行维护计划路线。 下面是Sunbelt软件的一个PDF文件,它提供了一个很好的主意,可以在这里select你要备份的数据库: SQL-2005-maintenance-plan.pdf
我会改善你的脚本:
:: 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 ''?'''