測試/開發環境部署常需還原百餘個資料庫。手動透過 SSMS 精靈或逐條執行 RESTORE DATABASE 極其低效。本文提供兩個企業級存儲過程:
① sp_RestoreDataBase — 單一備份檔智能還原
② sp_RestoreDataBase2 — 目錄批次還原編排器
RESTORE HEADERONLY FROM DISK = 'E:\DBBackup\dbA_2011-09-05.bak';
關鍵欄位:DatabaseName (原資料庫名)、BackupType (1=完整, 2=差異, 4=記錄)、Position (備份組序號)、CompressedBackupSize (2008+)。
RESTORE FILELISTONLY FROM DISK = 'E:\DBBackup\dbA_2011-09-05.bak';
關鍵欄位:LogicalName, PhysicalName, Type (D=資料, L=記錄, F=全文), FileID, TDEThumbprint (2008+ 加密指紋)。
RESTORE DATABASE [TargetDB]
FROM DISK = 'E:\DBBackup\dbA_2011-09-05.bak'
WITH
FILE = <最後一個完整備份組的 Position>,
MOVE 'LogicalData' TO 'E:\Data\TargetDB.mdf',
MOVE 'LogicalLog' TO 'E:\Data\TargetDB_Log.ldf',
REPLACE, RECOVERY, STATS = 10;
難點:多資料檔/記錄檔/全文檔的邏輯名重命名、多備份組正確選擇 FILE 參數、NORECOVERY 串聯差異/記錄備份。
| 參數 | 型別 | 說明 |
|---|---|---|
| @DatabBaseBakPath | nvarchar(260) | 備份檔完整路徑 (含檔名) |
| @DatabBaseNewPath | nvarchar(260) | 還原目標資料/記錄檔目錄 |
| @NewDataBaseName | nvarchar(128) | 選填:指定新資料庫名,預設用備份內原名 |
| @Keep_Replication | bit | 選填:是否保留複寫設定 (預設 0) |
xp_fileexist 檢查備份檔存在;xp_cmdshell 'Dir ...' 驗證目標目錄可寫。sys.sysprocesses 依 dbid 產生 KILL spid 批次。DBName.mdfDBName_1.ndf, DBName_2.ndf...DBName_Log.ldfDBName_Log_1.ldf...HeaderOnly 找出 最後一個完整備份組 (BackupType=1 且 Position 最大),自動串聯後續差異/記錄備份 (NORECOVERY 直到最後一組 RECOVERY)。CompressedBackupSize, TDEThumbprint),自動適配。TRY...CATCH 回傳錯誤訊息與代碼 1,便於批次腳本判斷成敗。EXEC dbo.sp_RestoreDataBase
'E:\DBBackup\dbA_2011-09-05.bak',
'E:\DATA\SQL2008DE01';
| 參數 | 型別 | 說明 |
|---|---|---|
| @Path_bak | nvarchar(1024) | 備份檔所在目錄 |
| @Path_new | nvarchar(1024) | 還原目標目錄 (預設讀取註冊表 DefaultData) |
| @DataBaseList | nvarchar(max) | 選填:指定資料庫名清單 (逗號/換行/空格分隔),預設還原目錄下所有 .bak |
@DataBaseList → 臨時表 @DBList。xp_dirtree @Path_bak, 1, 1 列舉目錄下所有 .bak 檔案。RESTORE HEADERONLY 取得 DatabaseName。@DBList 為空 或 名稱在清單中 → 呼叫 sp_RestoreDataBase 還原。@DBListNull。@DBList 與 @DBListNull,輸出「指定但未找到備份」的資料庫清單。-- 還原目錄下所有 .bak
EXEC dbo.sp_RestoreDataBase2 'E:\DBBackup';
-- 僅還原指定資料庫
EXEC dbo.sp_RestoreDataBase2 'E:\DBBackup', NULL, 'DB_A, DB_B, DB_C';
xp_cmdshell (執行 sp_configure 'xp_cmdshell', 1; RECONFIGURE) 以支援目錄驗證。REPLACE,建議加入 CHECKSUM 驗證備份完整性。STATS = 5 監控進度,避免超時誤判。master 資料庫建立即可使用。