摘要: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 當作備份使用,他只是幫你記住某一時刻資料庫的狀態,沒更動的他一概不存。