執行 BACKUP DATABASE 時,SQL Server 內部啟動一套「生產者-消費者」管線:讀取執行緒 從資料檔讀頁 → 寫入共用緩衝區陣列 → 寫入執行緒 從緩衝區取資料寫入備份媒體。理解這套機制,能精準調校 BUFFERCOUNT、MAXTRANSFERSIZE 等進階參數,突破備份效能瓶頸。

BUFFERCOUNT × MAXTRANSFERSIZE + 額外標頭開銷。
BACKUP DATABASE AdventureWorks TO
DISK = 'M:\backups\AW_FULL_01.bak',
DISK = 'N:\backups\AW_FULL_02.bak'
WITH BUFFERCOUNT = 10, MAXTRANSFERSIZE = 1048576; -- 1 MB
關鍵限制:SQL Server 無法區分邏輯磁碟區與實體磁碟。若 E:/F:/G: 為同一實體磁碟的三個分割區,仍會建立 3 條讀取執行緒,造成磁頭劇烈抖動,反而拖垮吞吐量。務必確認磁碟區對應獨立實體 LUN/RAID 群。
| 參數 | 預設值 | 調整建議 |
|---|---|---|
MAXTRANSFERSIZE |
64 KB (65536) ~ 4 MB,視版本/裝置而定 | 磁帶裝置建議廠商指定值 (常 256KB/512KB/1MB);磁碟備份可嘗試 1MB~4MB 減少系統呼叫開銷。 |
BUFFERCOUNT |
由 SQL Server 依據資料庫大小、記憶體自動計算 | 大型資料庫 (TB 級) 可適度調大 (如 50~200),配合大 MAXTRANSFERSIZE。總記憶體不可超過 MemToLeave 可用空間,否則報錯 701/3013。 |
Server: Msg 701, Level 17, State 1, Line 1
There is insufficient system memory to run this query.
Server: Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.
解決:降低參數、增加實體記憶體、或關閉其他大記憶體消耗程序。
DBCC TRACEON(3605, 3213, -1); -- 全域啟用,輸出至錯誤記錄檔
BACKUP DATABASE ...;
DBCC TRACEOFF(3605, 3213, -1);
錯誤記錄檔輸出範例:
2008-07-14 17:21:20.65 spid51 BufferPoolLimit: 100 MB
2008-07-14 17:21:20.65 spid51 Backup/Restore buffer configuration parameters
2008-07-14 17:21:20.65 spid51 Buffer count: 15
2008-07-14 17:21:20.65 spid51 Max transfer size: 983040
2008-07-14 17:21:20.65 spid51 Total buffer space: 14 MB
2008-07-14 17:21:20.65 spid51 Buffers per read stream: 15
2008-07-14 17:21:20.65 spid51 Buffers per write stream: 5
2008-07-14 17:21:20.65 spid51 Memory Limit: 100 MB
Buffers per read stream:每條讀取執行緒分配的緩衝區數。Buffers per write stream:每條寫入執行緒分配的緩衝區數。BACKUP ... TO DISK='NUL' WITH COPY_ONLY 取得讀取極限。Total buffer space 與 Memory Limit,確保不觸發 701 錯誤。TO DISK='file1', DISK='file2'... 增加寫入執行緒。WITH COMPRESSION 以 CPU 換 I/O,通常為淨收益。備份效能調校的本質是「平衡生產者(讀)與消費者(寫)的速率,並給足緩衝區吸收波動」。透過追蹤旗標觀測實際配置、依實體拓撲規劃平行度、審慎調整 BUFFERCOUNT/MAXTRANSFERSIZE,能將備份吞吐量推向硬體極限,縮短備份視窗、降低 RPO 風險。