DBCC CLONEDATABASE (Transact-SQL)

适用范围:SQL Server

通过使用 DBCC CLONEDATABASE 它生成数据库的仅限架构只读副本,以便调查与查询优化器相关的性能问题。

Transact-SQL 语法约定

语法

DBCC CLONEDATABASE
(
    source_database_name
    ,  target_database_name
)
    [ WITH { [ NO_STATISTICS ] [ , NO_QUERYSTORE ] [ , VERIFY_CLONEDB | SERVICEBROKER ] [ , BACKUP_CLONEDB ] } ]

参数

source_database_name

要复制的数据库的名称。

target_database_name

源数据库要复制到的数据库的名称。 此数据库将由 DBCC CLONEDATABASE 创建,不应已经存在。

NO_STATISTICS

适用于:SQL Server 2014 (12.x) Service Pack 2 CU 3、SQL Server 2016 (13.x) Service Pack 1 和更高版本。

指定是否需要将表/索引统计信息排除在克隆范围之外。 如果未指定此选项,表/索引统计信息自动包含在克隆范围之内。

NO_QUERYSTORE

适用于:SQL Server 2016 (13.x) Service Pack 1 及更高版本。

指定是否需要将查询存储数据排除在克隆范围之外。 如果未指定此选项,在源数据库中启用了查询存储的情况下,系统会将查询存储数据复制到克隆中。

VERIFY_CLONEDB

适用于:SQL Server 2014 (12.x) Service Pack 3、SQL Server 2016 (13.x) Service Pack 2、SQL Server 2017 (14.x) CU 8 和更高版本。

检查新数据库的一致性。 启用 VERIFY_CLONEDB 还会禁用统计信息和查询存储收集,因此相当于运行 WITH VERIFY_CLONEDB, NO_STATISTICS, NO_QUERYSTORE

以下命令可用于确定克隆的数据库是否已验证:

SELECT DATABASEPROPERTYEX('clone_database_name', 'IsVerifiedClone');

SERVICEBROKER

适用于:SQL Server 2014 (12.x) Service Pack 3、SQL Server 2016 (13.x) Service Pack 2、SQL Server 2017 (14.x) CU 8 和更高版本。

指定是否应将与 Service Broker 相关的系统目录包含在克隆范围之内。 SERVICEBROKER 选项不能与 VERIFY_CLONEDB 结合使用。

BACKUP_CLONEDB

适用于:SQL Server 2014 (12.x) Service Pack 3、SQL Server 2016 (13.x) Service Pack 2、SQL Server 2017 (14.x) CU 8 和更高版本。

创建并验证克隆数据库的备份。 与 VERIFY_CLONEDB 配合使用时,系统先验证克隆数据库,再进行备份。

注解

生成的 DBCC CLONEDATABASE 数据库的克隆仅用于故障排除和诊断目的。 克隆是原始数据库的只读架构副本,具有复制对象的限制。 有关更多详细信息,请参阅“支持的对象”部分。 不支持使用任何其他克隆数据库。

以下验证由 DBCC CLONEDATABASE 执行。 如果任何验证失败,则该命令失败。

  • 源数据库必须是用户数据库。 不允许克隆系统数据库(mastermodelmsdbtempdbdistribution 数据库等)。
  • 源数据库必须处于联机状态或可读取。
  • 不得存在与克隆数据库使用相同名称的数据库。
  • 该命令不在用户事务中。

如果所有验证均成功,则通过下列操作克隆源数据库:

  • 根据 model 数据库创建一个新的目标数据库,该数据库的文件布局与源数据库相同,但采用的是默认文件大小。
  • 创建源数据库的内部快照。
  • 将系统元数据从源数据库复制到目标数据库。
  • 将所有对象的所有架构从源数据库复制到目标数据库。
  • 将所有索引的统计信息从源数据库复制到目标数据库。

目标数据库中的所有文件将继承 model 数据库的大小和增长设置。 目标数据库的文件名将遵循 <source_file_name_underscore_random number> 约定。 如果目标文件夹中已存在生成的文件名,DBCC CLONEDATABASE 将失败。

