基本上,資料庫快照集能夠讓你建立一個你的資料庫的靜態唯讀拷貝來從事其它的用途,例如報告,審計或者恢複資料。
它是怎麼樣工作的
資料庫快照集為你現有的資料庫建立了一個資料庫的殼,然後無論何時當資料頁被修改的時候,改變也同時被寫入疏鬆檔案(sparse file)當中。當人們擷取資料的時候,資料中沒有變化的部分是從未經處理資料庫中得到的,而改變的部分則是從疏鬆檔案中獲得。
為了清楚的表達這個意思,請看下面的圖片。從下面的圖片可以看出,有百分之九十的資料是沒有被修改過的,所以當查詢發生時,有九成的資料是從原始的資料庫中得到的。而餘下的百分之十的改變資料則是從疏鬆檔案中獲得的。
Source: SQL Server 2005 Books Online
疏鬆檔案和資料庫快照集
當資料庫快照集被建立的時候,第一次的建立是十分迅速的。因為實際上只是建立了一個用來記錄被修改檔案的殼。隨著時間的推移,檔案不斷的被修改,這些修改頁都將被寫進疏鬆檔案。你的主要資料庫中修改的檔案越多,就有越多的檔案被寫入疏鬆檔案。因此,有越來越多的磁碟空間被用來儲存你的主要資料庫和快照的資料庫,也增加了你伺服器的磁碟輸入輸出的次數。
疏鬆檔案被寫入大小為64KB的分組塊當中。每一個分組塊增量能包含8個大小為8KB的資料頁。所以,每次在你的主要資料庫中有任何的資料改變,都會先把資料頁拷貝到疏鬆檔案當中,然後再將主要資料庫中檔案的變化寫入疏鬆檔案。一旦資料頁被寫入疏鬆檔案,他們就不再需要被寫出來。因為頁面的全部內容被保護起來,讓其處於當快照建立時的狀態。
為了實現最佳化磁碟並消除磁碟衝突,在主要資料庫以外的獨立的磁碟機和陣列中建立疏鬆檔案是一個明知之舉。原因有二:
其一,當快照被建立的時候,沒有資料被寫入疏鬆檔案。從快照進行的所有的資料訪問實際上都是在主要資料庫檔案當中的。隨著時間的推移,你會通過在不同的陣列和磁碟上從主檔案資料庫讀取未被修改過的檔案和從疏鬆檔案讀取修改過的資料的方法來減少輸入輸出的負擔。
其二,根據你資料庫資料的易變動性和資料變化的數量,你可以通過將在主要資料庫的讀取工作和疏鬆檔案的寫入工作分離來減少輸入輸出的瓶頸大小。
使用資料庫快照集
在這裡你一定要記住的事情就是,你的查詢請求訪問的依然是你的主要資料庫。當初始的快照被建立的時候,其實僅建立了一個空的殼子。所有的資料請求都是在主要資料庫檔案中被完成的。隨著時間的流逝和檔案不斷地被修改,就有一些資料請求從初始的資料庫檔案中分離出來指向了疏鬆檔案。所以,儘管看上去它是一個獨立的資料庫,那些根本的資料仍然是源於主要資料庫。
鑒於此,你需要確定不要試圖去進行你日常活動範圍以外的查詢。這樣說吧,你建立了一個快照,接著你進行了讀寫的操作,並對每個人做了記錄。當那些記錄被執行查詢操作時,他們仍然繼續影響著主要資料庫。所以你要保證任何新的活動都不會影響主要資料的活動。
另外,你需要記住到底有哪些資料是被寫入疏鬆檔案裡的,而不是認為所有可能的資料都被寫進了疏鬆檔案。基本上,當快照被創立時,主要資料庫的大小就是快照疏鬆檔案的潛在大小。如果疏鬆檔案中的資料量已經達到甚至超過資料庫的一半時,也許再創造一個資料庫的完整拷貝來取代現有的快照是一個更好的主意。
綜上所述,我認為,資料庫快照集是一個非常新的功能。我也希望在SQL Server2005的所有版本,而不僅僅在企業版和開發版中可以應用這個功能。有一個沒有討論的地方就是我們沒有討論有關對資料庫鏡像使用快照。其實,無論是鏡像還是原資料庫,快照都給了你最好的方法。因為鏡像是離線的,你並不能訪問那些資料,所以說無論是鏡像還是原資料庫,它都給了你最好的方法。花一些時間去理解快照是如何應用於你的環境中的,並且確認你監視著維護快照的影響以及通過快照進行的資料存放區。