標籤:
最近,開發系統使用SqlServer2008 R2,但是由於系統資料壓力的增加,準備增加一個和正式資料庫同步的庫,用來供介面和報表使用,所以開始對SqlServer裡面的一些技術開始研究,第一篇先來研究一下最基本的資料庫快照集。
基本概念
先簡單介紹一下快照的基本概念,資料庫快照集是 SQL Server 資料庫(來源資料庫)的唯讀靜態視圖。 自建立快照那刻起,資料庫快照集在事務上與來源資料庫一致。 資料庫快照集始終與其來源資料庫位於同一伺服器執行個體上。 當來源資料庫更新時,資料庫快照集也將更新。 因此,資料庫快照集存在的時間越長,就越有可能用完其可用磁碟空間。
資料庫快照集操作的層級是“頁面層級”,在第一次修改來源資料庫頁之前,先將原始頁從來源資料庫複製到快照, 快照將儲存原始頁,保留它們在建立快照時的資料記錄。 對要進行第一次修改的每一頁重複此過程。 對於使用者而言,資料庫快照集似乎始終保持不變,因為對資料庫快照集的讀操作始終訪問未經處理資料頁,而與頁駐留的位置無關。其實就是快照一直會備份來源資料的修改之前的原始頁,所以隨著資料的修改增多,快照的檔案儲存體就會慢慢變大。
為了儲存複製的原始頁,快照使用一個或多個“疏鬆檔案”。 最初,疏鬆檔案實質上是空檔案,不包含使用者資料並且未被分配儲存使用者資料的磁碟空間。 隨著來源資料庫中更新的頁越來越多,檔案的大小也不斷增長。 說明了兩種相對的更新模式對快照大小的影響。 更新模式 A 反映的是在快照使用到期日內僅有 30% 的原始頁更新的環境。 更新模式 B 反映的是在快照使用到期日內有 80% 的原始頁更新的環境。
資料庫快照集的優點
快照可用於報告目的。
用戶端可以查詢資料庫快照集,這對於基於建立快照時的資料編寫報表是很有用的。
使資料免受管理失誤所帶來的影響。
如果來源資料庫上出現使用者錯誤,您可將來源資料庫恢複到建立給定資料庫快照集時的狀態。 丟失的資料僅限於建立該快照後資料庫中發生更新的資料。
例如,在進行重大更新(比如大容量更新或架構更改)前,對資料庫建立資料庫快照集以保護資料。 一旦進行了錯誤操作,可以使用快照將資料庫恢複到產生快照時的狀態。 為此目的進行的。
使資料免受使用者失誤所帶來的影響。
定期建立資料庫快照集,可以減輕重大使用者錯誤(例如,刪除的表)的影響。 為了很好地保護資料,可以建立時間跨度足以識別和處理大多數使用者錯誤的一系列資料庫快照集。 例如,根據磁碟資源,可以每 24 小時建立 6 到 12 個滾動快照。 每建立一個新的快照,就刪除最早的快照。
若要從使用者錯誤中恢複,可以將資料庫恢複到在錯誤發生的前一時刻的快照。 為此目的進行的恢複很可能比從備份還原快得多;但是,此後您無法對資料進行前滾操作。
或者,也可以利用快照中的資訊,手動重新建立刪除的表或其他丟失的資料。 例如,可以將快照中的資料大量複製到資料庫中,然後手動將資料合併回資料庫中。
管理測試資料庫。
在測試環境中,當每一輪測試開始時針對要包含相同資料的資料庫重複運行測試協議將十分有用。 在運行第一輪測試前,應用程式開發人員或測試人員可以在測試資料庫中建立資料庫快照集。 每次運行測試之後,資料庫都可以通過恢複資料庫快照集快速返回到它以前的狀態。
資料庫快照集的限制
來源資料庫的限制:
不能對資料庫進行刪除、分離或還原。可以備份來源資料庫,這方面將不受資料庫快照集的影響。
來源資料庫的效能受到影響。由於每次更新頁時都會對快照執行“寫入時複製”操作,導致來源資料庫上的 I/O 增加。
不能從來源資料庫或任何快照中刪除檔案。
快照資料庫的限制:
資料庫快照集必須與來源資料庫在相同的伺服器執行個體上建立和保留。
始終對整個資料庫製作資料庫快照集。
當將來源資料庫中更新的頁強制壓入快照時,如果快照用盡磁碟空間或者遇到其他錯誤,則該快照將成為可疑快照並且必須將其刪除。
快照為唯讀。
禁止對 model 資料庫、master 資料庫和 tempdb 資料庫建立快照。
不能在 FAT32 檔案系統或 RAW 分區上建立資料庫快照集。 資料庫快照集所用的疏鬆檔案由 NTFS 檔案系統提供。
資料庫快照集將繼承快照建立時其來源資料庫的安全約束。 由於快照是唯讀,因此無法更改繼承的許可權,對來源資料庫的更改許可權將不反映在現有快照中。
如果來源資料庫的狀態為 RECOVERY_PENDING,可能無法訪問其資料庫快照集。 但是,當解決了來源資料庫的問題之後,快照將再次變成可用快照。
只要理解它的原理它的限制也就自然明了。
建立資料庫快照集
在建立資料庫之前,首先要知道資料庫分布在幾個檔案上,因為快照需要對每一個檔案進行copy-on-writing。
先查看資料庫有幾個資料庫檔案:
--根據資料檔案個數建立快照exec sp_helpdb demo01go
我的資料庫只有一個資料庫檔案,所以直接執行以下指令碼建立快照:
--建立快照create database snap_demo_10amon (name=Demo01,filename=‘C:\SQLTest\SNAPSHOT\Snap_advlt.snap‘)as SNAPSHOT of Demo01go
如果資料庫存在於檔案組,可能涉及多個資料庫檔案建立快照的樣本:
----多檔案資料建立快照CREATE DATABASE sales_snapshot1200 ON( NAME = SPri1_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss‘),( NAME = SPri2_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss‘),( NAME = SGrp1Fi1_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss‘),( NAME = SGrp1Fi2_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss‘),( NAME = SGrp2Fi1_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss‘),( NAME = SGrp2Fi2_dat, FILENAME = ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss‘)AS SNAPSHOT OF SalesGO
資料庫快照集恢複和刪除
--利用快著恢複資料庫use masterrestore database Demo01 from database_snapshot=‘snap_demo_10am‘go--刪除快照drop database snap_demo_10am;
Sqlserver 快照