[SQL Server][備份]提升備份的速度Part3(增加 I/O buffers)

客戶已經用上了壓縮備份(Compress Backup)再加分檔備份(Multi Backup Files)來提升備份作業速度,本以為除了換上SSD、切多條LUNs等這些可遇不可求的方法之外,只能回到資料庫的儲存資料作封存下手!

最近檢查備份語法時找到一招可以讓資料庫備份再快!

 

環境介紹:

和上次拆檔備份相同,測試環境中有一個資料庫是9GB大小。

 

背景:

SQL Server預設資料庫備份或還原的I/O Max Block size是1MB,而預設的I/O buffers=12 ,計算兩者乘積後,備份只會額外使用12MB記憶體,

因為DB Server的記憶體還算蠻多的,試試放大備份時的I/O Buffers。

 

測試計畫:

分別測試預設的I/O buffers=12作備份以及指定512.1024.2048.4096 作為IO buffers,已經使用拆檔備份(8個),比較各種IO buffers執行時間:

BACKUP DATABASE [RD] TO  
DISK = N'T:\SQL\RD_S1.bak',  
DISK = N'T:\SQL\RD_S2.bak', 
DISK = N'T:\SQL\RD_S3.bak',
DISK = N'T:\SQL\RD_S4.bak',
DISK = N'T:\SQL\RD_S5.bak',
DISK = N'T:\SQL\RD_S6.bak',
DISK = N'T:\SQL\RD_S7.bak',
DISK = N'T:\SQL\RD_S8.bak'
WITH NOFORMAT, NOINIT,  
BUFFERCOUNT = 1024 ,
NAME = N'RD-完整 資料庫 備份', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
GO

 

放大I/O Buffer到1024的測試結果:

 

已處理百分之 90。

已處理資料庫 'RD' 的 782248 頁,檔案 1 上的檔案 'RD'。

已處理資料庫 'RD' 的 309976 頁,檔案 1 上的檔案 'RD_P01'。

已處理資料庫 'RD' 的 8 頁,檔案 1 上的檔案 'RD_HIST'。

已處理資料庫 'RD' 的 2992 頁,檔案 1 上的檔案 'IDX1'。

已處理百分之 100。

已處理資料庫 'RD' 的 2 頁,檔案 1 上的檔案 'RD_log'。

BACKUP DATABASE 已於 14.364 秒內成功處理了 1095226 頁 (595.686 MB/sec)。

 

比較各種I/O Buffer配置

#IO buffers

執行時間(s)

每秒處理備份MB/s

12(預設)

21.963

389.630

512

14.542

588.395

1024

14.364

595.686(最快)

2048

14.941

572.682

4096

16.901

506.268

最多可再減少35%備份時間,快筆記(寫)。

 

 

另外也觀察SQL Server執行備份作業時,實際I/O磁碟機的Block size,Read File/Write File都是1MB!

 

小結:

  • 記憶體需求: 緩衝區空間等於右方乘積:buffercount * maxtransfersize。
  • 預設的MAXTRANSFERSIZE 是1MB * IO buffers = 備份時所需要的記憶體需求,以LAB環境備份最佳的1024 buffers,至少需要額外的1GB記憶體。

 

#buffercount:備份或還原作業的 I/O 緩衝區總數

#maxtransfersize:備份媒體與 SQL Server 執行個體之間傳送的最大位元組數目

 

整理加快資料庫備份的招式:

  1. 壓縮備份(Compress Backup)
  2. 分檔備份(Multi Backup Files)
  3. 調整適合的IO buffers

 

 

參考:

BackupRestoreBase.BufferCount 屬性

BackupRestoreBase.MaxTransferSize 屬性