数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库通常会有打开的事务。在快照可以使用之前,打开的事务会回滚以使数据库快照在事务上取得一致。
客户端可以查询数据库快照,这对于基于创建快照时的数据编写报表是很有用的。而且,如果以后源数据库损坏了,便可以将源数据库恢复到它在创建快照时的状态。
![]() |
---|
只有 Microsoft SQL Server 2005 Enterprise Edition 提供数据库快照功能。 |
创建数据库快照的原因包括:
- 维护历史数据以生成报表。
由于数据库快照可提供数据库的静态视图,因而可以通过快照访问特定时间点的数据。例如,您可以在给定时间段(例如,财务季度)要结束的时候创建数据库快照以便日后制作报表。然后便可以在快照上运行期间要结束时创建的报表。如果磁盘空间允许,还可以维护任意多个不同期间要结束时的快照,以便能够对这些时间段的结果进行查询。例如,调查单位性能。 - 使用为了实现可用性目标而维护的镜像数据库来卸载报表。
使用带有数据库镜像的数据库快照,使您能够访问镜像服务器上的数据以生成报表。而且,在镜像数据库上运行查询可以释放主体数据库上的资源。有关详细信息,请参阅数据库镜像和数据库快照。 - 使数据免受管理失误所带来的影响。
在进行重大更新之前(例如,大容量更新),可创建数据库快照以保护数据。一旦进行了错误操作,可以使用快照将数据库恢复到生成快照时的状态。采用此方法还原很可能比从备份还原快得多;但是,此后您无法对数据进行前滚操作。
有关详细信息,请参阅恢复到数据库快照。重要提示:
数据库快照与源数据库相关。因此,使用数据库快照还原数据库不能代替备份和还原策略。严格按计划执行备份仍然至关重要。如果必须将源数据库还原到创建数据库快照的时间点,请实施允许您执行该操作的备份策略。 - 使数据免受用户失误所带来的影响。
定期创建数据库快照,可以减轻重大用户错误(例如,删除的表)的影响。为了很好地保护数据,可以创建时间跨度足以识别和处理大多数用户错误的一系列数据库快照。例如,根据磁盘资源,可以每 24 小时创建 6 到 12 个滚动快照。每创建一个新的快照,就删除最早的快照。- 若要从用户错误中恢复,可以将数据库恢复到在错误发生的前一时刻的快照。采用此方法还原很可能比从备份还原快得多;但是,此后您无法对数据进行前滚操作。
有关恢复快照的详细信息,请参阅恢复到数据库快照。 - 或者,也可以利用快照中的信息,手动重新创建删除的表或其他丢失的数据。例如,可以将快照中的数据大容量复制到数据库中,然后手动将数据合并回数据库中。
注意:
使用数据库快照的原因,决定了数据库需要多少个并发快照、多久创建一次新快照以及将其保留多久。 - 若要从用户错误中恢复,可以将数据库恢复到在错误发生的前一时刻的快照。采用此方法还原很可能比从备份还原快得多;但是,此后您无法对数据进行前滚操作。
- 管理测试数据库
在测试环境中,当每一轮测试开始时针对要包含相同数据的数据库重复运行测试协议将十分有用。在运行第一轮测试前,应用程序开发人员或测试人员可以在测试数据库中创建数据库快照。每次运行测试之后,数据库都可以通过还原数据库快照快速返回到它以前的状态。
历史记录 | |
---|---|
2006 年 12 月 12 日 |
|
2005 年 12 月 5 日 |
|
数据库快照捕获开始创建快照的时间点,去掉所有未提交的事务。使用数据库快照之前,应了解数据库快照对源数据库和系统环境的影响,以及快照本身存在哪些限制。
![]() |
---|
只有 Microsoft SQL Server 2005 Enterprise Edition 提供数据库快照功能。 |
只要存在数据库快照,快照的源数据库就存在以下限制:
- 不能对数据库进行删除、分离或还原。有关如何删除快照的信息,请参阅删除数据库快照。
注意:
可以备份源数据库,这方面将不受数据库快照的影响。 - 源数据库的性能受到影响。由于每次更新页时都会对快照执行“写入时复制”操作,导致源数据库上的 I/O 增加。
- 不能从源数据库或任何快照中删除文件。
- 源数据库必须处于在线状态,除非该数据库在数据库镜像会话中是镜像数据库。
注意:
所有恢复模式都支持数据库快照。 - 不能将源数据库配置为可缩放共享数据库。
- 若要在镜像数据库中创建数据库快照,数据库必须处于同步镜像状态。
数据库快照存在以下限制:
- 数据库快照必须与源数据库在相同的服务器实例上创建和保留。
- 始终对整个数据库拍摄数据库快照。
- 由于数据库快照不是冗余存储,因此,它们不会防止磁盘出现错误或其他类型的损坏。为了保护数据库,非常有必要定期执行备份并测试还原计划。如果必须将源数据库还原到创建数据库快照的时间点,请实施允许您执行该操作的备份策略。
- 当将源数据库中更新的页强制压入快照时,如果快照用尽磁盘空间或者遇到其他错误,则该快照将成为可疑快照并且必须将其删除。
- 快照为只读。
- 禁止对 model 数据库、master 数据库和 tempdb 数据库创建快照。
- 不能更改数据库快照文件的任何规范。
- 不能从数据库快照中删除文件。
- 不能备份或还原数据库快照。
- 不能附加或分离数据库快照。
- 不能在 FAT32 文件系统或 RAW 分区上创建数据库快照。数据库快照所用的稀疏文件由 NTFS 文件系统提供。
- 数据库快照不支持全文索引。不从源数据库传播全文目录。
- 数据库快照将继承快照创建时其源数据库的安全约束。由于快照是只读的,因此无法更改继承的权限,对源数据库的更改权限将不反映在现有快照中。
- 快照始终反映创建该快照时的文件组状态:在线文件组将保持在线状态,离线文件组将保持离线状态。有关详细信息,请参阅本主题后面的“含有离线文件组的数据库快照”。
- 如果源数据库的状态为 RECOVERY_PENDING,可能无法访问其数据库快照。但是,当解决了源数据库的问题之后,快照将再次变成可用快照。
- 只读文件组和压缩文件组不支持恢复操作。尝试恢复包含下列任意一种文件组的数据库将失败。有关恢复的详细信息,请参阅恢复到数据库快照。
- 在日志传送配置中,只能针对主数据库,而不能针对辅助数据库创建数据库快照。如果您在主服务器实例和辅助服务器实例之间切换角色,则在将主数据库设置为辅助数据库之前,必须先删除所有数据库快照。
- 不能将快照配置为可缩放共享数据库。
数据库快照占用磁盘空间。如果数据库快照用尽了磁盘空间,将被标记为可疑,必须将其删除。(但是,源数据库不会受到影响,对其执行的操作仍能继续正常进行。)然而,与一份完整的数据库相比,快照具有高度空间有效性。快照仅需足够存储空间来存储在其生存期中更改的页。通常情况下,快照只会保留一段有限的时间,因此其大小不是主要问题。
但是,保留快照的时间越长,越有可能将可用空间用完。稀疏文件最大只能增长到创建快照时相应的源数据库文件的大小。有关详细信息,请参阅了解数据库快照中的稀疏文件大小。
如果数据库快照用完了磁盘空间,则必须删除该快照。有关删除数据库快照的信息,请参阅删除数据库快照。
![]() |
---|
除文件空间外,数据库快照与数据库占用的资源量大致相同。 |
当您尝试执行下列任何操作时,源数据库中的离线文件组都将影响数据库快照:
- 创建快照
当源数据库具有一个或多个离线文件组时,快照创建只有在文件组处于离线状态时才能成功。不能为离线文件组创建稀疏文件。注意:
有关数据库快照稀疏文件的角色的信息,请参阅数据库快照的工作方式。 - 使文件组离线
可以在源数据库中使文件离线。但是,如果创建快照时文件组处于在线状态,则该文件组在数据库快照中仍将保持在线状态。如果查询的数据在快照创建后已更改,则在快照中可以访问原始数据页。但是,使用快照访问文件组中未修改数据的查询可能会由于出现输入/输出 (I/O) 错误而失败。 - 使文件组在线
只要数据库具有任何快照,就不能使其中的文件组在线。如果在创建快照时文件组处于离线状态,或当数据库快照存在时使文件组离线,则文件组将保持离线状态。这是因为使文件重新在线需要还原该文件,而如果数据库已具有快照,则无法执行此操作。 - 将源数据库恢复到快照
将源数据库恢复到数据库快照要求除创建快照时处于离线状态的文件组外,所有文件组都要处于在线状态。
删除数据库快照将删除 SQL Server 中的数据库快照,并删除快照使用的稀疏文件。删除数据库快照时,将终止所有到此快照的用户连接。
具有 DROP DATABASE 权限的任何用户都可以删除数据库快照。
删除数据库快照将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。在 SQL Server 2005 Service Pack 2 中,对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志将包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新。”只要每五分钟刷新一次缓存,此消息就将每五分钟记录一次。
可以利用为了实现可用性目标而维护的镜像数据库来卸载报表。若要将镜像数据库用于报表,可以在镜像数据库中创建数据库快照,并将客户端连接请求定向到最新的快照。由于数据库快照只在创建快照时存在,因此,它是一个静态的、只读的并与其源数据库保持事务一致的快照。若要在镜像数据库中创建数据库快照,数据库必须处于同步镜像状态。
与镜像数据库本身不同,客户端可以访问数据库快照。只要镜像服务器与主体服务器进行通信,就可以将报表客户端连接定向到快照。注意,由于数据库快照是静态的,因此没有新数据可用。为了让用户能够使用相对较新的数据,必须定期创建新的数据库快照,并通过应用程序将传入客户端连接定向到最新的快照。
新的数据库快照几乎是空的,但是它会随着越来越多的数据页的首次更新而增长。由于数据库中的每个快照都以这种方式增长,因此,每个数据库快照与常规数据库使用同样多的资源。根据镜像服务器和主体服务器的配置,在镜像数据库中保留过多的数据库快照可能会降低主体数据库的性能。因此,我们建议在镜像数据库中仅保留少量相对较新的快照。一般情况下,在创建替换快照之后,应重新将传入查询定向到新的快照,并在完成所有当前的查询之后删除较早的快照。
![]() |
---|
有关数据库快照的详细信息,请参阅数据库快照。 |
如果出现角色切换,则数据库及其快照将重新启动并暂时断开与用户的连接。然后,数据库快照保留在创建时所在的服务器实例中,并成为新的主体数据库。用户可以在故障转移后继续使用快照。但是,这样会给新的主体服务器带来额外的负荷。如果在您的环境中性能是一个关注点,则我们建议您应在新镜像数据库成为可用后,在其中创建快照,并将客户端重新定向到新快照,同时从以前的镜像数据库中删除所有数据库快照。
![]() |
---|
对于能很好地向外扩展的专用报告解决方案,可以考虑复制。有关详细信息,请参阅数据仓库和报告。 |