資料庫快照集 (SQL Server)
適用於:SQL Server
資料庫快照集是 SQL Server 資料庫的唯讀靜態檢視(源資料庫)。 在建立快照的時候,該快照在交易上與來源資料庫保持一致,並且總是位於與來源資料庫相同的伺服器實例上。 雖然資料庫快照集會以建立快照集時的相同狀態提供資料唯讀檢視,但快照集檔案大小會隨著來源資料庫變更而增加。
雖然資料庫快照集在主要架構升級期間很有用,並允許還原為先前的狀態,但請務必瞭解快照集不會取代定期備份的需求。 您無法備份或還原資料庫快照集,這表示它們應該與強固的備份策略搭配使用,以確保數據遺失或損毀時數據保護和復原。
資料庫快照集會使用 CREATE DATABASE T-SQL 語法來建立,並使用 AS SNAPSHOT OF
語法。
給定來源資料庫中可以存在多個快照集。 每個資料庫快照集都會保存,直到資料庫擁有者明確刪除為止。
注意
資料庫快照集與快照集備份、Transact-SQL 快照集備份、交易的快照隔離或快照式複寫無關。
功能概觀
資料庫快照集會在數據頁面層級運作。 在第一次修改來源資料庫的頁面之前,系統就會將原始頁面從來源資料庫複製到快照集。 快照集會儲存原始頁面,保留快照集建立時已存在的資料記錄。 每個首次被修改的頁面都會重複相同的過程。 對使用者而言,資料庫快照集似乎永遠不會變更,因為資料庫快照集上的讀取作業一律會存取原始數據頁面,而不論它們位於何處。
快照會使用一個或多個 稀疏文件來儲存已複製的原始頁面。 一開始,疏鬆檔案是空的檔案,不包含任何用戶數據,且尚未為用戶數據配置磁碟空間。 檔案大小隨著源資料庫中的更多頁面更新而成長。 下圖說明兩個相反的更新模式,對於快照集大小的影響。 更新模式 A 所反映的環境,在快照集的生命期限內,只有 30% 的原始頁面有更新。 更新模式 B 所反映的環境,在快照集的生命期限內,有 80% 的原始頁面有更新。
好處
快照集可以用於報表用途。
- 用戶端可以查詢資料庫快照集,這有助於在建立快照集時根據數據寫入報表。
維護報表產生的歷程記錄資料。
- 快照集可對特定時間點的資料提供使用者存取。 例如,您可以建立資料庫快照,以便在指定期間(如財務季度)結束時稍後報告。 接著,您可以在快照集執行期末報表。 如果磁碟空間允許,您也可以無限制地保留期間結束快照集,提出查詢這些期間的結果,例如分析組織效能。
使用鏡像資料庫以維持可用性,並分擔報告工作。
- 將資料庫快照集與資料庫鏡像一起使用,可讓您存取鏡像伺服器上的資料以供報表使用。 此外,在鏡像資料庫上執行查詢可以釋放主要伺服器的資源。 如需詳細資訊,請參閱資料庫鏡像和資料庫快照集 (SQL Server)。
保護資料以防發生管理疏失。
如果源資料庫中發生使用者錯誤,您可以在建立資料庫快照集時將其還原為其狀態。 您只會失去建立快照集之後的資料庫更新資料。
例如,在執行重大更新,例如大量更新或架構變更之前,請在資料庫上建立資料庫快照集以保護數據。 如果發生錯誤,您可以將資料庫還原為快照集,利用快照集進行復原。 恢復速度比從備份中還原更快,不過,恢復後就無法再進行前進操作。
重要
離線或損毀的資料庫不能還原。 因此,需要定期備份和測試還原計劃,才能保護資料庫。
注意
資料庫快照集相依於來源資料庫。 因此,使用快照來還原資料庫不能替代您的備份和還原策略。 基本上還是請您執行所有排程備份。 如果您必須將源資料庫還原到您建立資料庫快照集的點,請實作可讓您執行此動作的備份原則。
保護資料以防使用者有所疏失。
您可以定期建立資料庫快照集,以減輕重大使用者錯誤的影響,例如丟失的資料表。 如需更高階的保護,您可以建立一系列資料庫快照集,所涵蓋的時間長度足以辨識出大多數使用者造成的錯誤,並對之作出回應。 例如,視您的磁碟資源而定,您可能會維護跨越 24 小時間隔的 6 到 12 個滾動快照集。 接著,每建立一個新的快照集,就會刪除最舊的快照集。
若要復原使用者造成的錯誤,您可以將資料庫還原為錯誤發生之前的快照集。 還原可能比從備份還原快得多;不過,之後就無法向前復原。
或者,您可以手動重新建構丟失的數據表或從快照資訊中恢復的其他遺失數據。 例如,您可以將快照中的資料大量複製到資料庫中,並手動將資料合併回資料庫。
注意
使用資料庫快照集的理由,會決定資料庫上同時要有幾個快照集、建立新快照集的頻率,以及保留快照集的時間長度。
管理測試資料庫。
- 在測試環境中,資料庫在重複運行測試協議時,在每個測試回合開始時包含相同的資料會很有用。 執行第一輪之前,應用程式開發人員或測試人員可以建立測試資料庫的快照集。 在每一回測試執行之後,可還原資料庫快照集,使資料庫快速回到它先前的狀態。
詞彙和定義
SQL Server 中的資料庫快照集牽涉到數個主要詞彙和定義。 資料庫快照 是在特定時間點對資料庫(稱為 源資料庫)的唯讀靜態檢視。 源資料庫 是快照集所依據的原始資料庫,而且快照集必須維持在在線且可供使用。 稀疏檔案 儲存自快照建立以來已被修改的源資料庫的原始頁面。 這些檔案一開始是空的,而且會在源資料庫中發生變更時成長。 了解這些詞彙對於在 SQL Server 中有效管理和使用資料庫快照集而言非常重要。
資料庫快照集
資料庫 (來源資料庫) 在交易上一致的唯讀、靜態檢視。
來源資料庫
若是資料庫快照集,則為快照集建立所在的資料庫。 資料庫快照集相依於來源資料庫。 資料庫的快照集必須與資料庫位於相同的伺服器執行個體上。 此外,如果該資料庫因任何原因而不可用,其快照就會變得不可用。
疏鬆檔案
NTFS 檔系統提供的檔案所需的磁碟空間遠低於其他需求。 疏鬆檔案可用來儲存複製到資料庫快照集的頁面。 初次建立時,疏鬆檔案所佔的磁碟空間很小。 當資料寫入資料庫快照集時,NTFS 也會逐漸將磁碟空間配置到對應的疏鬆檔案。
先決條件
可使用任何復原模式的來源資料庫必須符合下列必要條件:
伺服器實例必須在支持資料庫快照集的 SQL Server 版本上執行。
- 如需詳細資訊,請參閱 SQL Server 2016 版本支援的功能。
除非源資料庫是資料庫鏡像會話內的鏡像資料庫,否則源資料庫必須處於在線狀態。
您可以在任何主要或輔助資料庫的可用性群組中建立資料庫快照集。 複本角色必須是不在 RESOLVING 狀態的 PRIMARY 或 SECONDARY。
當您建立資料庫快照集時,建議資料庫同步處理狀態為 SYNCHRONIZING 或 SYNCHRONIZED。 不過,當狀態為 NOT SYNCHRONIZING 時,可以建立資料庫快照集。
- 如需詳細資訊,請參閱 資料庫快照集與 AlwaysOn 可用性群組 (SQL Server)。
若要在鏡像資料庫上建立資料庫快照集,資料庫必須處於「已同步處理」的鏡像狀態。
源資料庫無法設定為可調整的共享資料庫。
在 SQL Server 2019 之前,源資料庫不能包含MEMORY_OPTIMIZED_DATA檔案群組。 SQL Server 2019 已新增記憶體內部資料庫快照集的支援。
所有復原模式都支援資料庫快照集。
來源資料庫的限制
只要資料庫快照集存在,快照集的來源資料庫就會有下列限制:
資料庫無法被刪除、中斷連接或還原。
備份源資料庫通常可運作,但不會受到資料庫快照集的影響。
由於源資料庫上的 I/O 增加,因為每次更新頁面時,都會將寫入作業複製到快照集所產生的效能降低。
無法從源資料庫或任何快照集卸除檔案。
資料庫快照集的限制
資料庫快照集相依於源資料庫,且不會防止磁碟錯誤或損毀。 因此,雖然它們對於報告用途或架構變更期間很有用,但應該補充而非取代一般備份做法。 如果您需要將源資料庫還原到您建立資料庫快照集的點,請實作可讓您執行此動作的備份原則。
下列限制適用於資料庫快照集:
建立及保留資料庫快照集的伺服器執行個體必須與來源資料庫相同。
資料庫快照集永遠會處理完整的資料庫。
資料庫快照集相依於源資料庫,且不是備援記憶體。 它們不會防止磁碟錯誤或其他類型的損毀。 因此,使用快照集來還原資料庫不是備份和還原策略的替代品。 基本上還是請您執行所有排程備份。 如果您必須將源資料庫還原到您建立資料庫快照集的點,請實作可讓您執行此動作的備份原則。
當源資料庫上更新的頁面推送至快照集時,如果快照集用盡磁碟空間或遇到其他錯誤,就會變成可疑且必須刪除。
快照集是唯讀的。 因為它們是唯讀的,所以無法升級。 因此,資料庫快照集在升級後預期將無法使用。
無法為
model
、master
和tempdb
資料庫製作快照。您無法變更資料庫快照集檔案的任何規格。
您無法從資料庫快照集卸除檔案。
您無法備份或還原資料庫快照集。
您無法附加或卸載資料庫快照集。
您無法在 FAT32 檔案系統或 RAW 磁碟分區上建立資料庫快照集。 NTFS 檔案系統會提供資料庫快照所使用的稀疏文件。
資料庫快照集不支援全文索引。 全文目錄不會從來源資料庫傳播。
資料庫快照集在建立快照集時,會繼承其來源資料庫的安全性限制。 因為快照是唯讀的,因此無法變更繼承權限,且對原始檔案所做的權限變更不會反映在現有的快照中。
快照集永遠反映出快照集建立時的檔案群組狀態:線上檔案群組保持線上狀態、離線檔案群組保持離線狀態。 如需詳細資訊,請參閱本文稍後的〈資料庫快照與離線檔案群組〉一節。
如果源資料庫變成 RECOVERY_PENDING,其快照可能會變得無法存取。 不過,在源資料庫的問題解決之後,其快照集應該會再次可供使用。
資料庫中任何 NTFS 唯讀檔或 NTFS 壓縮檔都不支援還原。 嘗試還原包含下列其中一種檔案群組的資料庫失敗。
在記錄傳送組態中,資料庫快照集只能在主資料庫上建立,而不是次要資料庫。 假設您在主要和輔助伺服器實例之間切換角色。 在此情況下,您必須先卸除所有資料庫快照集,才能將主資料庫設定為輔助資料庫。
資料庫快照集無法設定為可調整的共享資料庫。
資料庫快照集不支援 FILESTREAM 檔案群組。 如果源資料庫中有 FILESTREAM 檔案群組,它們就會在其資料庫快照集中標示為離線,而且快照集無法用來還原資料庫。
注意
針對資料庫快照集執行的 SELECT 陳述式不得指定 FILESTREAM 資料行,否則將會傳回下列錯誤訊息: Could not continue scan with NOLOCK due to data movement.
- 如果唯讀快照集上的統計資料遺漏或過時,資料庫引擎會在
tempdb
中建立及維護暫時性統計資料。 如需詳細資訊,請參閱 統計數據。
磁碟空間
資料庫快照集會耗用磁碟空間。 如果資料庫快照集用盡磁碟空間,則會將其標示為可疑且必須卸除。 (然而,源資料庫不會受到影響;其上的動作會正常繼續。
不過,與資料庫的完整複本相比,快照集具有高度空間效率。 快照集所需儲存空間,只要足夠儲存那些在存留時間內會有變更的頁面即可。 一般而言,快照通常只保留有限的時間,因此其大小並不是一個顯著的問題。
不過,您保留快照的時間越長,就越有可能用到可用的空間。 疏鬆檔案可以成長的大小上限是快照集建立時對應的源資料庫檔案大小。 如果資料庫快照集用盡磁碟空間,則必須刪除資料庫快照集(卸除)。
注意
除了檔案空間以外,資料庫快照集耗用的資源數量大致上與資料庫相同。
離線檔案群組
當您嘗試執行下列任一動作時,來源資料庫中的離線檔案群組會影響到資料庫快照集:
建立快照。
- 來源資料庫具有一個或多個離線檔案群組時,快照集會在這些檔案群組離線的狀態下順利建立。 不會為離線檔案群組建立疏鬆檔案。
使檔案群組離線
- 您可以使來源資料庫中的檔案離線。 不過,如果建立快照集時,檔案群組是在線上,則在資料庫快照集中該檔案群組仍保持在線上。 如果在建立快照集之後已變更查詢的數據,則快照集中可存取原始數據頁面。 不過,若想使用查詢從快照集存取檔案群組中的未修改資料,可能會失敗並發生輸入/輸出 (I/O) 錯誤。
使檔案群組上線
- 您無法在任何具有資料庫快照的資料庫中讓檔案群組上線。 如果檔案群組在建立快照集時脫機,或在資料庫快照集存在時脫機,則會保持離線狀態。 這是因為使檔案重新上線涉及到將其還原,如果資料庫上存在資料庫快照,則無法進行。
將來源資料庫還原到快照集
- 將源資料庫還原為資料庫快照時,所有檔案群組必須在線,只有在建立快照時脫機的檔案群組除外。