天天看點

Sqlserver 快照

  最近,開發系統使用SqlServer2008 R2,但是由于系統資料壓力的增加,準備增加一個和正式資料庫同步的庫,用來供接口和報表使用,是以開始對SqlServer裡面的一些技術開始研究,第一篇先來研究一下最基本的資料庫快照。

  基本概念

  先簡單介紹一下快照的基本概念,資料庫快照是 SQL Server 資料庫(源資料庫)的隻讀靜态視圖。 自建立快照那刻起,資料庫快照在事務上與源資料庫一緻。 資料庫快照始終與其源資料庫位于同一伺服器執行個體上。 當源資料庫更新時,資料庫快照也将更新。 是以,資料庫快照存在的時間越長,就越有可能用完其可用磁盤空間。

  資料庫快照操作的級别是“頁面級别”,在第一次修改源資料庫頁之前,先将原始頁從源資料庫複制到快照, 快照将存儲原始頁,保留它們在建立快照時的資料記錄。 對要進行第一次修改的每一頁重複此過程。 對于使用者而言,資料庫快照似乎始終保持不變,因為對資料庫快照的讀操作始終通路原始資料頁,而與頁駐留的位置無關。其實就是快照一直會備份源資料的修改之前的原始頁,是以随着資料的修改增多,快照的檔案存儲就會慢慢變大。

  為了存儲複制的原始頁,快照使用一個或多個“稀疏檔案”。 最初,稀疏檔案實質上是空檔案,不包含使用者資料并且未被配置設定存儲使用者資料的磁盤空間。 随着源資料庫中更新的頁越來越多,檔案的大小也不斷增長。 下圖說明了兩種相對的更新模式對快照大小的影響。 更新模式 A 反映的是在快照使用期限内僅有 30% 的原始頁更新的環境。 更新模式 B 反映的是在快照使用期限内有 80% 的原始頁更新的環境。

  

Sqlserver 快照

  快照可用于報告目的。

  用戶端可以查詢資料庫快照,這對于基于建立快照時的資料編寫報表是很有用的。

  使資料免受管理失誤所帶來的影響。

  如果源資料庫上出現使用者錯誤,您可将源資料庫恢複到建立給定資料庫快照時的狀态。 丢失的資料僅限于建立該快照後資料庫中發生更新的資料。

例如,在進行重大更新(比如大容量更新或架構更改)前,對資料庫建立資料庫快照以保護資料。 一旦進行了錯誤操作,可以使用快照将資料庫恢複到生成快照時的狀态。 為此目的進行的。

  使資料免受使用者失誤所帶來的影響。

  定期建立資料庫快照,可以減輕重大使用者錯誤(例如,删除的表)的影響。 為了很好地保護資料,可以建立時間跨度足以識别和處理大多數使用者錯誤的一系列資料庫快照。 例如,根據磁盤資源,可以每 24 小時建立 6 到 12 個滾動快照。 每建立一個新的快照,就删除最早的快照。

  若要從使用者錯誤中恢複,可以将資料庫恢複到在錯誤發生的前一時刻的快照。 為此目的進行的恢複很可能比從備份還原快得多;但是,此後您無法對資料進行前滾操作。

或者,也可以利用快照中的資訊,手動重新建立删除的表或其他丢失的資料。 例如,可以将快照中的資料大容量複制到資料庫中,然後手動将資料合并回資料庫中。

  管理測試資料庫。

  在測試環境中,當每一輪測試開始時針對要包含相同資料的資料庫重複運作測試協定将十分有用。 在運作第一輪測試前,應用程式開發人員或測試人員可以在測試資料庫中建立資料庫快照。 每次運作測試之後,資料庫都可以通過恢複資料庫快照快速傳回到它以前的狀态。

  資料庫快照的限制 

  源資料庫的限制:

  不能對資料庫進行删除、分離或還原。可以備份源資料庫,這方面将不受資料庫快照的影響。

  源資料庫的性能受到影響。由于每次更新頁時都會對快照執行“寫入時複制”操作,導緻源資料庫上的 I/O 增加。

  不能從源資料庫或任何快照中删除檔案。

  快照資料庫的限制:

  資料庫快照必須與源資料庫在相同的伺服器執行個體上建立和保留。

  始終對整個資料庫制作資料庫快照。

  當将源資料庫中更新的頁強制壓入快照時,如果快照用盡磁盤空間或者遇到其他錯誤,則該快照将成為可疑快照并且必須将其删除。

  快照為隻讀。

  禁止對 model 資料庫、master 資料庫和 tempdb 資料庫建立快照。

  不能在 FAT32 檔案系統或 RAW 分區上建立資料庫快照。 資料庫快照所用的稀疏檔案由 NTFS 檔案系統提供。

  資料庫快照将繼承快照建立時其源資料庫的安全限制。 由于快照是隻讀的,是以無法更改繼承的權限,對源資料庫的更改權限将不反映在現有快照中。

  如果源資料庫的狀态為 RECOVERY_PENDING,可能無法通路其資料庫快照。 但是,當解決了源資料庫的問題之後,快照将再次變成可用快照。

  隻要了解它的原理它的限制也就自然明了。

  建立資料庫快照

  在建立資料庫之前,首先要知道資料庫分布在幾個檔案上,因為快照需要對每一個檔案進行copy-on-writing。

  先檢視資料庫有幾個資料庫檔案:

  我的資料庫隻有一個資料庫檔案,是以直接執行以下腳本建立快照:

  如果資料庫存在于檔案組,可能涉及多個資料庫檔案建立快照的示例:

  資料庫快照恢複和删除