天天看點

SQL Server 2008資料庫快照技術(八)

資料庫快照是資料庫(源資料庫)的隻讀、靜态視圖, 是 自SQL  Server 2005 中新增的功能。資料庫快照提供了快速、簡潔的一種資料庫另類備份操作。多個快照可以位于一個源資料庫中,并且可以作為資料庫始終駐留在同一伺服器執行個體上。建立快照時,每個資料庫快照在事務上與源資料庫一緻。在被資料庫所有者顯式删除之前,快照始終存在。

快照可用于報表。另外,如果源資料庫出現使用者錯誤,還可将源資料庫恢複到建立快照時的狀态。丢失的資料僅限于建立快照後資料庫更新的資料。

本節内容:

l  資料庫快照原理

l  快照讀操作原理

l  建立資料庫快照

l  使用資料庫快照

l  資料庫快照的限制

一,資料庫快照原理

資料庫快照在資料頁級運作。在第一次修改源資料庫頁之前,先将原始頁從源資料庫複制到快照。此過程稱為“寫入時複制操作”(即copy-on-write)。快照将存儲原始頁,保留它們在建立快照時的資料記錄。對已修改頁中的記錄進行後續更新不會影響快照的内容。對要進行第一次修改的每一頁重複此過程。這樣,快照将保留自建立快照後經修改的所有資料記錄的原始頁。

SQL Server 2005/2008中使用了一種叫做“稀疏檔案”的檔案來存儲複制的原始頁。最初,稀疏檔案實質上是空檔案,不包含使用者資料并且未被配置設定存儲使用者資料的磁盤空間。對于每一個快照檔案,SQL Server 2005/2008建立了一個儲存在高速緩存中的比特圖,資料庫檔案的每一個頁面對應一個比特位,表示該頁是否已經被複制到快照中。當源資料庫發生改變時,SQL Server 2005/2008會檢視比特圖來檢查該頁是否已經被複制,如果沒有被複制,那麼馬上将其複制到快照中,然後再更新源資料庫,這種操作叫寫入時複制(copy-on-write)操作。當然,如果該頁已經複制到快照檔案中了就不需要再重複複制。

随着源資料庫中更新的頁越來越多,檔案的大小也不斷增長。建立快照時,稀疏檔案占用的磁盤空間很少。然而,由于資料庫随着時間的推移不斷更新,稀疏檔案會增長為一個很大的檔案。下圖展示了修改源資料庫資料時,将複制源資料庫中修改對應的資料頁到資料庫快照中,即寫入時複制操作:

SQL Server 2008資料庫快照技術(八)

翻譯後:

SQL Server 2008資料庫快照技術(八)

二,資料庫快照讀操作原理

對于使用者而言,資料庫快照似乎始終保持不變,因為對資料庫快照的讀操作始終通路原始資料頁,而與頁駐留的位置無關。當一個查詢從快照中讀取資料時,首先通過比特圖來判斷需要的頁面是否已經在快照檔案中或者仍然在源資料庫中。如果未更新源資料庫中的頁,則對快照的讀操作将從源資料庫讀取原始頁。下圖顯示了對新建立的快照(其稀疏檔案不包含頁)的讀操作。此讀操作僅從源資料庫讀取:

SQL Server 2008資料庫快照技術(八)
SQL Server 2008資料庫快照技術(八)

更新某頁之後,對快照的讀操作仍通路原始頁,該原始頁現在存儲在稀疏檔案中。下圖說明了對通路源資料庫中更新頁的快照的讀操作。此讀操作有1個頁面是從快照中讀取的,因為該頁已經被更新過,而另外9個頁面是從源資料庫中讀取的:

SQL Server 2008資料庫快照技術(八)
SQL Server 2008資料庫快照技術(八)

三,建立資料庫快照

建立資料庫快照之前,考慮如何命名它們是非常重要的。每個資料庫快照都需要一個唯一的資料庫名稱。為了便于管理,資料庫快照的名稱可以包含辨別資料庫的資訊,例如:

l  源資料庫的名稱。

l  該新名稱用于快照的訓示資訊。

l  快照的建立日期和時間、序列号或一些其他的資訊(例如一天中的某個時間)以區分給定的資料庫上的連續快照。

