完整備份的速度取決於兩大核心管道的吞吐量:
整體備份速度 = min(讀取吞吐量, 寫入吞吐量)。任一端成為瓶頸,另一端再快也無濟於事。
perfmon 監控資料檔所在磁碟的 Read Bytes/sec 計數器。BACKUP DATABASE AdventureWorks TO DISK = 'NUL' WITH COPY_ONLYCOPY_ONLY 避免破壞差異備份基底;NUL 丟棄寫入,純測讀取極限。COPY_ONLY,備份到 NUL 會被視為有效備份,後續差異/記錄備份鏈會斷裂,務必事後補全完整備份。| 策略 | 原理 | 實作建議 |
|---|---|---|
| 使用更快磁碟 | 提升單磁碟頻寬 | SSD/NVMe、RAID 10、更高 RPM |
| 資料檔分散多實體磁碟 | SQL Server 為每個磁碟區建立一條讀取執行緒,並行讀取 | 建立多個檔案群組,將 .mdf/.ndf 分散到不同 LUN/實體磁碟 |
| 降低檔案碎片 | 連續讀取減少磁頭尋軌/旋轉延遲 | 預先配置足夠初始大小、合理自動成長增量、定期索引重建/重組 |
-- 備份檔與資料檔在同一磁碟
BACKUP DATABASE AdventureWorks TO DISK = 'M:\backups\AW.bak'
-- 結果:7529 pages in 3.300 seconds (18.688 MB/sec) ← 寫入瓶頸
-- 備份檔放在不同實體磁碟
BACKUP DATABASE AdventureWorks TO DISK = 'N:\backups\AW.bak'
-- 結果:7529 pages in 1.421 seconds (43.399 MB/sec) ← 讀寫平衡,接近讀取極限 46 MB/sec
BACKUP DATABASE ... TO DISK='file1.bak', DISK='file2.bak', DISK='file3.bak'WITH COMPRESSION 減少寫入資料量,以 CPU 換 I/O。以下原則同時適用於備份效能與日常查詢效能,建議在資料庫初始規劃階段即納入考量。
SELECT
database_name,
backup_start_date,
CAST(CAST((backup_size / (DATEDIFF(ss, backup_start_date, backup_finish_date))) / (1024.0 * 1024.0) AS NUMERIC(8,3)) AS VARCHAR(16)) + ' MB/sec' AS speed
FROM msdb..backupset
ORDER BY database_name, backup_start_date;
backup_size 已扣除已刪除資料頁 (SQL 2005+),反映實際寫入量。
備份加速的本質是「找出瓶頸端、針對性擴充頻寬」。先測讀取極限,再確保寫入端不拖後腿;長遠來看,磁碟子系統架構與檔案佈局才是根本。建立基準線、定期複測、納入容量規劃,才能在資料成長時保持備份視窗可控。