資料庫備份是資料安全的最後一道防線。對於 SQL Server (MSSQL) 而言,建立可靠的定時自動備份機制至關重要。本文將詳細介紹兩種主流方案:使用 T-SQL 腳本搭配 SQL Server Agent 作業排程(適用於高度客製化需求),以及透過企業管理器的資料庫維護計劃(適用於圖形化快速設定)。
此方案利用 xp_cmdshell 建立網路磁碟機映射,將備份檔寫入遠端共享資料夾,並能自動清理舊備份,適合跨伺服器備份或需精細控制備份邏輯的場景。
以下範例展示將伺服器 192.168.1.8 上的 TEST 資料庫備份至 192.168.1.145 的 C$ 共享目錄:
-- 1. 建立網路映射 (映射為 Z:)
EXEC master..xp_cmdshell 'net use z: \\192.168.1.145\c$ "Password" /user:192.168.1.145\administrator';
-- 2. 執行備份
BACKUP DATABASE TEST TO DISK = 'z:\Test.bak' WITH INIT;
-- 3. 移除映射
EXEC master..xp_cmdshell 'net use z: /delete';
將以下腳本放入 SQL Server Agent 作業步驟中,可實現全自動化:
-- 建立映射 (假設目標共享為 DatabaseBackup$,帳號 Roy)
EXEC master..xp_cmdshell 'net use w: \\BackupServer\DatabaseBackup$ "passWord" /user:Roy', NO_OUTPUT;
GO
DECLARE @BackupCmd NVARCHAR(200), @DelCmd NVARCHAR(200);
DECLARE @DBName NVARCHAR(128);
-- 遊標遍歷所有非系統資料庫 (dbid > 4)
DECLARE db_cursor CURSOR FOR
SELECT name FROM master..sysdatabases WHERE dbid > 4;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @DBName;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 動態產生備份指令:資料庫名_YYYYMMDD.bak
SET @BackupCmd = 'BACKUP DATABASE ' + QUOTENAME(@DBName) +
' TO DISK = ''W:\' + @DBName + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak'' WITH INIT';
-- 動態產生刪除 4 天前備份指令
SET @DelCmd = 'EXEC master..xp_cmdshell ''DEL W:\' + @DBName + '_' +
CONVERT(VARCHAR(8), DATEADD(DAY, -4, GETDATE()), 112) + '.bak'', NO_OUTPUT';
-- 先刪舊再備新
EXEC (@DelCmd);
EXEC (@BackupCmd);
FETCH NEXT FROM db_cursor INTO @DBName;
END
CLOSE db_cursor;
DEALLOCATE db_cursor;
-- 移除映射
EXEC master..xp_cmdshell 'net use w: /delete';
GO
sa。master → 命令框貼上上述完整腳本 → 點選 剖析 驗證語法。適合不想寫代碼、需求標準的 DBA。
RESTORE VERIFYONLY 或實際還原演練,確保備份檔可用性。方案一 靈活度最高,支援複雜邏輯 (如差異備份鏈、加密、壓縮、多目標複製),適合有開發能力的團隊;方案二 部署快、維護易,適合中小型環境或標準化備份策略。無論選擇哪種,定期演練還原 才是備份策略成功的唯一標準。