淺談SQL Server中的快照問題
資料庫快照,正如其名稱所示那樣,是資料庫在某一時間點的檢視。是SQL Server在2005之後的版本引入的特性。快照的應用場景比較多,但快照設計最開始的目的是為了報表服務。比如我需要出2011的資產負債表,這需要資料保持在2011年12月31日零點時的狀態,則利用快照可以實現這一點。快照還可以和映象結合來達到讀寫分離的目的。下面我們來看什麼是快照。
什麼是快照
資料庫快照是 SQL Server 資料庫(源資料庫)的只讀靜態檢視。換句話說,快照可以理解為一個只讀的資料庫。利用快照,可以提供如下好處:
提供了一個靜態的檢視來為報表提供服務
可以利用資料庫快照來恢復資料庫,相比備份恢復來說,這個速度會大大提高(在下面我會解釋為什麼)
和資料庫映象結合使用,提供讀寫分離
作為測試環境或資料變更前的備份,比如我要大批匯入或刪除資料前,或是將資料提供給測試人員進行測試前,做一個快照,如果出現問題,則可以利用快照恢復到快照建立時的狀態
快照的原理
與備份資料庫複製整個資料庫不同,快照並不複製整個資料庫的頁,而是僅僅複製在快照建立時間點之後改變的頁。因此,當利用快照進行資料庫恢復時,也僅僅將那些做出改變的頁恢復到源資料庫,這個速度無疑會大大高於備份和恢復方式。這個原理如圖1所示(圖摘自SQL Server 2008揭秘)。
由圖1可以看出,快照並不是複製整個整個資料庫,而僅僅利用快照儲存原始頁。因此可以看出,源資料庫上建立快照會給IO增加額外負擔.當對快照資料庫進行查詢時,快照時間點之後更改的資料會查詢資料檔案,。這個概念如圖2所示(圖摘自SQL Server 2008揭秘)。
寫入時複製(Copy On Writing)和稀疏檔案(Sparse Flie)
由上圖中可以看出,快照資料庫的檔案是基於稀疏檔案(Sparse File),稀疏檔案是NTFS檔案系統的一項特性。所謂的稀疏檔案,是指檔案中出現大量0的資料,這些資料對我們用處並不大,卻一樣佔用著磁碟空間。因此NTFS對此進行了最佳化,利用演算法將這個檔案進行壓縮。因此當稀疏檔案被建立時,稀疏檔案剛開始大小會很小(甚至是空檔案),比如圖3所示的檔案就是一個稀疏檔案。雖然邏輯上佔了21M,但檔案實際上佔了128KB磁碟空間。
對於快照來說,除了透過快照資料庫檔案的屬性來看快照的大小之外,也可以透過DMV來檢視,如圖4所示.
而當快照建立後,隨著對源資料庫的改變逐漸增多,稀疏檔案也會慢慢增長,概念如圖4所示。
所以,通常來說,當稀疏檔案增長到源資料庫檔案大小的30%時,就應該考慮重建快照了。
而稀疏檔案的寫入是利用了微軟的寫入時複製技術(Copy-On-Writing),意思是在複製一個物件時並不是真正把物件複製到另一個位置,而是在新的物件中對映一個指標,指向原物件的位置。這樣當對新物件執行讀操作時,直接指向原物件。而在對新的物件執行寫操作時,將改變部分物件的指標指向到新的地址中。並修改對映表到新的位置中。
使用快照的限制
使用快照存在諸多限制,由於列表太長(詳細請參考MSDN:),我只概括的說一下主要限制。
當使用快照恢復資料庫時,首先要刪除其他快照
快照在建立時的時間點上沒有commit的資料不會被記入快照
快照是快照整個資料庫,而不是資料庫的某一部分
快照是隻讀的,意思是不能在快照上加任何更改,即使是你想加一個讓報表跑得更快的索引
在利用快照恢復資料庫時,快照和源資料庫都不可用
快照和源資料必須在同一個例項上
快照資料庫的檔案必須在NTFS格式的盤上
當磁碟不能滿足快照的增長時,快照資料庫會被置為suspect狀態
快照上不能存在全文索引
其實,雖然限制看上去很多,但只要明白快照的原理,自然能推測出快照應該有的限制。
快照的建立和使用
無論是使用SSMS或是命令列,快照只能透過T-SQL語句建立。在建立資料庫之前,首先要知道資料庫分佈在幾個檔案上,因為快照需要對每一個檔案進行copy-on-writing。如圖6所示。
根據圖6的資料庫分佈,我們透過T-SQL建立快照,如圖7所示。
當快照資料庫建立成功後,就可以像使用普通資料庫一樣使用快照資料庫了,如圖8所示。
透過如下語句可以看到,快照資料庫檔案和源資料庫的檔案貌似並無區別,僅僅是快照資料庫檔案是稀疏檔案,如圖9所示。
而刪除快照資料庫和刪除普通資料庫並無二至,也僅僅是使用DROP語句,如圖10所示。
我們也可以利用快照恢復資料庫,這個恢復速度要比普通的備份-恢復來的快得多,這也可以將資料庫呈現給測試人員,當測試結束後,恢復資料庫到測試之前的狀態。如圖11所示。
使用快照其他一些需要考慮的因素
1.快照資料庫的安全設定繼承源資料庫的安全設定。也就是說能訪問源資料庫的使用者或角色也能訪問快照資料庫,當然,因為快照資料庫是隻讀的,所以無論任何角色或人都無法修改快照資料庫。
2.我們由文章前面圖5看出,隨著快照存在的時間越來越長,快照會不斷增長。所以推薦在快照達到源資料庫大小30%之前,重新建立快照。
3.由於快照會拖累資料庫效能,所以資料庫不宜存在過多快照。
總結
本文簡單講述了資料庫快照的概念,原理以及使用。資料庫快照可以在很多場景下使用,無論是用於報表,還是和映象配合提供負載,以及利用快照恢復資料庫,使用得當的話,快照將會是一把利器。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1600/viewspace-2800982/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server中datetimeset轉換datetime型別問題淺析SQLServer型別
- 為SQL Server快照snapshot DB建立login訪問SQLServer
- 淺談 js 中的 this 指向問題JS
- sql server 2005資料庫快照SQLServer資料庫
- 淺談sql索引SQL索引
- 淺談深度學習的落地問題深度學習
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- SQL Server 資料庫開發中的十大問題VYSQLServer資料庫
- SQL Server 查詢超時問題排查SQLServer
- 淺入淺出SQL Server 觸發器SQLServer觸發器
- 淺談深度學習落地問題深度學習
- SQL Server 2016資料庫快照代理過程詳解SQLServer資料庫
- 淺淺的談一下回撥地獄的問題
- 閉包 | 淺談JavaScript閉包問題JavaScript
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- 精神股東淺談部落格園盈利的問題
- 淺談5G頻段的選擇問題
- SQL Server database mail問題診斷一例SQLServerDatabaseAI
- SQL Server資料庫恢復常見問題SQLServer資料庫
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- 淺談JavaScript中的thisJavaScript
- SQL Server 2016升級遷移過程中效能問題解決案例SQLServer
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- 淺談動態規劃以及相關的股票問題動態規劃
- 淺談網站伺服器的負載能力問題網站伺服器負載
- SQL Server技術問題之遊標優缺點SQLServer
- 兩款工具解決SQL Server遷移問題DJSQLServer
- SQL Server 中的 ACID 屬性SQLServer
- 淺談徵服型SLG後期乏味問題
- Python | 淺談併發鎖與死鎖問題Python
- 淺談react 中的 this 指向React
- 淺談Java中的HashmapJavaHashMap
- 淺談java中的反射Java反射
- 淺談React中的diffReact
- SQL Server資料庫調整表中列的順序操作方法及遇到問題SQLServer資料庫
- [提問交流]OneThink支援 sql server?SQLServer
- 淺談居中問題(水平居中、垂直居中、水平垂直居中)
- SQL Server 中的一些概念SQLServer