客戶已經用上了壓縮備份(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)。
#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 執行個體之間傳送的最大位元組數目
整理加快資料庫備份的招式:
- 壓縮備份(Compress Backup)
- 分檔備份(Multi Backup Files)
- 調整適合的IO buffers
參考:
BackupRestoreBase.BufferCount 屬性
BackupRestoreBase.MaxTransferSize 屬性