如何脚本MSSQL引擎上的每个数据库备份?

我们需要在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 " 

就像是:

  1. 为“SELECT name FROM master..sysdatabases WHERE name NOT IN('list','of','dbs','to','skip')创build一个游标
  2. 在每个循环中迭代:
    1. 构build您的脚本作为临时的SQLstring
    2. (将上述即席SQL日志的任何结果放在某个小型日志logging数据库中)
    3. 用EXEC(@sql)运行它
  3. 根据存储的结果输出一个简单的报告进行健全性检查

应该做的伎俩。

市场上也有很多产品为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 ''?'''