1.認識快照sql
如名字同樣,數據庫快照就能夠理解爲數據庫某一時刻的照片,它記錄了此時數據庫的數據信息。若是要認識快照的本質,那就要了解快照的工做原理。當咱們執行t-sql建立快照後,此時就會建立一個或多個稀疏文件。稀疏文件的個數與數據庫數據文件的個數相等且必定要相等,不然會報錯。此時,稀疏文件只是一個空文件並無在磁盤上分配空間存儲用戶數據,若是數據庫沒有任何更新那快照也將一直是空文件。快照惟一的一次寫數據,僅發生在第一次更新數據庫的數據頁,這時快照會將數據頁中的數據複製到快照中並在磁盤上真真的分配了空間。之後這個數據頁不管怎麼變化都與快照不要緊,就這樣其它頁都在第一次更新數據前將這一頁的數據複製到快照中,直到數據庫的全部頁都都被複制到快照中。固然這並非很好的結果,由於這樣的快照佔用了大量的空間。另外快照沒有冗餘存儲,因此爲了保證數據庫不出錯還應該多方位考慮好比使用備份。數據庫
建立快照後,當訪問快照中的數據時若是數據頁未更新那麼將直接訪問源數據庫,若是數據頁已更新那麼將訪問快照。知道了快照的工做原理後下一個疑問就是快照的做用以及什麼時候使用它。快照的做用主要有2點:因爲快照能夠保存數據庫某一時刻的數據信息,所以可利用快照作報表;因爲快照保存了數據庫的數據,可以使數據庫還原爲建立快照時的狀態,所以可利用快照做爲一種安全和可靠性策略。使用快照恢復數據庫通常比備份快得多,但恢復後的數據庫將沒法再進行前滾操做。不過有一種方式能夠解決這個缺點,咱們能夠將源數據庫對比數據庫快照中的表,源數據庫裏誤刪或數據錯誤的表可根據快照中的表來創建新的數據表,並將快照中的數據所有複製到源數據庫裏建立的新表中。當表很少數據量不是很大時這種方法仍是挺不錯的。windows
2.稀疏文件安全
稀疏文件是一種文件存儲的方式,當它被建立時稀疏文件佔用的磁盤空間很是少,而用戶數據並不會佔用磁盤空間。這種文件雖然建立了但並未分配完整的存儲空間,隨着用戶數據的寫入稀疏文件纔開始慢慢佔用磁盤空間,當在windows中屬性查看這個文件時會發現它的大小就是建立快照是源數據庫的大小。稀疏文件以64KB的增量增長,也就是說稀疏文件的大小必定是64KB的整數倍。當增長一個64KB時,它能夠存放8個數據頁,而這64KB空間最開始爲空字符串或只佔用一點點用戶數據,因此很稀少。隨着用戶數據的增長稀疏文件最終將等於源數據庫的大小。咱們可使用t-sql來查看稀疏文件名: select physical_name from sys.master_files,而在sys.database_files中則只會顯示源數據庫名,就算是在數據庫快照中進行select。另外還可使用sys.dm_io_virtual_file_stats函數返回表中的size_on_disk_bytes列來查看稀疏文件的真實大小。服務器
3.限制條件函數
對於源數據庫,在數據庫快照存在期間,不得對源數據庫進行刪除、分離或還原,不得對源數據庫和快照進行文件刪除操做。但此時能夠備份數據庫,從這裏能夠看出數據庫備份不會受到快照的影響。因爲源數據庫中的數據頁第一次更新時會將數據頁寫到快照中,所以這必將影響對源數據庫更新時的性能。源數據庫必須處於聯機狀態且不能將源數據庫配置爲可縮放共享數據庫。若是在鏡像數據庫中建立數據庫快照,數據庫必須處於同步鏡像狀態。性能
對於數據庫快照,快照必須與源數據庫在相同的服務器實例上建立和保留,在快照拷貝源數據頁時若是快照用盡磁盤空間或者遇到其餘錯誤,那麼就認爲該快照爲可疑快照而且必須刪除快照。禁止對model數據庫、master數據庫和tempdb數據庫建立快照,快照爲只讀文件不得更改數據庫快照的任何規範,固然也就不能刪除數據庫快照中的文件了。不能備份或還原數據庫快照,不能對數據庫快照進行附加和分離操做。因爲數據庫快照使用的稀疏文件是NTFS文件系統提供的,所以只能在NTFS文件系統上創建快照。數據庫快照會繼承快照建立時源數據庫的安全約束,不過因爲快照的只讀性所以繼承的約束性不得修改。在日誌傳送配置中只能針對主數據庫文件,而不能針對輔助數據庫建立數據庫快照。當從主服務器實例切換爲輔助服務器實例時,必須先將數據庫快照刪除。不能將數據庫快照配置爲可縮放共享數據庫,數據庫快照不支持FILESTREAM文件組,若是源數據庫中存在FILESTREAM文件組,則在數據庫快照中將視這個文件組爲脫機狀態,而且數據庫快照不能用於恢復數據庫。spa
快照始終反映建立該快照時的文件組狀態,聯機文件組將保持聯機狀態,脫機文件組將保持脫機狀態,這是快照與文件組狀態關係的本質。首先快照建立時,若是源數據庫存在脫機文件組,由於稀疏文件不能存儲脫機文件組,故源數據庫中的脫機文件組在快照中將是脫機狀態。建立快照後,源數據庫不能對脫機文件組進行聯機,這樣的話脫機文件組將一直保持脫機狀態。聯機失敗的緣由在於使文件聯機會對該文件進行還原,而在數據庫快照存在期間不得對源數據庫進行刪除、分離或還原。若是建立快照時源文件組是聯機的,那麼此時若對數據文件進行脫機操做,在數據庫快照中將仍然保持聯機狀態,也就是聯機文件組將保持聯機狀態。接着若是訪問快照中的數據,顯然若是源數據庫數據頁沒有更新那將訪問源數據庫,然而數據頁所在的文件組已脫機,最終會產生訪問錯誤而致使失敗。rest
4.操做快照日誌
在建立數據庫快照時,msdn建議咱們應該對源數據庫建立多個數據庫快照,這些快照表明着不一樣時間數據庫的狀態。而且咱們還應該定時的更新數據庫快照,以提升源數據庫的正確性。在恢復數據庫操做中,恢復前必須將其它數據庫快照刪除,另外若源數據庫中含有隻讀或壓縮文件、源數據庫建立快照後對聯機文件進行脫機都將沒法進行數據庫還原操做。任何對數據庫具備restore database權限的用戶均可以恢復數據庫快照,但要注意恢復過程當中除了數據頁的恢復外還將覆蓋舊的日誌文件並重建日誌。這樣就沒法對恢復後的源數據庫進行前滾操做,創建快照後的全部數據都將丟失。
--建立數據庫快照的惟一方式就是使用t-sql --對應普通數據庫,能夠建立數據庫的用戶就能夠建立對應的數據庫快照 --對應鏡像數據庫,只有sysadmin固定服務器角色成員才能建立 create database testDB_SS on ( name=testDB_data, --快照使用的數據文件名 filename='E:\07_代碼存放\testDB_SS.ss' --快照存放的路徑 ) as snapshot of testDB go --經過數據庫快照恢復源數據庫,恢復完成的數據庫將保留數據庫快照的權限和配置 --在恢復過程當中,快照和源數據庫都將不可用。若是恢復期間發生錯誤那數據庫在從新啓動後會再嘗試恢復操做。 restore database testDB from database_snapshot ='testDB_SS.ss' --刪除數據庫快照,操做完成後將關閉對快照的全部用戶鏈接,顯然稀疏文件將不存在 drop database testDB_SS