對於乙個資料庫完整備份來說,備份的速度很大程度上取決於下面兩個因素:讀磁碟資料、日誌檔案的吞吐量,寫磁碟資料檔案的吞吐量。
下圖是備份過程中磁碟的變化情況:
讀吞吐量
讀吞吐量的大小取決於磁碟讀取資料的速度,而磁碟讀取的速度又取決於資料檔案在磁碟中的位置。因此,位於不同碟符上不同資料庫檔案的讀取速度都不相同。
測量讀吞吐量的乙個方法就是進行一次資料庫完整備份,然後使用windows效能監控器(perfmon)來監控資料庫檔案所在磁碟的read bytes/sec 效能計數器。儲存備份檔案的磁碟應該在物理上區別於資料庫檔案所在的磁碟,否則測量精度會不準確。當然備份同時也應該會有另外一些來自系統或是其他應用程式對磁碟的讀取操作。
注意:如果你使用完整備份來監測磁碟讀寫吞吐量的話,那麼這個測試用的備份檔案應該和其他常規備份放在一起,以便恢復時使用。也就是說,如果你在測試備份檔案之後又進行了常規差異備份,那麼這些差異備份就會以這個測試備份為還原的起始點。假設資料庫所有檔案的大小都是相等的,那麼你獲取的最小測量值就是你指定資料庫在系統中最大的備份吞吐量了。
另乙個測量讀吞吐量的方法是在nul裝置上執行備份,如下:
backup database adventureworks to disk = 'nul' with copy_only注意我們使用了copy_only選項,這個選項僅僅在sql server 2005及以上版本中才提供。你可以在sql server2000上執行相同的備份,只是要忽略這個選項,但是一定要小心。因為備份到nul裝置也會被認為是乙個有效備份,這就意味著當你執行備份到nul裝置後,你後續的所有差異備份都將不可用,除非你在執行備份到nul裝置後,再執行一次常規的資料庫完整備份。假如你執行事務日誌備份到nul裝置,那麼你將破壞日誌恢復鏈,導致後續事務日誌備份不可用。
如果你必須在sql server 2000上執行備份到nul裝置的話,一定要做好備災恢復的準備。
假設我現在已經測量出我的adventureworks讀吞吐量為46mb/sec。這就是說,46mb/sec是最大的備份吞吐量了,也是我的磁碟能提供給sql server備份讀執行緒最快的速度了。那我們如何提高這個速度呢?使用更快的磁碟肯定是一種方法。另外的方法就是把資料庫檔案分散到多個物理磁碟上,以便於在讀資料時可以同步建立多個讀執行緒。減小資料庫檔案的碎片級別也可以提高吞吐量,特別是當資料庫檔案有大量碎片存在時。
寫吞吐量
現在開始說說寫吞吐量。執行乙個檔案備份,在我的系統中,我得到了如下的結果:
backup database successfully processed 7529 pages in 3.300 seconds (18.688 mb/sec).上面的結果表明寫吞吐量在這裡成為了瓶頸。我的磁碟可以提供46mb/sec的資料,但是寫速度僅為18.688mb/sec。實際上,我把備份檔案放在了同資料檔案相同的磁碟上,當我把備份檔案放在不同的物理磁碟上時,我得到如下的結果:
backup database successfully processed 7529 pages in 1.421 seconds (43.399 mb/sec).上面的結果已經好很多了。現在讀寫速度都取決於磁碟了,整體的吞吐量已經明顯提高了。所以把備份檔案放到不同的物理磁碟上就是一種提高寫吞吐量的方法。另乙個方法就是把備份分散成不同的檔案。如果磁碟可以控制它的話,那麼檔案可以位於相同的物理磁碟上。如果不能,你最好把檔案分散到不同的物理磁碟上。使用更快的磁碟儲存備份檔案是另乙個好的選擇。
然而,讓我們回到第一步,再看看那個整體圖。想一想備份吞吐量的第一步是讀吞吐量。也就是說即使你的寫吞吐量達到150mb/sec,但是如果讀吞吐量只有46mb/sec的話,也無濟於事,你能獲得的最大備份吞吐量還是46mb/sec。
總結
首先我們總結一下我們都做了什麼:
我們測量了讀吞吐量為46mb/sec,我們討論了如下方法來提高這個數值:
我們在資料庫檔案所在磁碟執行了備份執行,備份吞吐務為18mb/sec。很糟的速度,我們知道讀吞吐量為46mb/sec,所以我們把目標放到了寫吞吐量上。然後,我們把備份檔案放到了與資料庫檔案不同的物理磁碟上。備份吞吐量為43mb/sec。速度不錯。我也還可以提高這一數值嗎?看起來好像是不行了。但是如果我們的寫吞吐量僅僅為25mb/sec的話,我們還可以從以下幾方面來考慮:
補充說明
為了獲得最好的備份吞吐量,下面這幾點在最開始建立資料庫時就應該考慮到。實際上,下面這幾點也同樣適用於提高你資料庫的應用效能。
獲取備份速度資料
你可以從msdb..backupset表中獲取備份速度資料。backup_start_date,backup_finish_date和backup_size列提供了計算備份速度所需的所有資料細節資訊。注意備份大小不是定義資料庫大小所必需的,因為sql server 2005不備份包括已被刪除資料的資料頁。具體細節請參見article。
select database_name, backup_start_date, cast(cast((backup_size / (datediff(ss, backup_start_date, backup_finish_date))) / (1024 * 1024) as numeric(8, 3)) as varchar(16)) + ' mb/sec' speedfrom msdb..backupset
order by database_name, backup_start_date
SQL Server如何提高資料庫備份的速度
對於乙個資料庫完整備份來說,備份的速度很大程度上取決於下面兩個因素 讀磁碟資料 日誌檔案的吞吐量 寫磁碟資料檔案的吞吐量。下圖是備份過程中磁碟的變化情況 讀吞吐量 讀吞吐量的大小取決於磁碟讀取資料的速度,而磁碟讀取的速度又取決於資料檔案在磁碟中的位置。因此,位於不同碟符上不同資料庫檔案的讀取速度都不...
提高SQL Server效能
如何提高sql server的效能 提供sql server效能總的來說有兩種方式 1 擴容,提高伺服器效能,顯著提高cpu 記憶體,解決磁碟i o瓶頸。2 優化應用程式 引起資料效能問題主要原因 1.不了解系統效能和可擴充套件行 2.一次檢索太多資料 3.錯誤的使用資料庫事務 4.錯誤的使用資料庫...
如何提高查詢資料能力
我原先也不會查詢資料,自從2011年努力開始自學程式設計之後,終於入門了程式設計,也在不知不覺中提高了查詢資料的能力。幾乎可以說 只有你想不到,沒有你找不到 如果你找不到,那是你不夠好。因此查詢資料和鑑別好的資料的能力決定了自學的效率,為什麼有的人可以很快學會一樣技能,而有的人光是找資料就迷茫了?這...