本節實驗使用的資料庫如下:

create database DemoDB2008

go

use DemoDB2008

create table Departments

(

  departmentID int identity(1,1) primary key,

  departmentName varchar(50) unique not null,

  departmentRemark varchar(200) null

)

insert into Departments(departmentName,departmentRemark)

values('人事部','負責人事等')

values('市場部','負責銷售等')

values('研發部','負責産品研發等')

values('開發部','負責軟體開發,外包,教育訓練等')

--select * from Departments

create table Employees

  EmployeeID int identity(1,1) primary key,

  DepartmentID int foreign key references Departments(departmentID),

  EmployeeName varchar(50) not null,

  Gender varchar(4) null,

  BirthDate datetime null,

  HireDate datetime null,

  Extension varchar(30) null,

  Mobile varchar(30) null,

  EMail varchar(50) null,

  Address varchar(200) null

--select * from Employees

insert into Employees(DepartmentID,EmployeeName,Gender,BirthDate,HireDate,Extension,Mobile)

values(1,'Tom','男','1983-1-5','2005-3-5','865','13918182356')

values(1,'Jack','男','1982-11-12','2005-3-5','866','13855663278')

values(2,'Ailce','女','1985-6-9','2006-10-5','851','13667231659')

values(2,'Jerry','男','1982-10-25','2003-10-5','868','13866882535')

values(2,'Lucy','女','1984-8-26','2004-9-1','867','13561866125')

針對DemoDB2008資料庫建立2個資料庫快照,代碼如下:

--建立資料庫快照

use master

create database DemoDB2008_Snapshot_201011091430 --資料庫快照名

on

  name='DemoDB2008', --資料庫檔案邏輯名稱

  filename='c:\sql2008trainning\BackupDB\DemoDB2008.snapshot_201011091430'--快照稀疏檔案的實體路徑

)    

as snapshot of DemoDB2008

create database DemoDB2008_Snapshot_201011092030 --資料庫快照名

  filename='c:\sql2008trainning\BackupDB\DemoDB2008.snapshot_201011092030'--快照稀疏檔案的實體路徑

go

建立之後可以從SSMS檢視剛剛建立的快照,如下圖:

SQL Server 2008資料庫快照技術(八)

四,使用資料庫快照

當不小執行了一個操作,可以通過快照來還原資料庫,當一個資料庫存在多個資料庫快照時,是不能還原其中的任何一個資料庫快照的,必須要把除了要恢複的快照保留外其他快照全部删除,然後才能從快照中恢複資料庫。

--删除資料

delete from dbo.Employees

select COUNT(*) from dbo.Employees

--從快照中還原資料庫

restore database DemoDB2008    --從快照中還原資料庫

from database_snapshot    = 'DemoDB2008_Snapshot_201011091430'

--必須要删除其他的資料庫快照才能恢複你想要恢複的資料庫快照

drop database DemoDB2008_Snapshot_201011092030

五,資料庫快照的限制:

隻要存在資料庫快照,快照的源資料庫就存在以下限制:

l  不能對資料庫進行删除、分離或還原。有關如何删除快照的資訊,

l  源資料庫的性能受到影響。由于每次更新頁時都會對快照執行“寫入時複制”操作,導緻源資料庫上的 I/O 增加。

l  不能從源資料庫或任何快照中删除檔案。

l  源資料庫必須處于聯機狀态,除非該資料庫在資料庫鏡像會話中是鏡像資料庫。

l  不能将源資料庫配置為可縮放共享資料庫。

l  若要在鏡像資料庫中建立資料庫快照,資料庫必須處于同步鏡像狀态。

資料庫快照存在以下限制:

l  資料庫快照必須與源資料庫在相同的伺服器執行個體上建立和保留。

l  快照為隻讀。

l  禁止對

model

資料庫、

master

資料庫和

tempdb

資料庫建立快照。

l  不能從資料庫快照中删除檔案。

l  不能備份或還原資料庫快照。

l  不能附加或分離資料庫快照。

l  不能在 FAT32 檔案系統上建立資料庫快照。資料庫快照所用的稀疏檔案由 NTFS 檔案系統提供。

l  資料庫快照不支援全文索引,全文目錄不會從源資料庫傳播到快照中。