資料庫快照是唯讀、靜態的資料庫檢視,捕捉建立那一刻的資料狀態。它不複製完整資料,而是透過稀疏檔案技術,僅儲存建立快照後被修改的原始資料頁。
此機制確保快照永遠反映建立時刻的資料狀態。
CREATE DATABASE SourceDatabase_Snapshot_20240115
ON (
NAME = SourceDatabase_Data,
FILENAME = 'C:\SQLServer\SourceDatabase_Data_Snapshot.ss'
)
AS SNAPSHOT OF SourceDatabase;
.ss,但非強制。長時間執行的報表查詢導向快照,避免鎖定衝突與阻塞線上交易。
-- 從快照還原單一資料表
INSERT INTO SourceDatabase.dbo.Orders
SELECT * FROM SourceDatabase_Snapshot_20240115.dbo.Orders
WHERE OrderID IN (SELECT OrderID FROM DeletedOrdersLog);
定時建立每日快照,保留 30 天,滿足合規查詢需求,不佔用主資料庫空間。
USE master;
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'SourceDatabase')
DROP DATABASE SourceDatabase;
GO
CREATE DATABASE SourceDatabase
ON PRIMARY (
NAME = SourceDatabase_Data,
FILENAME = 'C:\SQLServer\SourceDatabase_Data.mdf',
SIZE = 10MB, MAXSIZE = 100MB, FILEGROWTH = 5MB
)
LOG ON (
NAME = SourceDatabase_Log,
FILENAME = 'C:\SQLServer\SourceDatabase_Log.ldf',
SIZE = 5MB, MAXSIZE = 50MB, FILEGROWTH = 5MB
);
GO
-- 建立測試資料
USE SourceDatabase;
CREATE TABLE SalesHistory (
SaleID INT IDENTITY PRIMARY KEY,
ProductName CHAR(150), -- 故意加大列寬,明顯觀察檔案成長
SaleDate DATETIME DEFAULT GETDATE(),
Amount MONEY
);
INSERT INTO SalesHistory (ProductName, Amount)
VALUES ('Product A', 100.00), ('Product B', 200.00);
GO
-- 建立快照
CREATE DATABASE SourceDatabase_Snap_01
ON (NAME = SourceDatabase_Data, FILENAME = 'C:\SQLServer\SourceDatabase_Data_Snap01.ss')
AS SNAPSHOT OF SourceDatabase;
GO
-- 修改來源資料
UPDATE SalesHistory SET Amount = 150.00 WHERE SaleID = 1;
-- 此時稀疏檔會寫入 SaleID=1 的原始頁
-- 查詢快照(仍見 100.00)
SELECT * FROM SourceDatabase_Snap_01.dbo.SalesHistory WHERE SaleID = 1;
-- 查詢來源(見 150.00)
SELECT * FROM SourceDatabase.dbo.SalesHistory WHERE SaleID = 1;
OFFLINE 或 SINGLE_USER,快照將失效。