最近,開發系統使用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 demo01 go
我的數據庫只有一個數據庫文件,所以直接執行以下腳本創建快照:
--創建快照 create database snap_demo_10am on (name=Demo01,filename='C:\SQLTest\SNAPSHOT\Snap_advlt.snap') as SNAPSHOT of Demo01 go
如果數據庫存在於文件組,可能涉及多個數據庫文件創建快照的示例:
----多文件數據創建快照 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 Sales GO
數據庫快照恢復和刪除
--利用快著恢復數據庫 use master restore database Demo01 from database_snapshot='snap_demo_10am' go --刪除快照 drop database snap_demo_10am;