使用SQL Server 2005数据库快照

数据库快照是MSSQL2005的新功能,仅在 Microsoft SQL Server 2005 Enterprise Edition 中可用。而且SQL Server Management Studio 不支持创建数据库快照,创建快照的唯一方式是使用 Transact-SQL。

数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开的事务会回滚以使数据库快照在事务上取得一致。

客户端可以查询数据库快照,这对于基于创建快照时的数据编写报表是很有用的。而且,如果以后源数据库损坏了,便可以将源数据库恢复到它在创建快照时的状态。


创建数据库快照可以:

·维护历史数据以生成报表。可以通过快照访问特定时间点的数据。例如,您可以在给定时间段(例如,财务季度)要结束的时候创建数据库快照以便日后制作报表。然后便可以在快照上运行期间要结束时创建的报表。

·将查询实施在数据库的快照上,可以释放主体数据库上的资源。

·加快恢复操作效率,使用快照将数据库恢复到生成快照时的状态比从备份还原快得多;但是,此后您无法对数据进行前滚操作。根据磁盘资源,可以每 24 小时创建 6 到 12 个滚动快照 。每创建一个新的快照,就删除最早的快照。如果要恢复,可以将数据库恢复到在错误发生的前一时刻的快照。或者,也可以利用快照中的信息,手动重新创建删除的表或其他丢失的数据。例如,可以将快照中的数据大容量复制到数据库中,然后手动将数据合并回数据库中。

·但是只要存在数据库快照,快照的源数据库就存在以下限制:
·必须在与源数据库相同的服务器实例上创建数据库快照。

·数据库快照捕获开始创建快照的时间点,去掉所有未提交的事务。未提交的事务将在创建数据库快照期间回滚,因为数据库引擎 将对快照执行恢复操作(数据库中的事务不受影响)。

·当将源数据库中更新的页强制压入快照时,如果快照用尽磁盘空间或者遇到某些错误,则该快照将成为可疑快照并且必须将其删除。有关详细信息,请参阅删除数据库快照。

·快照为只读。

·禁止对 model 数据库、master 数据库和 tempdb 数据库创建快照。

·不能更改数据库快照文件的任何规范。

·不能从快照中删除文件。

·不能备份或还原快照。

·不能附加或分离快照。

·不能在 FAT32 文件系统或 RAW 分区中创建快照。

·数据库快照不支持全文索引,不能从源数据库传播全文目录。

·数据库快照将继承快照创建时其源数据库的安全约束。由于快照是只读的,因此无法更改继承的权限,对源数据库的更改权限将不反映在现有快照中。

·快照始终反映创建该快照时的文件组状态:在线文件组将保持在线状态,离线文件组将保持离线状态。有关详细信息,请参阅本主题后面的“含有离线文件组的数据库快照”。

·如果源数据库的状态为 RECOVERY_PENDING,可能无法访问其数据库快照。但是,当解决了源数据库的问题之后,快照将再次变成可用快照。

·只读文件组和压缩文件组不支持恢复。尝试恢复到这两类文件组将失败。有关恢复的详细信息,请参阅恢复到数据库快照。
 

使用SQL Server 2005数据库快照 Demo

-------------------------------------------创建数据库DemoDB
create database DemoDB
on primary
(name='DemoDB_data',filename='c:\SQLData\DemoDB_data.mdf',size=5MB,maxsize=10MB)
log on
(name='DemoDB_log',filename='c:\SQLData\Demodb_log.ldf',size=2MB,maxsize=10MB)
go
--------------------------------------------在DemoDB创建数据表T1和T2
use DemoDB
create table T1(id int,name char(8),address char(13))
go
create table T2(id int,name char(8),address char(13))
go
--------------------------------------------在DemoDB数据库的T1和T2插入数据
use DemoDB
Insert into T1 values(1,'jacky','suzhou')
Insert into T1 values(2,'Hellen','shanghai')
Insert into T2 values(1,'Tom','beijing')
Insert into T2 values(2,'Alice','hangzhou')
go
--------------------------------------------为DemoDB数据库创建数据库快照DemoDB_dbsnapshot_200510201600
create database DemoDB_dbsnapshot_200510201600
on
(name='DemoDB_data',filename='c:\SQLsnapshot\DemoDB_dbsnapshot_200510201600.mdf')
as snapshot of DemoDB
go
---------------------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB_dbsnapshot_200510201600
select * from dbo.T1
select * from dbo.T2
go
use DemoDB
select * from dbo.T1
select * from dbo.T2
go
--------------------------------------------------
use DemoDB
update T1
set name='Tony' where id=1   --在DemoDB中更新数据
go
delete from T1 where id=2    --在DemoDB中删除数据
go
drop Table T2     --删除T2表
go
--------------------------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB_dbsnapshot_200510201600
select * from T1
select * from T2
go
use DemoDB
select * from T1
select * from T2
go
-------------------------------------------------使用数据库快照还原在DemoDB数据库的T1表误删除和更新的数据
update DemoDB.dbo.T1
set name=(select name from DemoDB_dbsnapshot_200510201600.dbo.T1 where id=1) where name=1
go
insert into DemoDB.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1 where id=2
go
-----------------------------------------------------------使用数据库快照还原在DemoDB数据库误删除的T2表
use DemoDB
--复制进剪贴板中的创建T2的语句
go
insert into DemoDB.dbo.T2 select * from DemoDB_dbsnapshot_200510201600.dbo.T2
go
-----------------------------------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB
select * from T1
select * from T2
go
use DemoDB_dbsnapshot_200510201600
select * from T1
select * from T2
go
-----------------------------------------------------------
注:如果需要周期创建快照,可以创建作业
-----------------------------------------------------------在DemoDB中更新数据
use DemoDB
update T1 set name='Funny' where id=1
go
-----------------------------------------------------------数据库快照和数据库中查询T1和T2表
select * from Demodb.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1
select * from DemoDB_dbsnapshot_200510201620.dbo.T1
-----------------------------------------------------------在DemoDB中更新数据
use DemoDB
update T1 set name='Bob' where id=1
go
-----------------------------------------------------------数据库快照和数据库中查询T1和T2表
select * from Demodb.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1
select * from DemoDB_dbsnapshot_200510201620.dbo.T1

----------------------------------------------------------------------------------------------------------------------------------------

/*使用数据库快照还原整个数据库*/
-------------------------------------------删除第一次数据库快照
drop database  DemoDB_dbsnapshot_200510201600F
-------------------------------------------使用数据库快照恢复DemoDB数据库
restore Database DemoDB from Database_snapshot='DemoDB_dbsnapshot_200510201620'
-------------------------------------------
select * from DemoDB.dbo.T1
select * from DemoDB_dbsnapshot_200510201620.dbo.T1
-------------------------------------------
drop database DemoDB_dbsnapshot_200510201620   --删除数据库快照
drop Database DemoDB         --删除数据库
From: http://itecn.net/blogs/kenny/archive/2005/10/21/1003.aspx

http://www.cnblogs.com/yukaizhao/archive/2008/11/14/snapshot_sql.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2