資料庫快照集(Snapshot)
- 資料庫快照集是來源資料庫的一個靜態檢視,並且唯讀。
- 必需與來源資料庫位在同一個SQL執行個體。
- Snapshot 會與來源資料庫維持交易的一致性。
- 當來源資料庫更新時,Snapshot 也會更新。
- 一個來源資料庫可以建立多個 Snapshot 。
概念
若對資料庫建立 Snapshot , Snapshot 就相當於該資料庫的複本。 但是當建立 Snapshot 時,它只是一個空白檔案,沒有任何資料。 若來源資料庫的某個資料頁發生第一次修改,這個資料頁才會被複製到 Snapshot ,檔案大小也才會跟著成長。 Snapshot 的運作都是以資料頁為單位,若來源資料庫的資料頁,都沒任何異動,就不會被複製到 Snapshot 。 若有資料頁第一次被異動,才會將其原始資料複製到 Snapshot 。
這樣的機制有幾個特殊的優點,例如:
例如,你可以在每個月最後一天結束時,建立一個快照集,之後再對快照集執行期末報表,你就可以取得不同的歷程資料。
另外,像財務部門常常要進行月結作業,她們可能必須統計大量的資料,在統計過程中,可能會回存或修改部份的資料。 可是若最後財務部門最後發覺資料統計有誤,就必須復原重算,這時候用 Snapshot 就是最好的方法。 因為 Snapshot 保有被更改過的資料頁的原始資料,所以復原就只會復原這些資料頁。
如何建立資料庫快照集
下面範例示範,如何建立資料庫快照集,同時如何
建立資料庫快照集
--NAME:SQL Server 中所使用的邏輯名稱 --FILENAME:路徑和檔案名稱 CREATE DATABASE TestDB1_snapshot ON ( NAME = TestDB1, FILENAME ='D:\Database\testdb\TestDB1.mdf' ) AS SNAPSHOT OF TestDB1;
PS.安全性
- 能夠建立資料庫的任何使用者都可以建立資料庫快照集
- 不過若要建立鏡像資料庫的快照集,您必須是 sysadmin 固定伺服器角色的成員。
將資料庫還原成資料庫快照集
在建立資料庫快照集之後,若原始資料庫經由不當操作,造成資料遺失,此時你可以用以下方法還原
1.若某資料表整個被刪除了,你可以直接將資料由 snapshot 複製回來即可
insert Products([ProductID], [ProductName], [Color], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) select * from TestDb1_snapshot.dbo.Products --以下用法為: --若資料表有 identity 欄位,若想在 insert 資料時,對該 identity 欄位指定特定的值, --就必須啟用 IDENTITY_INSERT 屬性,且 insert 後面必須明確指定欄位名稱 SET IDENTITY_INSERT Products ON insert Products([ProductID], [ProductName], [Color], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) select * from TestDb1_snapshot.dbo.Products SET IDENTITY_INSERT Products OFF
2.直接使用 Restore Database 指定
use master RESTORE DATABASE TestDB1 FROM DATABASE_SNAPSHOT = 'TestDB1_snapshot'
檢視與刪除資料庫快照集
檢視資料庫快照集
若要查詢資料庫的快照集,可以查詢 sys.databases 這個系統檢視表,如果 source_database_id 欄位不是 NULL 則為資料庫快照集。
刪除資料庫快照集
對一個已建立 snapshot 的資料庫是不允許被刪除的,所以若要刪除一個含有 snapshot 的資料庫,就必須先刪除該資料庫的 snapshot 。 你可以利用上面檢視資料庫快照集的方法找到 snapshot ,再透過 drop database 指令刪除即可。
drop database TestDB1_snapshot
沒有留言:
張貼留言