Sql-Server

備份所有數據庫的腳本

  • January 7, 2017

我正在致力於在 SQL 2008 R2 Express 上自動備份 SQL Server 數據庫。這些備份每天由 Windows 任務計劃程序啟動,它執行一個批處理文件,然後執行一個 SQL 腳本。我不能使用 SQL 代理,因為這是特快版。

目前,我正在編寫一個腳本,逐個備份每個數據庫。然而,這是相當高的維護 - 每次添加、刪除或重命名數據庫時,我都必須修改此腳本以反映這些更改。相反,我想編寫一個單一的 SQL 腳本來一次備份所有數據庫,而不需要一個一個顯式地備份每個數據庫。

這是目前用於備份單個數據庫的腳本:

Print 'Backing up MyDatabase...'
BACKUP DATABASE MyDatabase
TO DISK = 'F:\Backups\SQL Databases\MyDatabase.bak'
  WITH FORMAT,
     NAME = 'Full Backup of MyDatabase';
GO

如何列舉所有數據庫的列表並執行循環以對所有數據庫進行此備份?

只是備份過程的一些附加說明:

  • Windows 中的計劃任務在每天晚上 9:00 執行批處理文件
  • 批處理文件呼叫執行 SQL 腳本的 OSQL
  • OSQL 輸出一個保存結果的文本文件
  • 大約有30個數據庫需要備份
  • 一些數據庫超過 2GB(所以需要一些時間)
  • 第三方備份服務獲取生成的備份文件,並在每晚午夜將它們推送到異地

相信大家可以參考ola.hallengren。SQL 伺服器備份腳本。

如關於如何使用 SQL server Express 所述:

SQL Server Express 沒有 SQL Server 代理。因此,必須使用 cmd 文件和 Windows 計劃任務來計劃儲存過程的執行。按著這些次序。

  • 下載 MaintenanceSolution.sql。
  • 執行 MaintenanceSolution.sql。此腳本創建您需要的儲存過程。
  • 創建cmd文件來執行儲存過程;例如: sqlcmd -E -S .\SQLEXPRESS -d master -Q “EXECUTE dbo.DatabaseBackup

@Databases = ‘USER_DATABASES’, @Directory = N’C:\Backup’, @BackupType = ‘FULL’” -b -o C:\Log\DatabaseBackup.txt

  • 在 Windows 計劃任務中,創建任務以呼叫 cmd 文件。
  • 安排任務。
  • 啟動任務並驗證它們是否成功完成。

現在您可以根據需要輕鬆修改它。

注意:在 MaintenanceSolution 中,您只能單獨單獨下載 SQL 伺服器備份腳本。

您可以像這樣使用 SELECT 語句或 CURSOR:

DECLARE @PathForBackUp VARCHAR(255)
SET @PathForBackUp = 'F:\Backup\User DB\'

SELECT 'BACKUP DATABASE [' + name + '] TO  DISK = N''' + @PathForBackUp + '' + name + '.bak''
WITH NOFORMAT, NOINIT,  NAME = N''' + name + '_FullBackUp'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 5'
FROM sys.databases
WHERE database_id > 4

要麼

DECLARE @DBName VARCHAR(255)  
DECLARE @PathForBackUp VARCHAR(255) 
DECLARE @FileName VARCHAR(255)  
DECLARE @DateFile VARCHAR(255)
DECLARE @SQL NVARCHAR(2048) 
SET @PathForBackUp = 'F:\Backup\User DB\'  
SET @DateFile = REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),120) ,' ','T'), ':','') 

DECLARE BACKUPING CURSOR FOR   
SELECT name  
FROM master.dbo.sysdatabases WHERE dbid > 4 

OPEN BACKUPING    
FETCH NEXT FROM BACKUPING INTO @DBName    
WHILE @@FETCH_STATUS = 0    

BEGIN    
       SET @FileName = @PathForBackUp + @DBName + '_' + @DateFile + '.BAK'  
   SET @SQL = 'BACKUP DATABASE '+@DBName+ ' TO DISK = '''+@FileName+''' WITH COMPRESSION ' 
   PRINT @SQL 
   EXECUTE sp_executesql @sql   
   FETCH NEXT FROM BACKUPING INTO @DBName  

END    

CLOSE BACKUPING    
DEALLOCATE BACKUPING 

引用自:https://dba.stackexchange.com/questions/118482