详解 SQL Server 中数据库快照工作原理
在 SQL Server 2005 中,它的另外一个强大的新特点是数据库快照。数据库快照是
一个数据库的只读副本,它是数据库所有数据的映射,由快照被执行的时间点来决定它的
内容。
这些数据库快照在报表方面是非常有价值,因为在快照数据库中或者在原数据库中,
对于任何查询而言没有锁就将被执行。快照也可以使用在灾难恢复中,因为你可以将现有
的数据恢复到现有的快照中,或者还可以在有害数据操作声明的事件中存储个别必要的表
和数据。
数据库快照是如何工作的?
可以使用典型的数据库命令 CREATE DATABASE 语句来生成一个数据库快照,在声
明中有一个源数据库快照的附加说明。当快照被建立时,同时生成一个稀疏文件。这个文
件(只能使用在 NTFS 卷中)在初始化的时候并没有磁盘空间分配给它——尽管你可能在
WINDOWS 资源管理器中看到了文件的大小,它会看上去与原始的源数据库文件的大小相
同。对磁盘来说其实这个文件的大小接近于零。
数据库快照在初始化时读的数据文件是来自于源数据库的。当源数据库的数据发生变
化时,数据引擎就会将原始数据从源数据库拷贝到快照数据库中。这个技术确保快照数据
库只反映快照被执行时数据的状态。当 SELECT 命令被用来发布反对数据库快照时,不管
数据页的读取是否被定位在源数据库数据文件中还是在快照数据库数据文件中都是没有锁
被发布的。因为在只读数据库快照中是没有锁被发布,数据库快照对于报表解决方案是一
个重要的解决方案。
一个快照的实例
现在,让我们来看看数据库快照在 SQL Server 2005 中是如何工作的。为此,首先
我需要一个源数据库作为快照的来源。下面的脚本将创建一个源数据库:
USE master
GO
IF EXISTS(SELECT name from sysdatabases where
[name] = 'SourceDatabase')
DROP DATABASE SourceDatabase
GO
CREATE DATABASE SourceDatabaseON PRIMARY