資料庫快照集如何運作

資料庫快照集可提供快照集建立時的來源資料庫之唯讀、靜態檢視,但不包含未認可的交易。在新建的資料庫快照集內,會回復未認可的交易,因為 Database Engine 會在建立快照集後執行復原 (資料庫中的交易則不受影響)。

資料庫快照集相依於來源資料庫。資料庫的快照集必須與資料庫位於相同的伺服器執行個體上。而且,如果該資料庫因某種原因而變成無法使用,則其所有資料庫快照集也會變成無法使用。

快照集可以用於報表用途。此外,在來源資料庫發生使用者錯誤的情況下,您可以將來源資料庫還原為它在建立快照集時所處於的狀態。您只會失去建立快照集之後的資料庫更新資料。此外,剛好在對資料庫進行重大變更 (如變更結構描述或資料表的結構) 之前建立資料庫快照集可能會很實用。如需快照集使用上的詳細資訊,請參閱<資料庫快照集的一般用法>。

瞭解快照集如何運作雖然對於使用它們並不重要,卻很有幫助。資料庫快照集是在資料頁層級上操作的。在第一次修改來源資料庫的頁面之前,系統就會將從來源資料庫的原始頁面複製到快照集。此處理序稱為「寫入時複製作業」。快照集會儲存原始頁面,保留快照集建立時已存在的資料記錄。對於已修改頁面中記錄的後續更新,則不會影響快照集的內容。第一次進行修改的每一頁,都會重複相同的處理序。如此一來,快照集保留了自從產生快照集以來,所修改過的所有資料記錄的原始頁面。

快照集在儲存所複製的原始頁面時,會使用一或多個「疏鬆檔案」。一開始,疏鬆檔案其實是一個空白檔案,沒有包含使用者資料,也尚未配置磁碟空間來存放使用者資料。隨著來源資料庫中有越來越多頁面更新,檔案大小也跟著成長。在產生快照集時,疏鬆檔案佔用很少的磁碟空間。然而,資料庫在經過一段時間更新後,疏鬆檔案可能會變成極大的檔案。如需疏鬆檔案的詳細資訊,請參閱<了解資料庫快照集內的疏鬆檔案大小>。

下圖說明寫入時複製作業。快照集圖表中的淺灰色矩形,代表疏鬆檔案中迄今尚未配置的可能空間。收到來源資料庫的第一次頁面更新時,Database Engine 會寫入檔案,且作業系統會在快照集的疏鬆檔案中配置空間,並在該處複製原始頁面。接著,Database Engine 會在來源資料庫中更新頁面。下圖說明這樣的寫入時複製作業。

更新頁面之後快照集上的讀取作業

重要事項重要事項

因為資料庫快照集不是多餘儲存體,所以它們不能防止磁碟錯誤或其他類型的損毀。建立定期備份和測試還原計畫對於保護資料庫很重要。如果您必須將來源資料庫還原到您建立資料庫快照集當時的時間點,請實作可讓您執行此作業的備份原則。

資料庫快照集的讀取作業

對於使用者而言,資料庫快照集似乎不會改變,因為資料庫快照集上的讀取作業一定是存取原始資料頁 (不管原始資料頁位於何處)。

如果來源資料庫上的頁面尚未更新,則快照集上的讀取作業會從來源資料庫讀取該原始頁面。下圖顯示新建的快照集上的讀取作業,其疏鬆檔案當然不包含任何頁面。因此,此讀取作業只會從來源資料庫讀取。

將第一頁複製到快照集之前的讀取作業

在更新頁面之後,快照集上的讀取作業仍然會存取原始頁面,只是改為存取現已儲存在疏鬆檔案中的頁面。下圖說明來源資料庫中的頁面已更新後,快照集上讀取作業的存取頁面動作。這次,讀取作業會從快照集的疏鬆檔案中讀取原始頁面。

寫入時複製作業

更新模式對資料庫快照集成長的影響

如果來源資料庫非常大,而且您擔心磁碟空間使用的問題,則應該在適當時候以新的快照集取代舊的快照集。快照集的理想使用期限,視其成長速率及其疏鬆檔案可用的磁碟空間而定。快照集所需的磁碟空間,視來源資料庫在快照集生命期限內更新了多少不同頁面而定。因此,如果更新動作主要限於重複更新一小部分的頁面子集,則其隨時間的成長速率會很緩慢,且快照集的空間需求也相當少。相反地,若所有原始頁面最終至少都會更新一次,快照集就會成長到來源資料庫的大小,如果磁碟開始填滿,快照集會彼此爭用磁碟空間。如果磁碟機已填滿,則所有快照集的寫入作業都會失敗。

[!附註]

如需瞭解快照集實際大小和可能大小的詳細資訊,請參閱<了解資料庫快照集內的疏鬆檔案大小>。

因此,在規劃快照集預定生命期限內需要多少空間時,知道資料庫的典型更新模式會很有幫助。對於某些資料庫,更新速率可能很頻繁;例如,庫存資料庫可能有許多每天更新的頁面,因此每天或每週取代舊快照集便會很有幫助。至於其他的資料庫,更新頁面的比例在企業週期內可能會有變動;例如,目錄資料庫主要是每季更新,其他時間僅做零星的更新;在這種情形下,建立每一季更新前後的快照集,便是合邏輯的策略。更新前的快照集可在發生重大更新錯誤時,用於進行還原,而更新後的快照集則可用於下一季報表的撰寫。

下圖說明兩個相反的更新模式,對於快照集大小的影響。更新模式 A 所反映的環境,在快照集的生命期限內,只有 30% 的原始頁面有更新。更新模式 B 所反映的環境,在快照集的生命期限內,有 80% 的原始頁面有更新。

替代的更新模式和快照集大小

關於資料庫快照集的中繼資料

對於資料庫快照集,資料庫中繼資料包括 source_database_id 屬性,它儲存在 sys.databases 目錄檢視的資料行內。如需有關這個屬性的詳細資訊,請參閱<sys.databases (Transact-SQL)>。

一般而言,資料庫快照集不公開自己的中繼資料,但它會公開其來源資料庫的中繼資料。此中繼資料包括如下列陳述式傳回的資料:

USE <database_snapshot> SELECT * FROM sys.database_files 

其中的 <database_snapshot>database 為資料庫快照集的名稱。

唯一例外的是來源資料庫使用全文檢索搜尋或資料庫鏡像時,因為它們會改變快照集中繼資料的某些值,而在快照集上停用自己。