DBName_YYYYMMDD_HHMM.bak)。D:\SQLBackup\)SQL Server 服務帳戶具備「寫入」權限。Job_Backup_UserDB_Full,擁有者 sa,類別「資料庫維護」。FullBackupmasterDECLARE @BackupPath NVARCHAR(260) = N'D:\SQLBackup\';
DECLARE @DBName NVARCHAR(128) = N'YourUserDB';
DECLARE @FileName NVARCHAR(360);
DECLARE @DateStamp NVARCHAR(20);
SET @DateStamp = REPLACE(CONVERT(VARCHAR(19), GETDATE(), 120), ':', '.'); -- 2024-01-15.14.30.45
SET @FileName = @BackupPath + @DBName + N'_' + @DateStamp + N'.bak';
BACKUP DATABASE @DBName
TO DISK = @FileName
WITH
NOINIT, -- 附加到現有媒體集
NOFORMAT, -- 不格式化媒體
SKIP, -- 跳過過期/名稱檢查
STATS = 10, -- 每 10% 回報進度
COMPRESSION, -- 啟用備份壓縮 (SQL 2008 Enterprise+)
CHECKSUM; -- 頁面校驗和,提高可靠度
| 策略層級 | 頻率 | 保留期 | 備份類型 | 適用場景 |
|---|---|---|---|---|
| 核心 OLTP | 完整:每日 02:00 記錄:每 15 分鐘 | 完整 14 天 記錄 7 天 | 完整 + 記錄 | RPO < 15 分鐘,RTO < 1 小時 |
| 報表/資料倉儲 | 完整:每週日 01:00 差異:每日 03:00 | 完整 4 週 差異 2 週 | 完整 + 差異 | 資料變動較緩、可接受較長 RPO |
| 歸檔/唯讀資料庫 | 僅首次完整備份 | 永久 | 完整 | 資料不再變更 |
# 另存為 CleanOldBackups.ps1,Agent 作業步驟類型選 PowerShell
$BackupRoot = "D:\SQLBackup"
$RetainDays = 14
Get-ChildItem -Path $BackupRoot -Filter "*.bak" -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$RetainDays) } |
Remove-Item -Force -Verbose
建立對應 Agent 作業,排程於每日備份完成後 30 分鐘執行。
DBCC CHECKDB 無錯誤。| 現象 | 原因 | 對策 |
|---|---|---|
| 作業歷程顯示成功但備份檔為 0 KB | 路徑寫錯/權限不足/磁碟滿 | 檢查服務帳戶權限、磁碟配額、路徑拼寫 |
| BACKUP 指令報錯「無法開啟備份裝置」 | 網路路徑 UNC 路徑需雙反斜線、服務帳戶無網路存取權 | 用本機路徑或建立具網路權限的代理帳戶 |
| 差異備份失效「找不到基底完整備份」 | 完整備份被刪/移動/覆寫 | 調整清理腳本保留期 ≥ 最舊差異備份所需基底 |
| 記錄備份鏈中斷 | 切換復原模式、執行 TRUNCATE_LOG、資料庫離線 | 立即執行完整備份重建鏈,檢查維護計畫未勾選「截斷記錄」 |
落實自動備份不只是「跑通作業」,更要建立「備份→驗證→清理→監控→演練」閉環,才能在災難發生時真正救回資料與業務。