SQL 2008 Snapshot 資料庫快照集 - 原理篇

摘要:SQL 2008 Snapshot 資料庫快照集 - 原理篇

 在系統的救援策略上,可能用備份、備援、異地備份與異地備援,而在資料庫的救援上可能用 Full Backup、Differential Backup、Transaction Log Backup 與這次要說的 Snapshot。

各種救援策略執行時間點上各有不同,而 Snapshots 是要在一天之內較密集做備份保護,而也因為 Snapshot 這個功能,我會推薦必買 SQL Enterprise 的版本。

什麼是 Snapshot 呢?

中文翻譯成快照,其意思同拍照般可以凍結當時的一瞬間,對著資料庫拍照,就是對資料庫的某一個時間點,凍結記錄內容並完整的紀錄下來。

聽到完整記錄就直覺好像很耗資源,但是 snapshot 雖然佔磁碟空間,卻不會耗費系統其他資源。看下面圖示說明

圖示說明:

 

  • 5GB/80GB 表 (實際佔用磁碟空間 / 配置allocate磁碟空間)
  • 方框中的小方框代表有異動的部分
  • 時間為由上往下進行
  • 當中小方框(正方形)經過了2次的異動,由藍->紅->變成黑,而在 Snapshot DB 端只會記錄 Snapshot 當時的所有情況,即使同一資料異動多次,也只會記錄該時間點內容。
  • Snapshot 一開始只會配置等量的磁碟空間(保留下來),但內容是空的,只有當原資料庫有異動的時候,才會將異動的部分寫入到 Snapshot DB,這也是為何一開始是 0GB/80GB 的緣故。
  • 因此建立 Snapshot DB 只會佔用被配置的磁碟空間,不會再消耗其他系統的資源(如CPU或RAM)。

 

建立 Snapshot 之後,就可以在 SSMS 中看到完整的DB內容。如果這時資料庫無任何異動(意思為 原DB 與 Snapshot DB 相同),當你瀏覽 
Snapshot DB 其實他是 pass 原DB 內容給你看。

 
 

如果已經有異動 Insert / Update / Delete,他會查 
Snapshot DB 混合原DB,以呈現做 Snapshot 當時的資料庫內容樣貌。

 
當資料庫有異動的時候,SQL 會採取 copy-on-write 方式,先將原資料複製 copy 到 Snapshot DB ,才對原始DB做寫入的動作。

 


~ End

後記:從下圖中我想你可以看得出來,如果刪除掉原本的資料庫,Snapshot 只剩片段的儲存內容,這樣子是無法使用的,意即你不能拿 snapshot 當作備份使用,他只是幫你記住某一時刻資料庫的狀態,沒更動的他一概不存。