DBCC CLONEDATABASE (Transact-SQL)
適用於:SQL Server
使用 DBCC CLONEDATABASE
來產生資料庫的僅限架構只讀複本,以調查與查詢優化器相關的效能問題。
語法
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
執行。 如果任一項驗證失敗,則命令會失敗。
- 來源資料庫必須是使用者資料庫。 不允許複製系統資料庫 (
master
、model
、msdb
、tempdb
、distribution
資料庫等)。 - 來源資料庫必須在線上或可讀取。
- 不得存在使用與複製資料庫相同名稱的資料庫。
- 命令不在使用者交易中。
如果所有驗證都成功,下列作業會執行來源資料庫的複製:
- 建立新的目的地資料庫,該資料庫使用與來源相同的檔案配置,但具有
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>
重要
如果您有資料行存放區索引,請參閱 使用克隆數據庫上的Columnstore索引調優查詢時的注意事項 (在複製資料庫上使用資料行存放區索引調整查詢時的考量) 更新資料行存放區索引統計資料,再執行 DBCC CLONEDATABASE
命令。 從 SQL Server 2019 (15.x) 開始,因為 DBCC CLONEDATABASE
命令會自動收集此資訊,因此將不再需要上述文章中所列的手動步驟。
資料行存放區索引的統計資料 Blob
從 SQL Server 2019 (15.x) 開始,DBCC CLONEDATABASE
會自動針對資料行存放區索引擷取統計資料 blob,因此不需要進行手動步驟。 DBCC CLONEDATABASE
會建立資料庫的僅限結構描述複本,其中包含為查詢效能問題進行疑難排解所需的所有項目,而不需要複製資料。 在 SQL Server 舊版中,此命令不會複製對資料行存放區索引查詢進行疑難排解的必要統計資料,因此需要進行手動步驟才能擷取這項資訊。
如需複製資料庫上資料安全性的相關資訊,請參閱 Understanding data security in cloned databases (了解複製資料庫中的資料安全性)。
內部資料庫快照集
DBCC CLONEDATABASE
會使用來源資料庫的內部資料庫快照集,以維持執行複製所需的交易一致性。 使用此快照集可以防止在執行這些命令時,發生封鎖和並行問題。 如果無法建立快照集,DBCC CLONEDATABASE
將會失敗。
在複製程序的下列步驟期間會保留資料庫層級鎖定:
- 驗證來源資料庫
- 為來源資料庫取得共用 (S) 鎖定
- 建立來源資料庫的快照集
- 建立複製資料庫 (繼承自
model
資料庫的空白資料庫) - 為複製資料庫取得獨佔 (X) 鎖定
- 將中繼資料複製到複製資料庫
- 解除所有資料庫鎖定
一旦命令完成執行,就會卸除內部快照集。 關閉複製資料庫上的 TRUSTWORTHY
和 DB_CHAINING
選項。
支援的物件
您只能將下列物件複製到目的地資料庫。 加密物件會被複製,但無法在複製資料庫中使用。 只要物件未列於下方章節中,複製品即不支援:
- APPLICATION ROLE
- AVAILABILITY GROUP
- COLUMNSTORE INDEX
- CDB
- CDC
- 變更追蹤 6, 7, 8
- CLR1、2
- DATABASE PROPERTIES
- DEFAULT
- FILES AND FILEGROUPS
- 全文3
- FUNCTION
- INDEX
- LOGIN
- PARTITION FUNCTION
- PARTITION SCHEME
- 程序4
- 查詢存放區2、5
- ROLE
- RULE
- SCHEMA
- SEQUENCE
- SPATIAL INDEX
- STATISTICS
- SYNONYM
- TABLE 9
- 記憶體最佳化資料表2
- Filestream 與 FileTable 物件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只有在來源資料庫上啟用時,才能複製查詢存放區資料。 若要將最新的執行階段統計資料作為查詢存放區的一部分進行複製,請先執行 sp_query_store_flush_db
,將執行階段統計資料排清到查詢存放區,再執行 DBCC CLONEDATABASE
。
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 的 Service Pack
Service Pack 是累積的。 每個新的 Service Pack 都包含先前 Service Pack 中的所有修正程式,以及任何新的修正程式。 我們建議套用該 Service Pack 的最新 Service Pack 和最新的累積更新。 安裝最新的 Service Pack 之前,您不需要安裝先前的 Service Pack。 如需最新 Service Pack 和最新累積更新的詳細資訊,請參閱 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
另請參閱
- DBCC (Transact-SQL)
- How to generate a script of the necessary database metadata to create a statistics-only database in SQL Server (如何產生必要資料庫中繼資料的指令碼,以在 SQL Server 中建立僅限統計資料的資料庫)