數(shù)據(jù)庫(kù)快照,正如其名稱所示那樣,是數(shù)據(jù)庫(kù)在某一時(shí)間點(diǎn)的視圖??煺赵O(shè)計(jì)最開始的目的是為了報(bào)表服務(wù)。比如我需要出2011的資產(chǎn)負(fù)債表,這需要數(shù)據(jù)保持在2011年12月31日零點(diǎn)時(shí)的狀態(tài),則利用快照可以實(shí)現(xiàn)這一點(diǎn)??煺者€可以和鏡像結(jié)合來達(dá)到讀寫分離的目的。下面我們來看什么是快照。
數(shù)據(jù)庫(kù)快照是 SQL Server 數(shù)據(jù)庫(kù)(源數(shù)據(jù)庫(kù))的只讀靜態(tài)視圖。換句話說,快照可以理解為一個(gè)只讀的數(shù)據(jù)庫(kù)。利用快照,可以提供如下好處:
提供了一個(gè)靜態(tài)的視圖來為報(bào)表提供服務(wù) 可以利用數(shù)據(jù)庫(kù)快照來恢復(fù)數(shù)據(jù)庫(kù),相比備份恢復(fù)來說,這個(gè)速度會(huì)大大提高(在下面我會(huì)解釋為什么) 和數(shù)據(jù)庫(kù)鏡像結(jié)合使用,提供讀寫分離 作為測(cè)試環(huán)境或數(shù)據(jù)變更前的備份,比如我要大批導(dǎo)入或刪除數(shù)據(jù)前,或是將數(shù)據(jù)提供給測(cè)試人員進(jìn)行測(cè)試前,做一個(gè)快照,如果出現(xiàn)問題,則可以利用快照恢復(fù)到快照建立時(shí)的狀態(tài)
與備份數(shù)據(jù)庫(kù)復(fù)制整個(gè)數(shù)據(jù)庫(kù)不同,快照并不復(fù)制整個(gè)數(shù)據(jù)庫(kù)的頁(yè),而是僅僅復(fù)制在快照建立時(shí)間點(diǎn)之后改變的頁(yè)。因此,當(dāng)利用快照進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)時(shí),也僅僅將那些做出改變的頁(yè)恢復(fù)到源數(shù)據(jù)庫(kù),這個(gè)速度無疑會(huì)大大高于備份和恢復(fù)方式。這個(gè)原理如圖1所示(圖摘自SQL Server 2008揭秘)。
圖1.鏡像的原理
由圖1可以看出,快照并不是復(fù)制整個(gè)整個(gè)數(shù)據(jù)庫(kù),而僅僅利用快照存儲(chǔ)原始頁(yè)。因此可以看出,源數(shù)據(jù)庫(kù)上建立快照會(huì)給IO增加額外負(fù)擔(dān).當(dāng)對(duì)快照數(shù)據(jù)庫(kù)進(jìn)行查詢時(shí),快照時(shí)間點(diǎn)之后更改的數(shù)據(jù)會(huì)查詢數(shù)據(jù)文件,。這個(gè)概念如圖2所示(圖摘自SQL Server 2008揭秘)。
圖2.查詢快照數(shù)據(jù)庫(kù)時(shí)查詢的分布
由上圖中可以看出,快照數(shù)據(jù)庫(kù)的文件是基于稀疏文件(Sparse File),稀疏文件是NTFS文件系統(tǒng)的一項(xiàng)特性。所謂的稀疏文件,是指文件中出現(xiàn)大量0的數(shù)據(jù),這些數(shù)據(jù)對(duì)我們用處并不大,卻一樣占用著磁盤空間。因此NTFS對(duì)此進(jìn)行了優(yōu)化,利用算法將這個(gè)文件進(jìn)行壓縮。因此當(dāng)稀疏文件被創(chuàng)建時(shí),稀疏文件剛開始大小會(huì)很小(甚至是空文件),比如圖3所示的文件就是一個(gè)稀疏文件。雖然邏輯上占了21M,但文件實(shí)際上占了128KB磁盤空間。
圖3.一個(gè)稀疏文件
對(duì)于快照來說,除了通過快照數(shù)據(jù)庫(kù)文件的屬性來看快照的大小之外,也可以通過DMV來查看,如圖4所示.
圖4.通過DMV查看快照數(shù)據(jù)庫(kù)大小
而當(dāng)快照創(chuàng)建后,隨著對(duì)源數(shù)據(jù)庫(kù)的改變逐漸增多,稀疏文件也會(huì)慢慢增長(zhǎng),概念如圖4所示。
圖5.隨著源數(shù)據(jù)庫(kù)的更改越來越多,稀疏文件不斷增長(zhǎng)
所以,通常來說,當(dāng)稀疏文件增長(zhǎng)到源數(shù)據(jù)庫(kù)文件大小的30%時(shí),就應(yīng)該考慮重建快照了。
而稀疏文件的寫入是利用了微軟的寫入時(shí)復(fù)制技術(shù)(Copy-On-Writing),意思是在復(fù)制一個(gè)對(duì)象時(shí)并不是真正把對(duì)象復(fù)制到另一個(gè)位置,而是在新的對(duì)象中映射一個(gè)指針,指向原對(duì)象的位置。這樣當(dāng)對(duì)新對(duì)象執(zhí)行讀操作時(shí),直接指向原對(duì)象。而在對(duì)新的對(duì)象執(zhí)行寫操作時(shí),將改變部分對(duì)象的指針指向到新的地址中。并修改映射表到新的位置中。
使用快照存在諸多限制,由于列表太長(zhǎng)(詳細(xì)請(qǐng)參考MSDN:http://msdn.microsoft.com/zh-cn/library/ms175158.aspx#LimitationsRequirements),我只概括的說一下主要限制。
當(dāng)使用快照恢復(fù)數(shù)據(jù)庫(kù)時(shí),首先要?jiǎng)h除其他快照 快照在創(chuàng)建時(shí)的時(shí)間點(diǎn)上沒有commit的數(shù)據(jù)不會(huì)被記入快照 快照是快照整個(gè)數(shù)據(jù)庫(kù),而不是數(shù)據(jù)庫(kù)的某一部分 快照是只讀的,意思是不能在快照上加任何更改,即使是你想加一個(gè)讓報(bào)表跑得更快的索引 在利用快照恢復(fù)數(shù)據(jù)庫(kù)時(shí),快照和源數(shù)據(jù)庫(kù)都不可用 快照和源數(shù)據(jù)必須在同一個(gè)實(shí)例上 快照數(shù)據(jù)庫(kù)的文件必須在NTFS格式的盤上 當(dāng)磁盤不能滿足快照的增長(zhǎng)時(shí),快照數(shù)據(jù)庫(kù)會(huì)被置為suspect狀態(tài) 快照上不能存在全文索引其實(shí),雖然限制看上去很多,但只要明白快照的原理,自然能推測(cè)出快照應(yīng)該有的限制。
無論是使用SSMS或是命令行,快照只能通過T-SQL語(yǔ)句創(chuàng)建。在創(chuàng)建數(shù)據(jù)庫(kù)之前,首先要知道數(shù)據(jù)庫(kù)分布在幾個(gè)文件上,因?yàn)榭煺招枰獙?duì)每一個(gè)文件進(jìn)行copy-on-writing。如圖6所示。
圖6.首先查出數(shù)據(jù)庫(kù)的文件分布
根據(jù)圖6的數(shù)據(jù)庫(kù)分布,我們通過T-SQL創(chuàng)建快照,如圖7所示。
圖7,根據(jù)圖6的數(shù)據(jù)庫(kù)信息創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)快照
當(dāng)快照數(shù)據(jù)庫(kù)創(chuàng)建成功后,就可以像使用普通數(shù)據(jù)庫(kù)一樣使用快照數(shù)據(jù)庫(kù)了,如圖8所示。
圖8.快照數(shù)據(jù)庫(kù)和普通數(shù)據(jù)庫(kù)一樣使用
通過如下語(yǔ)句可以看到,快照數(shù)據(jù)庫(kù)文件和源數(shù)據(jù)庫(kù)的文件貌似并無區(qū)別,僅僅是快照數(shù)據(jù)庫(kù)文件是稀疏文件,如圖9所示。
圖9.源數(shù)據(jù)庫(kù)和快照數(shù)據(jù)庫(kù)
而刪除快照數(shù)據(jù)庫(kù)和刪除普通數(shù)據(jù)庫(kù)并無二至,也僅僅是使用DROP語(yǔ)句,如圖10所示。
圖10.刪除快照數(shù)據(jù)庫(kù)
我們也可以利用快照恢復(fù)數(shù)據(jù)庫(kù),這個(gè)恢復(fù)速度要比普通的備份-恢復(fù)來的快得多,這也可以將數(shù)據(jù)庫(kù)呈現(xiàn)給測(cè)試人員,當(dāng)測(cè)試結(jié)束后,恢復(fù)數(shù)據(jù)庫(kù)到測(cè)試之前的狀態(tài)。如圖11所示。
圖11.利用快照恢復(fù)數(shù)據(jù)庫(kù)
1.快照數(shù)據(jù)庫(kù)的安全設(shè)置繼承源數(shù)據(jù)庫(kù)的安全設(shè)置。也就是說能訪問源數(shù)據(jù)庫(kù)的用戶或角色也能訪問快照數(shù)據(jù)庫(kù),當(dāng)然,因?yàn)榭煺諗?shù)據(jù)庫(kù)是只讀的,所以無論任何角色或人都無法修改快照數(shù)據(jù)庫(kù)。
2.我們由文章前面圖5看出,隨著快照存在的時(shí)間越來越長(zhǎng),快照會(huì)不斷增長(zhǎng)。所以推薦在快照達(dá)到源數(shù)據(jù)庫(kù)大小30%之前,重新創(chuàng)建快照。
3.由于快照會(huì)拖累數(shù)據(jù)庫(kù)性能,所以數(shù)據(jù)庫(kù)不宜存在過多快照。
本文簡(jiǎn)單講述了數(shù)據(jù)庫(kù)快照的概念,原理以及使用。數(shù)據(jù)庫(kù)快照可以在很多場(chǎng)景下使用,無論是用于報(bào)表,還是和鏡像配合提供負(fù)載,以及利用快照恢復(fù)數(shù)據(jù)庫(kù),使用得當(dāng)?shù)脑挘煺諏?huì)是一把利器。
新聞熱點(diǎn)
疑難解答
圖片精選