Sql-Server
備份所有數據庫的腳本
我正在致力於在 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