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