SQL Server 2012筆記分享-49:理解數據庫快照

數據庫快照是 SQL Server 數據庫(源數據庫)的只讀靜態視圖。 自創建快照那刻起,數據庫快照在事務上與源數據庫一致。 數據庫快照始終與其源數據庫位於同一服務器實例上。 當源數據庫更新時,數據庫快照也將更新。 因此,數據庫快照存在的時間越長,就越有可能用完其可用磁盤空間。

給定源數據庫中可以存在多個快照。 在數據庫所有者顯式刪除每個數據庫快照之前,該快照將一直保留。

數據庫快照在數據頁級運行。 在第一次修改源數據庫頁之前,先將原始頁從源數據庫複製到快照。 快照將存儲原始頁,保留它們在創建快照時的數據記錄。 對要進行第一次修改的每一頁重複此過程。 對於用戶而言,數據庫快照似乎始終保持不變,因爲對數據庫快照的讀操作始終訪問原始數據頁,而與頁駐留的位置無關。

爲了存儲複製的原始頁,快照使用一個或多個“稀疏文件”。 最初,稀疏文件實質上是空文件,不包含用戶數據並且未被分配存儲用戶數據的磁盤空間。 隨着源數據庫中更新的頁越來越多,文件的大小也不斷增長。 下圖說明了兩種相對的更新模式對快照大小的影響。 更新模式 A 反映的是在快照使用期限內僅有 30% 的原始頁更新的環境。 更新模式 B 反映的是在快照使用期限內有 80% 的原始頁更新的環境。

clipboard

更多詳細信息參考:http://msdn.microsoft.com/zh-cn/library/ms175158.aspx

=============================================================

數據庫快照 (database snapshot)

一個數據庫(源數據庫)的事務一致的只讀靜態視圖。

源數據庫 (source database)

對於數據庫快照,指的是在其上創建快照的數據庫。 數據庫快照與源數據庫相關。 數據庫快照必須與數據庫在同一服務器實例上。 此外,如果數據庫因某種原因而不可用,則它的所有數據庫快照也將不可用。

稀疏文件 (sparse file)

NTFS 文件系統提供的文件,需要的磁盤空間要比其他文件格式少很多。 稀疏文件用於存儲複製到數據庫快照的頁面。 首次創建稀疏文件時,稀疏文件佔用的磁盤空間非常少。 隨着數據寫入數據庫快照,NTFS 會將磁盤空間逐漸分配給相應的稀疏文件。

=============================================================

注意事項


無法對脫機或損壞的數據庫進行恢復。 因此,爲了保護數據庫,非常有必要定期執行備份並測試還原計劃。

數據庫快照與源數據庫相關。 因此,使用數據庫快照還原數據庫不能代替備份和還原策略。 嚴格按計劃執行備份仍然至關重要。 如果必須將源數據庫還原到創建數據庫快照的時間點,請實施允許您執行該操作的備份策略。

使用數據庫快照的原因,決定了數據庫需要多少個併發快照、多久創建一次新快照以及將其保留多久。     所有恢復模式都支持數據庫快照。

可以備份源數據庫,這方面將不受數據庫快照的影響。

通常情況下,快照只會保留一段有限的時間,因此其大小不是主要問題。 但是,保留快照的時間越長,越有可能將可用空間用完。 稀疏文件最大隻能增長到創建快照時相應的源數據庫文件的大小。

除文件空間外,數據庫快照與數據庫佔用的資源量大致相同。

數據庫快照不支持 FILESTREAM 文件組。

禁止對 model 數據庫、master 數據庫和 tempdb 數據庫創建快照。

快照爲只讀。

不能從源數據庫或任何快照中刪除文件。

源數據庫的性能受到影響。由於每次更新頁時都會對快照執行“寫入時複製”操作,導致源數據庫上的 I/O 增加。

不能對源數據庫進行刪除、分離或還原。

============================================================

創建數據庫快照

最佳做法:限制數據庫快照的數量

隨着時間的變化創建一系列快照可捕獲源數據庫的連續快照。 每個數據庫快照會一直保存在系統中,直到被顯式刪除。 因爲每個快照會隨着原始頁的更新而不斷增長,所以您可能想在創建新快照後通過刪除舊的快照來節省空間。

創建數據庫快照的語法如下

CREATE DATABASE database_snapshot_name

    ON

    (

        NAME = logical_file_name,

        FILENAME = 'os_file_name'

    ) [ ,...n]

    AS SNAPSHOT OF source_database_name

[;]

其中,source_database_name 是源數據庫,logical_file_name 是引用該文件時在 SQL Server 中使用的邏輯名稱,os_file_name 是創建該文件時操作系統使用的路徑和文件名,database_snapshot_name 是要將數據庫恢復到的快照的名稱。

在做數據庫快照之前,我們應該先查看一下有多少個數據文件,從而指定不同數量的快照文件,如圖。我這裏只有一個數據文件,name = db01

截圖17

然後執行下面的語句來創建db01數據庫的快照,如圖。

db01_data_1100是快照數據庫的名稱

name = db01表示要爲db01這個數據文件創建快照

filename是快照數據庫存放數據的稀疏文件,後面的ss後綴是隨便起的

截圖18

創建完成後,如下圖所示。

截圖19

==============================================================

從快照數據庫中恢復

可以在做大量數據庫操作之前先做一個快照,以便於在誤刪除數據的時候,可以使用快照來恢復。

截圖20

==============================================================

刪除數據庫快照

刪除數據庫快照的方式和刪除普通數據庫沒有什麼區別。

截圖21

===============================================================

其實從表面上看,快照數據庫和普通數據庫沒什麼區別,唯一不同的是快照數據庫採用的是稀疏文件,存放數據庫創建快照以後所變化的數據,所以實際上快照數據庫佔用的空間比較少,原理可參考文章前面的圖片。

下圖的命令用來顯示特定數據庫的ID號,下圖查找出db01的ID號爲7,快照數據庫db01_data_1100的ID號爲9.

截圖23

通過下圖的命令可以看到快照數據庫和對應的用戶數據庫在大小上都是640,但是實際上快照數據庫佔用的空間要少得多。

截圖24

通過下圖可以看到快照數據庫大小5M,實際佔用爲128KB。

截圖25

================================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章