如果 model 数据库中存在以上部分创建的任何用户对象(表、索引、架构、角色等),则 DBCC CLONEDATABASE 不支持创建克隆。 如果 model 数据库中存在用户对象,数据库克隆将失败,并显示以下错误消息:

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object <system table> with unique index 'index name'. The duplicate key value is <key value>

重要

如果有列存储索引,请参阅在克隆数据库上使用列存储索引优化查询的注意事项对列存储索引进行更新,然后再运行 DBCC CLONEDATABASE 命令DBCC CLONEDATABASE。 自 SQL Server 2019 (15.x) 起,上文中所述的手动步骤将不再是必需的,因为 DBCC CLONEDATABASE 命令会自动收集此信息。

列存储索引的统计信息 blob

从 SQL Server 2019 (15.x) 开始,DBCC CLONEDATABASE 会自动捕获列存储索引的统计信息 blob,因此无需手动步骤。 DBCC CLONEDATABASE 创建仅限架构的数据库副本,其中包括在不复制数据的情况下对查询性能问题进行故障排除所需的所有元素。 在以前版本的 SQL Server 中,该命令不会复制所需的统计信息来准确地对列存储索引查询进行故障排除,且需要手动步骤来捕获此信息。

有关克隆数据库的数据安全的信息,请参阅了解克隆数据库中的数据安全

内部数据库快照

DBCC CLONEDATABASE 使用源数据库的内部数据库快照来实现执行复制所需的事务一致性。 使用此快照可防止在执行这些命令时出现阻塞和并发问题。 如果无法创建快照,DBCC CLONEDATABASE 将失败。

在复制过程的以下步骤期间,将锁定数据库级别:

  • 验证源数据库
  • 对源数据库进行共享 (S) 锁定
  • 创建源数据库的快照
  • 创建克隆数据库(从 model 数据库继承的空数据库)
  • 对克隆数据库进行排他 (X) 锁定
  • 将元数据复制到克隆数据库
  • 解除所有数据库锁定

命令运行完成后,系统会立即删除内部快照。 克隆数据库上的 TRUSTWORTHYDB_CHAINING 选项处于关闭状态。

支持的对象

目标数据库中仅可克隆下列对象。 加密对象可以克隆,但无法在克隆数据库中使用。 不支持克隆未在以下部分列出的任何对象:

  • APPLICATION ROLE
  • AVAILABILITY GROUP
  • COLUMNSTORE INDEX
  • CDB
  • CDC
  • 更改跟踪 6、7、8
  • CLR 1, 2
  • DATABASE PROPERTIES
  • DEFAULT
  • FILES AND FILEGROUPS
  • 全文本 3
  • FUNCTION
  • INDEX
  • LOGIN
  • PARTITION FUNCTION
  • PARTITION SCHEME
  • PROCEDURE 4
  • QUERY STORE 2, 5
  • ROLE
  • RULE
  • SCHEMA
  • SEQUENCE
  • SPATIAL INDEX
  • STATISTICS
  • SYNONYM
  • 9
  • MEMORY OPTIMIZED TABLES 2
  • FILESTREAM AND FILETABLE OBJECTS 1, 2
  • TRIGGER
  • TYPE
  • UPGRADED DB
  • USER
  • VIEW
  • XML INDEX
  • XML SCHEMA COLLECTION

1 从 SQL Server 2014 (12.x) Service Pack 2 CU 3 开始。

2 从 SQL Server 2016 (13.x) Service Pack 1 开始。

3 从 SQL Server 2016 (13.x) Service Pack 1 CU 2 开始。

4 从 SQL Server 2014 (12.x) Service Pack 2 开始的所有版本都支持 Transact-SQL 过程。 从 SQL Server 2014 (12.x) Service Pack 2 CU 3 开始支持 CLR 过程。 从 SQL Server 2016 (13.x) Service Pack 1 开始支持本机编译过程。

