淺談SQL Server中的快照

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   color   os   使用   sp   

原文:淺談SQL Server中的快照

簡介

    資料庫快照集,正如其名稱所示那樣,是資料庫在某一時間點的視圖。是SQL Server在2005之後的版本引入的特性。快照的應用情境比較多,但快照設計最開始的目的是為了報表格服務。比如我需要出2011的資產負債表,這需要資料保持在2011年12月31日零點時的狀態,則利用快照可以實現這一點。快照還可以和鏡像結合來達到讀寫分離的目的。下面我們來看什麼是快照。

 

什麼是快照

    資料庫快照集是 SQL Server 資料庫(來源資料庫)的唯讀靜態視圖。換句話說,快照可以理解為一個唯讀資料庫。利用快照,可以提供如下好處:

  •     提供了一個靜態視圖來為報表提供服務
  •     可以利用資料庫快照集來恢複資料庫,相比備份恢複來說,這個速度會大大提高(在下面我會解釋為什麼)
  •     和資料庫鏡像結合使用,提供讀寫分離
  •     作為測試環境或資料變更前的備份,比如我要大批匯入或刪除資料前,或是將資料提供給測試人員進行測試前,做一個快照,如果出現問題,則可以利用快照恢複到快照建立時的狀態

 

快照的原理

    與備份資料庫複寫整個資料庫不同,快照並不複製整個資料庫的頁,而是僅僅複製在快照建立時間點之後改變的頁。因此,當利用快照進行資料庫恢複時,也僅僅將那些做出改變的頁恢複到來源資料庫,這個速度無疑會大大高於備份和恢複方式。這個原理1所示(圖摘自SQL Server 2008揭秘)。

   

    圖1.鏡像的原理

   

    由圖1可以看出,快照並不是複製整個整個資料庫,而僅僅利用快照儲存原始頁。因此可以看出,來源資料庫上建立快照會給IO增加額外負擔.當對快照資料庫進行查詢時,快照時間點之後更改的資料會查詢資料檔案,。這個概念2所示(圖摘自SQL Server 2008揭秘)。

   

    圖2.查詢快照資料庫時查詢的分布

 

寫入時複製(Copy On Writing)和疏鬆檔案(Sparse Flie)

    由中可以看出,快照資料庫的檔案是基於疏鬆檔案(Sparse File),疏鬆檔案是NTFS檔案系統的一項特性。所謂的疏鬆檔案,是指檔案中出現大量0的資料,這些資料對我們用處並不大,卻一樣佔用著磁碟空間。因此NTFS對此進行了最佳化,利用演算法將這個檔案進行壓縮。因此當疏鬆檔案被建立時,疏鬆檔案剛開始大小會很小(甚至是空檔案),比3所示的檔案就是一個疏鬆檔案。雖然邏輯上佔了21M,但檔案實際上佔了128KB磁碟空間。

   

    圖3.一個疏鬆檔案

   

    對於快照來說,除了通過快照資料庫檔案的屬性來看快照的大小之外,也可以通過DMV來查看,4所示.

   

    圖4.通過DMV查看快照資料庫大小

    

    而當快照建立後,隨著對來源資料庫的改變逐漸增多,疏鬆檔案也會慢慢增長,概念4所示。

   

    圖5.隨著來源資料庫的更改越來越多,疏鬆檔案不斷增長

 

    所以,通常來說,當疏鬆檔案增長到來源資料庫檔案大小的30%時,就應該考慮重建快照了。

    而疏鬆檔案的寫入是利用了微軟的寫入時複製技術(Copy-On-Writing),意思是在複製一個對象時並不是真正把對象複製到另一個位置,而是在新的對象中映射一個指標,指向原對象的位置。這樣當對新對象執行讀操作時,直接指向原對象。而在對新的對象執行寫操作時,將改變部分對象的指標指向到新的地址中。並修改映射表到新的位置中。

 

使用快照的限制

    使用快照存在諸多限制,由於列表太長(詳細請參考MSDN:http://msdn.microsoft.com/zh-cn/library/ms175158.aspx#LimitationsRequirements),我只概括的說一下主要限制。

  •     當使用快照恢複資料庫時,首先要刪除其他快照
  •     快照在建立時的時間點上沒有commit的資料不會被記入快照
  •     快照是快照整個資料庫,而不是資料庫的某一部分
  •     快照是唯讀,意思是不能在快照上加任何更改,即使是你想加一個讓報表跑得更快的索引
  •     在利用快照恢複資料庫時,快照和來源資料庫都不可用
  •     快照和來源資料必須在同一個執行個體上
  •     快照資料庫的檔案必須在NTFS格式的盤上
  •     當磁碟不能滿足快照的增長時,快照資料庫會被置為suspect狀態
  •     快照上不能存在全文索引

    其實,雖然限制看上去很多,但只要明白快照的原理,自然能推測出快照應該有的限制。

 

快照的建立和使用

    無論是使用SSMS或是命令列,快照只能通過T-SQL語句建立。在建立資料庫之前,首先要知道資料庫分布在幾個檔案上,因為快照需要對每一個檔案進行copy-on-writing。6所示。

   

    圖6.首先查出資料庫的檔案分布

  

    根據圖6的資料庫分布,我們通過T-SQL建立快照,7所示。

   

    圖7,根據圖6的資料庫資訊建立一個資料庫快照集

 

     當快照資料庫建立成功後,就可以像使用普通資料庫一樣使用快照資料庫了,8所示。

   

    圖8.快照資料庫和普通資料庫一樣使用

 

    通過如下語句可以看到,快照資料庫檔案和來源資料庫的檔案貌似並無區別,僅僅是快照資料庫檔案是疏鬆檔案,9所示。

   

    圖9.來源資料庫和快照資料庫

 

    而刪除快照資料庫和刪除普通資料庫並無二至,也僅僅是使用DROP語句,10所示。

   

    圖10.刪除快照資料庫

 

    我們也可以利用快照恢複資料庫,這個恢複速度要比普通的備份-恢複來的快得多,這也可以將資料庫呈現給測試人員,當測試結束後,恢複資料庫到測試之前的狀態。11所示。

   

    圖11.利用快照恢複資料庫

 

使用快照其他一些需要考慮的因素

    1.快照資料庫的安全設定繼承來源資料庫的安全設定。也就是說能訪問來源資料庫的使用者或角色也能訪問快照資料庫,當然,因為快照資料庫是唯讀,所以無論任何角色或人都無法修改快照資料庫。

    2.我們由文章前面圖5看出,隨著快照存在的時間越來越長,快照會不斷增長。所以推薦在快照達到來源資料庫大小30%之前,重新建立快照。

    3.由於快照會拖累資料庫效能,所以資料庫不宜存在過多快照。

 

總結

    本文簡單講述了資料庫快照集的概念,原理以及使用。資料庫快照集可以在很多情境下使用,無論是用於報表,還是和鏡像配合提供負載,以及利用快照恢複資料庫,使用得當的話,快照將會是一把利器。

   

     本文範例程式碼猛擊這裡

淺談SQL Server中的快照

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.