创建数据库快照 (Transact-SQL)
适用于: SQL Server
创建 SQL Server 数据库快照的唯一方式是使用 Transact-SQL。 SQL Server Management Studio 不支持创建数据库快照。
先决条件
可以使用任何恢复模式的源数据库必须满足以下先决条件:
服务器实例必须运行支持数据库快照的 SQL Server 版本。 有关 SQL Server 中数据库快照支持的信息,请参阅 SQL Server 2022 的版本及支持的功能。
源数据库必须处于联机状态,除非该数据库是数据库镜像会话中的镜像数据库。
若要在镜像数据库中创建数据库快照,数据库必须处于同步 镜像状态。
不能将源数据库配置为可缩放的共享数据库。
在 SQL Server 2019 (15.x) 之前,源数据库不得包含
MEMORY_OPTIMIZED_DATA
文件组。 SQL Server 2019 (15.x) 中添加了对内存数据库快照的支持。
重要
有关其他重要注意事项的信息,请参阅 数据库快照 (SQL Server)。
建议
本节讨论以下最佳做法:
最佳做法:命名数据库快照
创建数据库快照之前,重要的是考虑如何将其命名。 每个数据库快照都需要一个唯一的数据库名称。 为了便于管理,数据库快照的名称可以包含标识数据库的信息,例如:
源数据库的名称。
表明新名称用于快照的指示信息。
快照的创建日期和时间、序列号或一些其他的信息(例如一天中的某个时间)以区分给定的数据库上的连续快照。
例如,假设有一系列的 AdventureWorks2022
数据库快照。 每天在上午 6 时和下午 6 时(24 小时制)之间按 6 小时的间隔创建三次快照。 每个每日快照保持 24 小时才被删除并被同一名称的新快照替换。 每个快照名称指明小时,而非日期:
AdventureWorks_snapshot_0600
AdventureWorks_snapshot_1200
AdventureWorks_snapshot_1800
另外,如果这些每日快照创建的时间每天都变化,则推荐使用不太精确的命名约定,例如:
AdventureWorks_snapshot_morning
AdventureWorks_snapshot_noon
AdventureWorks_snapshot_evening
最佳做法:限制数据库快照的数量
随着时间的变化创建一系列快照可捕获源数据库的连续快照。 每个快照都会一直保存在系统中,直到被显式删除。 因为每个快照会随着原始页的更新而不断增长,所以您可能想在创建新快照后通过删除旧的快照来节省空间。
注意
若要还原到某个数据库快照,则需要从该数据库中删除所有其他快照。
最佳做法:将客户端连接到数据库快照
若要使用数据库快照,客户端需要知道它的位置。 正在创建或删除另一个数据库快照时,用户可以从一个数据库快照读取。 但是,如果用新快照替代现有快照,您需要将客户端重新定向到新快照。 用户可以使用 SQL Server Management Studio 或 Azure Data Studio 手动连接到数据库快照。 但是,若要支持生产环境,您应该创建一个编程解决方案,该方案透明地将报表编写客户端定向到数据库的最新数据库快照。
权限
可创建数据库的任何用户都可以创建数据库快照;但是,若要创建镜像数据库的快照,你必须是 sysadmin 固定服务器角色的成员。
使用 Transact-SQL 创建数据库快照
根据源数据库的当前大小,确保有足够的磁盘空间存放数据库快照。 数据库快照的最大大小为创建快照时源数据库的大小。 有关详细信息,请参阅查看数据库快照的稀疏文件大小 (Transact-SQL)。
使用
AS SNAPSHOT OF
子句对文件发出CREATE DATABASE
语句。 创建快照需要指定源数据库的每个数据库文件的逻辑名称。 语法如下所示:CREATE DATABASE database_snapshot_name ON ( NAME = logical_file_name , FILENAME = 'os_file_name' ) [ , ...n ] AS SNAPSHOT OF source_database_name [;]
自变量如下:
参数 说明 database_snapshot_name
要用于恢复数据库的数据库快照名称。 logical_file_name
引用文件时源数据库在 SQL Server 中所用的逻辑名。 os_file_name
创建文件时由操作系统使用的路径和文件名。 source_database_name
源数据库。 有关该语法的完整说明,请参阅 CREATE DATABASE (SQL Server Transact-SQL)。
注意
创建数据库快照时,
CREATE DATABASE
语句中不允许有日志文件、脱机文件、还原文件和失效文件。
示例
这些示例中使用的 .ss
扩展是为了方便起见,并非强制要求。 在包含多个文件的数据库中,必须按照语法指定所有文件。 未指定文件组。
A. 为 AdventureWorks 数据库创建快照
此示例对 AdventureWorks
数据库创建数据库快照。 快照名称 AdventureWorks_dbss_1800
及其稀疏文件的文件名 AdventureWorks_data_1800.ss
指明了创建时间下午 6 时(1800 时)。
CREATE DATABASE AdventureWorks_dbss1800 ON (
NAME = AdventureWorks,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss'
) AS SNAPSHOT OF AdventureWorks;
GO
B. 为 Sales 数据库创建快照
本示例将为 sales_snapshot1200
数据库创建数据库快照 Sales
,该数据库与 CREATE DATABASE 中创建包含文件组的数据库所用的示例数据库相同。
--Create sales_snapshot1200 as snapshot of the Sales database:
CREATE DATABASE sales_snapshot1200 ON (
NAME = SPri1_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss'
),
(
NAME = SPri2_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss'
),
(
NAME = SGrp1Fi1_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss'
),
(
NAME = SGrp1Fi2_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss'
),
(
NAME = SGrp2Fi1_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss'
),
(
NAME = SGrp2Fi2_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss'
) AS SNAPSHOT OF Sales;
GO