数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。 自创建快照那刻起,数据库快照在事务上与源数据库一致。 数据库快照始终与其源数据库位于同一服务器实例上。 当源数据库更新时,数据库快照也将更新。 因此,数据库快照存在的时间越长,就越有可能用完其可用磁盘空间。
给定源数据库中可以存在多个快照。 在数据库所有者显式删除每个数据库快照之前,该快照将一直保留。
数据库快照在数据页级运行。 在第一次修改源数据库页之前,先将原始页从源数据库复制到快照。 快照将存储原始页,保留它们在创建快照时的数据记录。 对要进行第一次修改的每一页重复此过程。 对于用户而言,数据库快照似乎始终保持不变,因为对数据库快照的读操作始终访问原始数据页,而与页驻留的位置无关。
为了存储复制的原始页,快照使用一个或多个“稀疏文件”。 最初,稀疏文件实质上是空文件,不包含用户数据并且未被分配存储用户数据的磁盘空间。 随着源数据库中更新的页越来越多,文件的大小也不断增长。 下图说明了两种相对的更新模式对快照大小的影响。 更新模式 A 反映的是在快照使用期限内仅有 30% 的原始页更新的环境。 更新模式 B 反映的是在快照使用期限内有 80% 的原始页更新的环境。
更多详细信息参考:http://msdn.microsoft.com/zh-cn/library/ms175158.aspx
=============================================================
数据库快照 (database snapshot)
一个数据库(源数据库)的事务一致的只读静态视图。
源数据库 (source database)
对于数据库快照,指的是在其上创建快照的数据库。 数据库快照与源数据库相关。 数据库快照必须与数据库在同一服务器实例上。 此外,如果数据库因某种原因而不可用,则它的所有数据库快照也将不可用。
稀疏文件 (sparse file)
NTFS 文件系统提供的文件,需要的磁盘空间要比其他文件格式少很多。 稀疏文件用于存储复制到数据库快照的页面。 首次创建稀疏文件时,稀疏文件占用的磁盘空间非常少。 随着数据写入数据库快照,NTFS 会将磁盘空间逐渐分配给相应的稀疏文件。
=============================================================
注意事项
无法对脱机或损坏的数据库进行恢复。 因此,为了保护数据库,非常有必要定期执行备份并测试还原计划。
数据库快照与源数据库相关。 因此,使用数据库快照还原数据库不能代替备份和还原策略。 严格按计划执行备份仍然至关重要。 如果必须将源数据库还原到创建数据库快照的时间点,请实施允许您执行该操作的备份策略。
使用数据库快照的原因,决定了数据库需要多少个并发快照、多久创建一次新快照以及将其保留多久。 所有恢复模式都支持数据库快照。
可以备份源数据库,这方面将不受数据库快照的影响。
通常情况下,快照只会保留一段有限的时间,因此其大小不是主要问题。 但是,保留快照的时间越长,越有可能将可用空间用完。 稀疏文件最大只能增长到创建快照时相应的源数据库文件的大小。
除文件空间外,数据库快照与数据库占用的资源量大致相同。
数据库快照不支持 FILESTREAM 文件组。
禁止对 model 数据库、master 数据库和 tempdb 数据库创建快照。
快照为只读。
不能从源数据库或任何快照中删除文件。
源数据库的性能受到影响。由于每次更新页时都会对快照执行“写入时复制”操作,导致源数据库上的 I/O 增加。
不能对源数据库进行删除、分离或还原。
============================================================
创建数据库快照
最佳做法:限制数据库快照的数量
随着时间的变化创建一系列快照可捕获源数据库的连续快照。 每个数据库快照会一直保存在系统中,直到被显式删除。 因为每个快照会随着原始页的更新而不断增长,所以您可能想在创建新快照后通过删除旧的快照来节省空间。
创建数据库快照的语法如下
CREATE DATABASE database_snapshot_name
ON
(
NAME = logical_file_name,
FILENAME = 'os_file_name'
) [ ,...n]
AS SNAPSHOT OF source_database_name
[;]
其中,source_database_name 是源数据库,logical_file_name 是引用该文件时在 SQL Server 中使用的逻辑名称,os_file_name 是创建该文件时操作系统使用的路径和文件名,database_snapshot_name 是要将数据库恢复到的快照的名称。
在做数据库快照之前,我们应该先查看一下有多少个数据文件,从而指定不同数量的快照文件,如图。我这里只有一个数据文件,name = db01
然后执行下面的语句来创建db01数据库的快照,如图。
db01_data_1100是快照数据库的名称
name = db01表示要为db01这个数据文件创建快照
filename是快照数据库存放数据的稀疏文件,后面的ss后缀是随便起的
创建完成后,如下图所示。
==============================================================
从快照数据库中恢复
可以在做大量数据库操作之前先做一个快照,以便于在误删除数据的时候,可以使用快照来恢复。
==============================================================
删除数据库快照
删除数据库快照的方式和删除普通数据库没有什么区别。
===============================================================
其实从表面上看,快照数据库和普通数据库没什么区别,唯一不同的是快照数据库采用的是稀疏文件,存放数据库创建快照以后所变化的数据,所以实际上快照数据库占用的空间比较少,原理可参考文章前面的图片。
下图的命令用来显示特定数据库的ID号,下图查找出db01的ID号为7,快照数据库db01_data_1100的ID号为9.
通过下图的命令可以看到快照数据库和对应的用户数据库在大小上都是640,但是实际上快照数据库占用的空间要少得多。
通过下图可以看到快照数据库大小5M,实际占用为128KB。
================================================================