資料庫快照集是怎樣工作的?
可以使用典型的資料庫命令CREATE DATABASE語句來產生一個資料庫快照集,在聲明中有一個來源資料庫快照的附加說明。當快照被建立時,同時產生一個疏鬆檔案。這個檔案(只能使用在NTFS卷中)在初始化的時候並沒有磁碟空間分配給它——儘管你可能在WINDOWS資源管理員中看到了檔案的大小,它會看上去與原始的來源資料庫檔案的大小相同。對磁碟來說其實這個檔案的大小接近於零。
資料庫快照集在初始化時讀的資料檔案是來自於來源資料庫的。當來源資料庫的資料發生變化時,資料引擎就會將未經處理資料從來源資料庫拷貝到快照資料庫中。這個技術確保快照資料庫只反映快照被執行時資料的狀態。當SELECT命令被用來發布反對資料庫快照集時,不管資料頁的讀取是否被定位在來源資料庫資料檔案中還是在快照資料庫資料檔案中都是沒有鎖被發布的。因為在唯讀資料庫快照集中是沒有鎖被發布,資料庫快照集對於報表解決方案是一個重要的解決方案。
一個快照的執行個體
現在,讓我們來看看資料庫快照集在SQL Server 2005中是如何工作的。為此,首先我需要一個來源資料庫作為快照的來源。下面的指令碼將建立一個來源資料庫:
USE master
GO
IF EXISTS(SELECT name from
sysdatabases where [name] = 'SourceDatabase')
DROP DATABASE SourceDatabase
GO
CREATE DATABASE SourceDatabaseON PRIMARY
(
NAME = SourceDatabase_Data,
FILENAME = 'C:SQLServerSourceDatabase_Data.mdf'
) LOG ON
(
NAME = SourceDatabase_Log,
FILENAME = 'C:SQLServerSourceDatabase_Log.ldf'
)
GO
注意這裡產品地區的大小。我定義它的大小為CHAR(150)來強調資料檔案的增長級數,這樣在我接下來的執行個體中將更容易解釋清楚快照是如何工作的。
現在既然我已經有了一個來源資料庫,現在我裝載一些資料來擴充資料檔案的大小位。如此,使用上面的指令碼來建立銷售曆史表。
USE SourceDatabase
GO
IF OBJECT_ID('SalesHistory')>0 DROP
TABLE SalesHistory
GO
CREATE TABLE SalesHistory
(SaleID INT IDENTITY(1,1),
Product CHAR(150), SaleDate DATETIME,
SalePrice MONEY)
DECLARE @i INT
SET @i = 1
WHILE (@i <=10000)
BEGIN INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES ('Computer', DATEADD(mm, @i, '3/11/1919'),
DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES ('BigScreen', DATEADD(mm, @i, '3/11/1927'),
DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES ('PoolTable', DATEADD(mm, @i, '3/11/1908'),
DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1
END
GO