qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          淺談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),意思是在復制一個對象時并不是真正把對象復制到另一個位置,而是在新的對象中映射一個指針,指向原對象的位置。這樣當對新對象執行讀操作時,直接指向原對象。而在對新的對象執行寫操作時,將改變部分對象的指針指向到新的地址中。并修改映射表到新的位置中。

           使用快照的限制

            使用快照存在諸多限制,由于列表太長,我只概括的說一下主要限制。

            ● 當使用快照恢復數據庫時,首先要刪除其他快照

            ● 快照在創建時的時間點上沒有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、由于快照會拖累數據庫性能,所以數據庫不宜存在過多快照。

            總結

            本文簡單講述了數據庫快照的概念,原理以及使用。數據庫快照可以在很多場景下使用,無論是用于報表,還是和鏡像配合提供負載,以及利用快照恢復數據庫,使用得當的話,快照將會是一把利器。


          posted on 2012-06-29 09:25 順其自然EVO 閱讀(196) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 民县| 龙山县| 呼伦贝尔市| 阳新县| 开远市| 松江区| 佛山市| 准格尔旗| 巴林右旗| 浙江省| 仙桃市| 新河县| 长兴县| 泰和县| 自贡市| 彝良县| 邵阳县| 台山市| 巴彦淖尔市| 枣庄市| 福安市| 门源| 棋牌| 郴州市| 云和县| 富平县| 诏安县| 基隆市| 德阳市| 锦州市| 六盘水市| 苏尼特左旗| 吉木乃县| 昌邑市| 开江县| 澳门| 湟源县| 五指山市| 嘉定区| 巴彦县| 石台县|