首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 遠程定時備份腳本:跨網路共享目錄、動態檔名、Agent 作業排程實戰

     編輯:關於SqlServer

需求背景

  • 每小時備份一次生產資料庫。
  • 備份檔**必須寫入遠端主機共享資料夾** (防本機磁碟故障/勒索軟體)。
  • 檔名含時間戳記,便於識別/保留策略。
  • 全自動無人值守,納入 SQL Server Agent 作業排程。

核心腳本 (單次執行單元)

-- 1. 建立網路映射 (映射遠端共享為本機磁碟機代號)
-- 參數:Y: 磁碟機代號、\\192.168.0.69\sqlbackup 共享路徑、密碼、遠端帳號
EXEC master..xp_cmdshell 'net use Y: \\192.168.0.69\sqlbackup "password" /user:192.168.0.69\account';

-- 2. 動態生成帶時間戳檔名 (格式: YYYYMMDD-HHMMSS.bak)
DECLARE @filename VARCHAR(200);
SELECT @filename = 'Y:\DB\' 
    + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ', '-'), ':', '') 
    + '.bak';
-- 結果範例: Y:\DB\20231025-143000.bak

-- 3. 執行備份 (DB 為目標資料庫名)
BACKUP DATABASE [DB] TO DISK = @filename 
    WITH COMPRESSION, STATS = 5, CHECKSUM; -- 壓縮、進度、校驗和

-- 4. 移除網路映射 (釋放資源、安全)
EXEC master..xp_cmdshell 'net use Y: /delete';

關鍵技術點解析

環節關鍵點最佳實踐
xp_cmdshell需啟用 sp_configure 'xp_cmdshell', 1;**極高風險**,生產環境建議改用 Proxy Account / PowerShell Agent Step / Maintenance Plan 避免直接開啟。
net use 認證密碼明文出現在腳本/日誌中。**必須**建立專用備份帳號、最小權限 (僅寫入共享)、定期輪換密碼、審計日誌。
動態檔名CONVERT(..., 120) (ODBC yyyy-mm-dd hh:mi:ss) + 多層 REPLACE 移除非法字元。可改用 FORMAT(GETDATE(), 'yyyyMMdd-HHmmss') (2012+)。
備份選項COMPRESSION 減少 60-80% 體積/時間;CHECKSUM 偵測頁面損壞;STATS=5 記錄進度便於監控。
路徑預建遠端共享下的 DB 子資料夾**必須預先建立**,且 SQL Server 服務帳戶/Proxy 帳戶需有 **寫入/修改** NTFS 權限。

生產級強化版:PowerShell Agent Step (推薦替代 xp_cmdshell)

# SQL Server Agent 作業步驟類型:PowerShell
$src = "localhost"          # 來源實例
$db  = "DB"                 # 目標資料庫
$share = "\\192.168.0.69\sqlbackup\DB"  # 遠端共享完整路徑
$cred = Get-StoredCredential -Name "SQLBackupCred"  # Windows Credential Manager 儲存帳密

$filename = Join-Path $share ("{0:yyyyMMdd-HHmmss}.bak" -f (Get-Date))

# 使用 dbatools 模組 (強烈推薦) 或原生 SMO
Backup-DbaDatabase -SqlInstance $src -Database $db -Path $share -FileName $filename `
    -CompressBackup -Checksum -CopyOnly -AzureBaseUrl $null `
    -NetworkCredential $cred
# dbatools 自動處理網路認證、壓縮、校驗、多檔案條帶化、進度事件

優勢**:無需啟用 xp_cmdshell、憑證安全儲存、支援條帶化/多線程/雲端、豐富錯誤處理/重試邏輯、社群活躍維護。

Agent 作業排程配置

  1. SSMS → **SQL Server Agent** → **作業** → 右鍵 新增作業。
  2. 一般:名稱 Hourly_Backup_DB_Remote、擁有者 sa、類別 資料庫維護。
  3. 步驟:新增 → 類型 Transact-SQL 指令碼 (T-SQL) 或 PowerShell → 貼上上述腳本 → 進階 → 失敗動作 繼續下一步 (避免單步失敗停整個作業) → 重試次數 2、間隔 1 分鐘。
  4. 排程:新增 → 類型 週期性、頻率 **每天**、間隔 **1 小時**、每日頻率 **每 1 小時** 一次、開始時間 00:00、結束 23:59。
  5. 通知:失敗 → **寄送電子郵件** 給 DBA 群組 (需配置 Database Mail)。
  6. 目標:本地伺服器。

備份保留與清理策略 (配合作業第二步驟)

# PowerShell 步驟 2:清理 7 天前備份
$share = "\\192.168.0.69\sqlbackup\DB"
$days = 7
Get-ChildItem -Path $share -Filter "*.bak" | 
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | 
    Remove-Item -Force -ErrorAction SilentlyContinue

驗證與演練清單

  • [ ] 手動執行作業 → 確認遠端共享出現 .bak、大小合理。
  • [ ] RESTORE HEADERONLY FROM DISK = '...' 驗證備份集完整性。
  • [ ] **季度還原演練**:在測試環境 RESTORE DATABASE ... FROM DISK = '...' WITH MOVE, REPLACE, STATS=5 驗證可用性。
  • [ ] 監控作業歷程記錄 (成功/失敗/耗時) → 納入日報巡檢。

總結

**「本地備份無異地,等於沒備份」**。本文提供從基礎 xp_cmdshell + net use 到生產級 PowerShell + dbatools + Credential Manager 的完整演進路徑。核心要素:**遠端共享 + 動態檔名 + 壓縮校驗 + 安全認證 + 自動清理 + 定期演練**。請根據環境安全基線選擇實施層級,**強烈建議棄用 xp_cmdshell 改用 PowerShell Proxy/模組方案**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved