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)操做。固然,若是該頁已經複製到快照文件中了就不須要再重複複製。
隨着源數據庫中更新的頁愈來愈多,文件的大小也不斷增加。建立快照時,稀疏文件佔用的磁盤空間不多。然而,因爲數據庫隨着時間的推移不斷更新,稀疏文件會增加爲一個很大的文件。下圖展現了修改源數據庫數據時,將複製源數據庫中修改對應的數據頁到數據庫快照中,即寫入時複製操做:
翻譯後:
二,數據庫快照讀操做原理
對於用戶而言,數據庫快照彷佛始終保持不變,由於對數據庫快照的讀操做始終訪問原始數據頁,而與頁駐留的位置無關。當一個查詢從快照中讀取數據時,首先經過比特圖來判斷須要的頁面是否已經在快照文件中或者仍然在源數據庫中。若是未更新源數據庫中的頁,則對快照的讀操做將從源數據庫讀取原始頁。下圖顯示了對新建立的快照(其稀疏文件不包含頁)的讀操做。此讀操做僅從源數據庫讀取:
翻譯後:
更新某頁以後,對快照的讀操做仍訪問原始頁,該原始頁如今存儲在稀疏文件中。下圖說明了對訪問源數據庫中更新頁的快照的讀操做。此讀操做有1個頁面是從快照中讀取的,由於該頁已經被更新過,而另外9個頁面是從源數據庫中讀取的:
翻譯後:
三,建立數據庫快照
建立數據庫快照以前,考慮如何命名它們是很是重要的。每一個數據庫快照都須要一個惟一的數據庫名稱。爲了便於管理,數據庫快照的名稱能夠包含標識數據庫的信息,例如:
l  源數據庫的名稱。
l  該新名稱用於快照的指示信息。
l  快照的建立日期和時間、序列號或一些其餘的信息(例如一天中的某個時間)以區分給定的數據庫上的連續快照。
 
本節實驗使用的數據庫以下:
create database DemoDB2008
go
use DemoDB2008
go
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( '人事部', '負責人事等')
insert into Departments(departmentName,departmentRemark)
values( '市場部', '負責銷售等')
insert into Departments(departmentName,departmentRemark)
values( '研發部', '負責產品研發等')
insert into Departments(departmentName,departmentRemark)
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')
insert into Employees(DepartmentID,EmployeeName,Gender,BirthDate,HireDate,Extension,Mobile)
values(1, 'Jack', '男', '1982-11-12', '2005-3-5', '866', '13855663278')
insert into Employees(DepartmentID,EmployeeName,Gender,BirthDate,HireDate,Extension,Mobile)
values(2, 'Ailce', '女', '1985-6-9', '2006-10-5', '851', '13667231659')
insert into Employees(DepartmentID,EmployeeName,Gender,BirthDate,HireDate,Extension,Mobile)
values(2, 'Jerry', '男', '1982-10-25', '2003-10-5', '868', '13866882535')
insert into Employees(DepartmentID,EmployeeName,Gender,BirthDate,HireDate,Extension,Mobile)
values(2, 'Lucy', '女', '1984-8-26', '2004-9-1', '867', '13561866125')
 
針對DemoDB2008數據庫建立2個數據庫快照,代碼以下:
--建立數據庫快照
use master
go
create database DemoDB2008_Snapshot_201011091430 --數據庫快照名
on
(
   name= 'DemoDB2008', --數據庫文件邏輯名稱
   filename= 'c:\sql2008trainning\BackupDB\DemoDB2008.snapshot_201011091430' --快照稀疏文件的物理路徑
)    
as snapshot of DemoDB2008
go

use master
go
create database DemoDB2008_Snapshot_201011092030 --數據庫快照名
on
(
   name= 'DemoDB2008', --數據庫文件邏輯名稱
   filename= 'c:\sql2008trainning\BackupDB\DemoDB2008.snapshot_201011092030' --快照稀疏文件的物理路徑
)    
as snapshot of DemoDB2008
go
建立以後能夠從SSMS查看剛剛建立的快照,以下圖:
四,使用數據庫快照
當不小執行了一個操做,能夠經過快照來還原數據庫,當一個數據庫存在多個數據庫快照時,是不能還原其中的任何一個數據庫快照的,必需要把除了要恢復的快照保留外其餘快照所有刪除,而後才能從快照中恢復數據庫。
--刪除數據
use DemoDB2008
go
delete from dbo.Employees
go
select COUNT(*) from dbo.Employees
go

--從快照中還原數據庫
use master
go
restore database DemoDB2008     --從快照中還原數據庫
from database_snapshot    = 'DemoDB2008_Snapshot_201011091430'
go

--必需要刪除其餘的數據庫快照才能恢復你想要恢復的數據庫快照
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  數據庫快照不支持全文索引,全文目錄不會從源數據庫傳播到快照中。
相關文章
相關標籤/搜索