创建数据库快照 (Transact-SQL)

创建 SQL Server 数据库快照的唯一方式是使用 Transact-SQL。 SQL Server Management Studio 不支持创建数据库快照。

  • **开始之前: **

    先决条件

    安全性

    最佳做法:命名数据库快照

  • **创建数据库快照,使用:**Transact-SQL

准备工作

必备组件

可以使用任何恢复模式的源数据库必须满足以下先决条件:

  • 服务器实例必须正在运行支持数据库快照的 SQL Server 版本。有关在 SQL Server 2012 中支持数据库快照的信息,请参阅 SQL Server 2012 各个版本支持的功能。 

  • 源数据库必须处于联机状态,除非该数据库在数据库镜像会话中是镜像数据库。

  • 若要在镜像数据库中创建数据库快照,数据库必须处于同步镜像状态

  • 不能将源数据库配置为可缩放共享数据库。

重要说明重要提示

有关其他重要事项的信息,请参阅数据库快照 (SQL Server)

建议

本节讨论以下最佳做法:

  • 最佳做法:命名数据库快照

  • 最佳做法:限制数据库快照的数量

  • 最佳做法:将客户端连接到数据库快照

最佳做法:命名数据库快照

创建数据库快照之前,考虑如何命名它们是非常重要的。 每个数据库快照都需要一个唯一的数据库名称。 为了便于管理,数据库快照的名称可以包含标识数据库的信息,例如:

  • 源数据库的名称。

  • 该新名称用于快照的指示信息。

  • 快照的创建日期和时间、序列号或一些其他的信息(例如一天中的某个时间)以区分给定的数据库上的连续快照。

例如,考虑 AdventureWorks2012 数据库的一系列快照。 在上午 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 手动连接到数据库快照。 但是,若要支持生产环境,您应该创建一个编程解决方案,该方案透明地将报表编写客户端定向到数据库的最新数据库快照。

[返回页首]

安全性

权限

可创建数据库的任何用户都可以创建数据库快照;但是,若要创建镜像数据库的快照,您必须是 sysadmin 固定服务器角色的成员。

用于“返回首页”链接的箭头图标[返回页首]

如何创建数据库快照(使用 Transact-SQL)

创建数据库快照

注意注意

有关此过程的示例,请参阅本节后面的示例 (Transact-SQL)。

  1. 根据源数据库的当前大小,确保有足够的磁盘空间存放数据库快照。 数据库快照的最大大小为创建快照时源数据库的大小。 有关详细信息,请参阅查看数据库快照的稀疏文件大小 (Transact-SQL)

  2. 使用 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

    [;]

    其中,source_database_name 是源数据库,logical_file_name 是引用该文件时在 SQL Server 中使用的逻辑名称,os_file_name 是创建该文件时操作系统使用的路径和文件名,database_snapshot_name 是要将数据库恢复到的快照的名称。 有关该语法的完整说明,请参阅 CREATE DATABASE (Transact-SQL)

    注意注意

    创建数据库快照时,CREATE DATABASE 语句中不允许有日志文件、脱机文件、还原文件和不起作用的文件。

用于“返回首页”链接的箭头图标[返回页首]

示例 (Transact-SQL)

注意注意

示例中使用的扩展名 .ss 是随意选择的。

本部分包含以下示例:

  • A. 对 AdventureWorks 数据库创建快照

  • B. 对 Sales 数据库创建快照

A.对 AdventureWorks 数据库创建快照

此示例对 AdventureWorks 数据库创建数据库快照。 快照名称 AdventureWorks_dbss_1800 及其稀疏文件的名称 AdventureWorks_data_1800.ss 指明了创建时间 6 P.M.(1800 小时)。

CREATE DATABASE AdventureWorks_dbss1800 ON
( NAME = AdventureWorks_Data, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss' )
AS SNAPSHOT OF AdventureWorks;
GO

B.对 Sales 数据库创建快照

此示例对 Sales 数据库创建数据库快照 sales_snapshot1200。 此数据库是在 CREATE DATABASE (Transact-SQL) 中的“创建具有文件组的数据库”示例中创建的。

--Creating sales_snapshot1200 as snapshot of the
--Sales database:
CREATE DATABASE sales_snapshot1200 ON
( NAME = SPri1_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss'),
( NAME = SPri2_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss'),
( NAME = SGrp1Fi1_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss'),
( NAME = SGrp1Fi2_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss'),
( NAME = SGrp2Fi1_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss'),
( NAME = SGrp2Fi2_dat, FILENAME = 
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss')
AS SNAPSHOT OF Sales
GO

用于“返回首页”链接的箭头图标[返回页首]

相关任务

用于“返回首页”链接的箭头图标[返回页首]

请参阅

参考

CREATE DATABASE (Transact-SQL)

概念

数据库快照 (SQL Server)