5 仅当源数据库上启用了查询存储数据时,才复制查询存储数据。 要将最新的运行时统计信息复制为查询存储的一部分,请在执行 DBCC CLONEDATABASE 之前执行 sp_query_store_flush_db 以将运行时统计信息刷新到查询存储。

6 从 SQL Server 2016 (13.x) Service Pack 2 CU 10 开始。

7 从 SQL Server 2017 (14.x) Service Pack 2 CU 17 开始。

8 从 SQL Server 2019 (15.x) CU 1 及更高版本开始。

9 大多数系统表标记为 is_ms_shipped 未克隆。

权限

要求具有 sysadmin 固定服务器角色的成员身份。

错误日志消息

以下消息是克隆过程中记录在错误日志中的消息示例:

2018-03-26 15:33:56.05 spid53 Database cloning for 'sourcedb' has started with target as 'sourcedb_clone'.

2018-03-26 15:33:56.46 spid53 Starting up database 'sourcedb_clone'.

2018-03-26 15:33:57.80 spid53 Setting database option TRUSTWORTHY to OFF for database 'sourcedb_clone'.

2018-03-26 15:33:57.80 spid53 Setting database option DB_CHAINING to OFF for database 'sourcedb_clone'.

2018-03-26 15:33:57.88 spid53 Starting up database 'sourcedb_clone'.

2018-03-26 15:33:57.91 spid53 Database 'sourcedb_clone' is a cloned database. A cloned database should be used for diagnostic purposes only and is not supported for use in a production environment.

2018-03-26 15:33:57.92 spid53 Database cloning for 'sourcedb' has finished. Cloned database is 'sourcedb_clone'.

关于 SQL Server 的服务包

服务包是累积的。 每个新服务包都包含以前的服务包中的所有修补程序,以及任何新的修补程序。 建议为该服务包应用最新的服务包和最新的累积更新。 在安装最新的服务包之前,无需安装以前的服务包。 有关最新服务包和最新累积更新的详细信息,请参阅 SQL Server 的最新更新和版本历史记录中的表 1

注意

从 DBCC CLONEDATABASE 新生成的数据库不支持用作生产数据库,而是主要用于故障排除和诊断目的。 建议在创建数据库后分离克隆的数据库。

数据库属性

如果使用 DBCC CLONEDATABASE 生成数据库,DATABASEPROPERTYEX('dbname', 'IsClone') 将返回 1。

如果使用 WITH VERIFY_CLONEDB 验证数据库成功,DATABASEPROPERTYEX('dbname', 'IsVerifiedClone') 将返回 1。

示例

A. 创建包含架构、统计信息和查询存储的克隆数据库

以下示例创建 AdventureWorks2022 数据库的克隆,其中包括架构、统计信息和查询存储数据(SQL Server 2016 (13.x) Service Pack 1 及更高版本):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone);
GO

B. 创建不含统计信息的仅限架构的克隆数据库

以下示例创建不包含统计信息的 AdventureWorks2022 数据库的克隆(SQL Server 2014 (12.x) Service Pack 2 CU 3 及更高版本):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH NO_STATISTICS;
GO

C. 创建不含统计信息和查询存储的仅限架构的克隆数据库

以下示例创建 AdventureWorks2022 数据库的克隆,其中不包含统计信息和查询存储数据(SQL Server 2016 (13.x) Service Pack 1 及更高版本):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH NO_STATISTICS, NO_QUERYSTORE;
GO

D. 创建已验证的数据库的克隆

以下示例创建一个仅限架构的数据库AdventureWorks2022克隆,而不使用统计信息并查询存储已验证的数据(SQL Server 2016 (13.x) Service Pack 2 及更高版本):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH VERIFY_CLONEDB;
GO

E. 创建经验证的数据库的克隆,其中包含克隆数据库的备份

以下示例创建一个仅限架构的数据库克隆,AdventureWorks2022而不使用统计信息并查询存储已验证的数据。 还将创建经过验证的克隆数据库的备份(SQL Server 2016 (13.x) Service Pack 2 及更高版本)。

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH VERIFY_CLONEDB, BACKUP_CLONEDB;
GO

请参阅