数据库快照是 SQL Server 数据库的只读静态视图( 源数据库)。 在创建快照的那一刻,数据库快照在事务上与源数据库保持一致。 数据库快照始终驻留在其源数据库所在的同一服务器实例上。 更新源数据库时,将更新数据库快照。 因此,数据库快照存在的时间越长,就越有可能使用其可用磁盘空间。
给定源数据库上可以存在多个快照。 每个数据库快照一直保留,直到数据库所有者显式删除该快照。
注释
数据库快照与快照备份、事务的快照隔离或快照复制无关。
在本主题中:
功能概述
数据库快照在数据页级别运行。 在首次修改源数据库的页之前,原始页将从源数据库复制到快照。 快照存储原始页,保留创建快照时存在的数据记录。 对于第一次修改的每个页面,都会重复相同的过程。 对于用户,数据库快照似乎永远不会更改,因为数据库快照上的读取作始终访问原始数据页,而不管它们位于何处。
为了存储复制的原始页面,快照使用一个或多个 稀疏文件。 最初,稀疏文件是一个本质上为空的文件,其中包含没有用户数据,尚未为用户数据分配磁盘空间。 随着源数据库中越来越多的页面更新,文件的大小会增大。 下图说明了两种对比更新模式对快照大小的影响。 更新模式 A 反映了在快照的生命周期内仅更新 30% 的原始页面的环境。 更新模式 B 反映了在快照的生命周期内更新 80% 的原始页面的环境。
数据库快照的优点
快照可用于报告目的。
客户端可以查询数据库快照,这样就可以在创建快照时基于数据编写报表。
维护用于生成报表的历史数据。
快照可以扩展用户对特定时间点的数据的访问权限。 例如,可以在给定时间段(例如财务季度)结束时创建数据库快照,以供以后报告。 然后,你可以对快照运行期末报告。 如果磁盘空间允许,还可以无限期地维护期结束快照,从而允许对这些时间段的结果进行查询:例如,若要调查组织性能,
使用为了可用性目的维护的镜像数据库卸载报告。
通过数据库镜像使用数据库快照,使镜像服务器上的数据可供报告访问。 此外,在镜像数据库上运行查询可以释放主体上的资源。 有关详细信息,请参阅数据库镜像和数据库快照(SQL Server)。
保护数据免受管理错误。
如果源数据库出现用户错误,可以将源数据库还原为创建给定数据库快照时的状态。 数据丢失仅限于自快照创建以来对数据库的更新。
例如,在执行重大更新(如批量更新或架构更改)之前,请在数据库上创建数据库快照来保护数据。 如果犯了错误,可以使用快照将数据库恢复到快照状态。 与从备份恢复相比,回滚可能更快地实现此目的;但是,之后无法进行前滚。
重要
还原在数据库处于脱机状态或损坏时不起作用。 因此,需要定期备份和测试还原计划来保护数据库。
注释
数据库快照依赖于源数据库。 因此,使用数据库快照还原数据库并不能替代备份和还原策略。 执行所有预定的备份仍然至关重要。 如果必须将源数据库还原到创建数据库快照的时间点,请实现一个备份策略,使你能够执行此作。
保护数据免受用户错误。
通过定期创建数据库快照,可以缓解主要用户错误(例如已删除的表)的影响。 为了获得高级别的保护,可以创建一系列跨越足够时间的数据库快照来识别和响应大多数用户错误。 例如,根据磁盘资源,可以保留 6 到 12 个滚动快照(间隔为 24 小时)。 然后,每次创建新快照时,都可以删除最早的快照。
若要从用户错误中恢复,可以在错误发生前立即将数据库还原到快照。 与从备份恢复相比,回退可能更快达到目的;但是,之后不能前滚。
或者,您可以尝试从快照中的信息手动重建丢失的表或其他数据。 例如,可以将数据从快照中大容量复制到数据库中,并将数据手动合并回数据库。
注释
使用数据库快照的原因决定了数据库需要多少个并发快照、创建新快照的频率以及保留多长时间。
管理测试数据库
在测试环境中,在每次测试开始时重复运行数据库测试协议以包含相同数据时,它很有用。 在运行第一轮之前,应用程序开发人员或测试人员可以在测试数据库上创建数据库快照。 每次测试运行后,数据库可以通过还原数据库快照快速返回到其以前的状态。
术语和定义
数据库快照
数据库的事务一致、只读的静态视图(源数据库)。
源数据库
对于数据库快照,创建快照的数据库。 数据库快照依赖于源数据库。 数据库的快照必须与数据库位于同一服务器实例上。 此外,如果该数据库因任何原因变得不可用,则其所有数据库快照也变得不可用。
稀疏文件
由NTFS文件系统提供的文件,所需磁盘空间比通常情况下要少得多。 稀疏文件用于存储复制到数据库快照的页面。 首次创建时,稀疏文件占用很少的磁盘空间。 将数据写入数据库快照时,NTFS 会逐渐将磁盘空间分配给相应的稀疏文件。
数据库快照的先决条件和限制
本节内容:
先决条件
可以使用任何恢复模式的源数据库必须满足以下先决条件:
服务器实例必须在支持数据库快照的 SQL Server 版本中运行。 有关详细信息,请参阅 SQL Server 2014 各个版本支持的功能。
源数据库必须处于联机状态,除非数据库是数据库镜像会话中的镜像数据库。
可以在可用性组中的任何主数据库或辅助数据库上创建数据库快照。 副本角色必须是 PRIMARY 或 SECONDARY,且不处于 RESOLVING 状态。
当您创建一个数据库快照时,我们建议数据库同步状态是 SYNCHRONIZING 或 SYNCHRONIZED。 但是,当数据库同步状态为 NOT SYNCHRONIZING 时,可以创建数据库快照。
有关详细信息,请参阅具有 AlwaysOn 可用性组的数据库快照(SQL Server)。
若要在镜像数据库上创建数据库快照,该数据库必须处于 SYNCHRONIZED 镜像状态。
源数据库不能配置为可缩放的共享数据库。
注释
所有恢复模式都支持数据库快照。
源数据库的限制
只要存在数据库快照,快照的源数据库就存在以下限制:
无法删除、分离或还原数据库。
注释
备份源数据库正常工作;它不受数据库快照影响。
性能降低,是因为每次更新页面时,源数据库会因为写时复制操作增加到快照的 I/O。
无法从源数据库或任何快照中删除文件。
数据库快照的限制
以下限制适用于数据库快照:
必须创建数据库快照,并将其保留在与源数据库相同的服务器实例上。
数据库快照始终适用于整个数据库。
数据库快照依赖于源数据库,并且不是冗余存储。 它们不会防止磁盘错误或其他类型的损坏。 因此,使用数据库快照还原数据库并不能替代备份和还原策略。 按计划执行所有备份仍然至关重要。 如果必须将源数据库还原到创建数据库快照的时间点,请实现一个备份策略,使你能够执行此作。
将源数据库上的页面更新到快照时,如果快照耗尽磁盘空间或遇到其他错误,快照将变得可疑且必须被删除。
快照是只读的。 由于它们是只读的,因此无法升级它们。 因此,在升级后,数据库快照不应可行。
禁止为 model、master 和 tempdb 数据库创建快照。
不能更改数据库快照文件的任何规范。
无法从数据库快照中删除文件。
无法备份或还原数据库快照。
无法附加或分离数据库快照。
不能在 FAT32 文件系统或 RAW 分区上创建数据库快照。 数据库快照使用的稀疏文件由 NTFS 文件系统提供。
数据库快照不支持全文索引。 全文目录不会从源数据库传播。
数据库快照在创建快照时继承其源数据库的安全约束。 由于快照是只读的,因此无法更改继承的权限,对源所做的权限更改不会反映在现有快照中。
快照始终反映创建快照时文件组的状态:联机文件组保持联机状态,脱机文件组保持脱机状态。 有关详细信息,请参阅本主题后面的“使用脱机文件组的数据库快照”。
如果源数据库变为RECOVERY_PENDING,则其数据库快照可能会不可访问。 但是,在解决源数据库问题后,其快照应再次可用。
只读文件组和压缩文件组不支持还原。 尝试还原包含其中任一类型的文件组的数据库失败。
在日志传送配置中,只能在主数据库上创建数据库快照,而不能在辅助数据库上创建数据库快照。 如果在主服务器实例和辅助服务器实例之间切换角色,则必须删除所有数据库快照,然后才能将主数据库设置为辅助数据库。
无法将数据库快照配置为可缩放的共享数据库。
数据库快照不支持 FILESTREAM 文件组。 如果源数据库中存在 FILESTREAM 文件组,则它们在其数据库快照中标记为脱机,并且数据库快照不能用于还原数据库。
注释
对数据库快照执行的 SELECT 语句不得指定 FILESTREAM 列;否则,将返回以下错误消息:
Could not continue scan with NOLOCK due to data movement.
当只读快照的统计信息缺失或过时时,数据库引擎会在 tempdb 中创建和维护临时统计信息。 有关详细信息,请参阅统计信息。
磁盘空间要求
数据库快照占用磁盘空间。 如果数据库快照磁盘空间不足,则会将其标记为可疑,必须将其删除。 (然而,源数据库不受影响,对其执行的操作通常继续正常进行。)与数据库的完整副本相比,快照的空间效率很高。 快照只需要为其一生中发生变化的页面提供足够的存储空间。 通常,快照会保留有限的时间,因此其大小不是主要问题。
但是,保留快照的时间越长,使用可用空间的可能性就越大。 稀疏文件可增长的最大大小是创建快照时相应源数据库文件的大小。
如果数据库快照磁盘空间不足,则必须删除它。
注释
除文件空间外,数据库快照消耗的资源量与数据库大致相同。
具有脱机文件组的数据库快照
尝试执行以下任一作时,源数据库中的脱机文件组会影响数据库快照:
创建快照
当源数据库具有一个或多个脱机文件组时,快照创建会随着文件组脱机而成功。 不会为离线文件组创建稀疏文件。
使文件组脱机
你可以在源数据库中使文件离线。 但是,如果创建快照时文件组处于联机状态,则文件组在数据库快照中保持联机状态。 如果在创建快照后查询的数据已更改,则原始数据页将在快照中访问。 但是,使用快照访问文件组中未修改数据的查询可能会失败,并出现输入/输出(I/O)错误。
将文件组联机
无法在具有任何数据库快照的数据库中使文件组联机。 如果在创建快照时文件组处于脱机状态,或者在数据库快照存在时脱机,则文件组将保持脱机状态。 这是因为将文件重新联机涉及还原,如果数据库上存在数据库快照,则无法还原该文件。
将源数据库还原到快照
将源数据库还原到数据库快照要求除创建快照时脱机的文件组外,所有文件组都处于联机状态。