生產環境備份策略四大主流實作方式完整比較:GUI 維護計畫、T-SQL Agent 作業、xp_cmdshell 命令列、PowerShell + sqlcmd,含完整腳本、優缺點分析與選型建議。
DECLARE @filename VARCHAR(500), @date DATETIME = GETDATE(), @old_date DATETIME = DATEADD(DAY, -5, GETDATE());
SET @filename = 'E:\Backup\DBName-' + CONVERT(CHAR(8), @date, 112) + '.BAK';
BACKUP DATABASE [DBName] TO DISK = @filename WITH COMPRESSION, CHECKSUM;
EXEC master.dbo.xp_delete_file 0, N'E:\Backup', N'bak', @old_date, 1; -- 刪除 5 天前 .bak
DECLARE @name SYSNAME, @path NVARCHAR(260) = N'E:\Backup\', @date CHAR(8) = CONVERT(CHAR(8), GETDATE(), 112);
DECLARE cur CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','tempdb','model','msdb') AND state_desc = 'ONLINE';
OPEN cur; FETCH NEXT FROM cur INTO @name;
WHILE @@FETCH_STATUS = 0 BEGIN
DECLARE @fn NVARCHAR(500) = @path + @name + '_' + @date + '.bak';
BACKUP DATABASE @name TO DISK = @fn WITH COMPRESSION, CHECKSUM;
FETCH NEXT FROM cur INTO @name;
END
CLOSE cur; DEALLOCATE cur;
-- 清理邏輯同前
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
DECLARE @path VARCHAR(50) = 'E:\Backup', @ddate CHAR(8) = CONVERT(CHAR(8), GETDATE(), 112), @sql NVARCHAR(MAX);
-- 清理 1 天前
SET @sql = 'xp_cmdshell ''forfiles /p "' + @path + '" /d -1 /m *.bak /c "cmd /c del /f @file"'''; EXEC (@sql);
-- 產生並執行所有使用者資料庫備份
SET @sql = ''; SELECT @sql = @sql + 'BACKUP DATABASE [' + name + '] TO DISK = ''' + @path + '\' + REPLACE(name,'.','') + @ddate + '.bak'' WITH COMPRESSION; ' FROM master..sysdatabases WHERE name NOT IN ('master','tempdb','model','msdb');
EXEC (@sql);
xp_cmdshell 需 sysadmin、易遭注入、稽核困難。**生產環境極不建議**,若必須用請配合 Proxy 帳號、嚴格防火牆、啟用即關。# backup.ps1
$dbs = @('DB1','DB2','DB3')
foreach ($db in $dbs) {
$fn = "E:\Backup\$db\_$(Get-Date -Format 'yyyyMMdd_HHmmss').bak"
& sqlcmd -S localhost -E -Q "BACKUP DATABASE [$db] TO DISK = N'$fn' WITH COMPRESSION, CHECKSUM"
if ($LASTEXITCODE -ne 0) { Write-Error "$db 備份失敗"; Send-MailMessage ... }
}
# 清理
Get-ChildItem E:\Backup -Filter *.bak -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-5) } | Remove-Item -Force
sqlcmd/Invoke-Sqlcmd)。| 場景 | 推薦 | 理由 |
|---|---|---|
| 中小型、單一執行個體、團隊偏好 GUI | 維護計畫 | 零門檻、內建清理/通知 |
| 中大型、多實例、需版控/標準化/稽核 | T-SQL Agent 作業 | 核心技能、無外部相依、易模板化 |
| 跨平台、雲端混合、自動化流水線 | PowerShell + sqlcmd | 現代化、功能無上限、生態豐富 |
| 舊版相容、極特殊外部工具整合 | xp_cmdshell (最後手段) | 高風險、嚴格管控 |
WITH ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = ...)。