數據庫快照:是數據庫某一時間點的視圖,快照涉及最初目的是為了報表服務,快照還可以和鏡像結合來達到讀寫分離的目的
數據庫快照:是sqlserver數據庫的只讀靜態視圖
快照的作用:
1 提供了一個靜態的視圖來為報表服務
2 可以利用數據庫快照來恢復數據庫,相比備份來說,這個速度大大提高
3 和數據庫鏡像結合,提供讀寫分離
4 作為測試環境或則會數據變更前的備份,比如我要大批量刪除或者導入數據前,或是將數據提供給測試人員進行測試前,做有一個快照,如果出現問題,則可以利用快照恢復到快照建立時候的狀態
快照原理:與備份數據庫復制整個數據庫不同,快照並不復制這個數據庫的頁,而是僅僅復制在快照建立時間點之后改變的頁,因此:當利用快照進行數據庫恢復時,也僅僅將那些做了改變的頁恢復到源數據庫,這個速度大大提高
注意:源數據庫建立快照會給IO增加負擔
寫入時復制:
快照數據庫的文件基於稀疏文件,稀疏文件:是NTFS文件系統的一項特性,指文件中出現大量0的數據,這些數據用處不大,卻占用磁盤空間,因此NTFS對此進行了優化,利用算法將這個文件進行壓縮,因此當稀疏文件被創建時,剛打開很小,雖然邏輯上占了二三十M空間,但文件實際就是100多kb
當快照創建后,隨着對源數據庫的改變逐漸增多,稀疏文件也會慢慢增長
通常:當稀疏文件增長到源數據庫文件大小的 30%時,就應該考慮重建快照了
稀疏文件的寫入:利用了微軟的寫入時復制技術:意思是在復制一個對象的時候並不是真正把對象復制到另一個位置,而是在新的對象中映射一個指針,指向原對象的位置,這樣當對新對象執行讀操作時,直接指向源對象,而在對新的對象執行寫操作時候,將改變部分對象的指針指向到新的地址中,並修改映射表到新的位置中
使用快照的法律:
1 當使用快照進行恢復數據庫時,首先要刪除其他快照
2 快照在創建時的時間點上沒有commit的數據不會被計入快照
3 快照是快照整個數據庫,而不是數據庫的某一部分
4 快照是只讀的,所以不能對快照進行任何更改,即使是想加一個讓報表跑的更快的索引
5在利用快照恢復數據庫時,快照和源數據庫都不可用
6快照和源數據必須在同一個實例上
7快照上不能存在全文索引
8當磁盤不能滿足快照的增長的時,快照數據庫會被設置為suspect狀態
快照只能通過sql語句創建,在創建之前,首先要知道數據庫分部在哪幾個文件中
可以使用這個命令查看:EXEC sp_helpdb Yip_20160322
因為快照需要對每一個文件進行 copy-on-writing
--創建數據庫快照 CREATE DATABASE snap_Yip_20160322 ON ( NAME = Yip_20160322,FILENAME = 'D:\SqlTest\snap_Yip_20160322.snap' ) AS SNAPSHOT OF Yip_20160322 go
如果源數據庫分部在多個mdf文件,則將每個用括號括起來,用逗號分隔
執行完了之后會在sqlserver中看到 有一個文件夾叫:
DATABASE Snapshots
點開之后就可以看到剛才新創建的快照
快照數據庫文件和源數據庫文件沒啥不同,僅僅快照數據庫文件是稀疏文件
刪除快照數據庫和刪除普通數據庫一樣 使用 drop database 快照數據庫名
--利用快照恢復數據庫:
USE MASTER RESTORE DATABASE Yipong_20160322 FROM DATABASE_SNAPSHOT = 'snap_Yipong_20160322' go
注意:
1 快照數據庫的安全設置繼承自源數據庫的安全設置,也就是說能訪問源數據庫的用戶或者角色也能訪問快照數據庫,因為快照數據庫是只讀的,所以無論任何角色或者人都無法修改快照數據庫
2 由於快照會拖累數據庫性能,所以數據庫不宜存在過多快照