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
で生成されたデータベースの複製は、トラブルシューティングと診断のみを目的としています。 複製は、元のデータベースの読み取り専用のスキーマのみのコピーであり、オブジェクトのコピー先に制限があります。 詳細については、「 Supported オブジェクト 」セクションを参照してください。 複製データベースのその他の使用はサポートされていません。
次の検証は、DBCC CLONEDATABASE
によって実行されます。 いずれかの検証に失敗すると、コマンドは失敗となります。
- 複製元データベースはユーザー データベースにする必要があります。 システム データベース (
master
、model
、msdb
、tempdb
,distribution
データベースなど) を複製することはできません。 - 複製元データベースはオンラインにするか、読み取り可能になっている必要があります。
- クローン データベースと同じ名前を使用するデータベースがまだ作成されていないことが条件となります。
- コマンドはユーザー トランザクションで行われません。
すべての検証に成功した場合、次の操作によって複製元データベースが複製されます。
- 複製元と同じファイル レイアウトを使用した新しい複製先データベースを
model
データベースの既定のファイル サイズで作成します。 - 複製元データベースの内部スナップショットを作成します。
- 複製元から複製先のデータベースにシステム メタデータが複製されます。
- 複製元から複製先のデータベースに全オブジェクトの全スキーマが複製されます。
- 複製元から複製先のデータベースに全インデックスの統計が複製されます。
複製先データベースの全ファイルが model
データベースからサイズと増加設定を継承します。 複製先データベースのファイル名は、<source_file_name_underscore_random number>
という規則に従います。 生成されたファイル名が複製先のフォルダーに既に存在する場合、DBCC CLONEDATABASE
は失敗します。
DBCC CLONEDATABASE
では、model
データベースでユーザー オブジェクト (テーブル、インデックス、スキーマ、ロールなど) が作成されている場合、クローンを作成できません。 ユーザー オブジェクトが 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
コマンドを実行する前に列ストア インデックス統計を更新してください。 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) ロックを取得する
- クローン データベースにメタデータを複製する
- すべてのデータベース ロックを解除する
コマンドが実行を終えると、内部スナップショットが削除されます。 複製されたデータベースでは、TRUSTWORTHY
および DB_CHAINING
オプションがオフになります。
サポート対象のオブジェクト
次のオブジェクトのみ、複製先のデータベースで複製できます。 暗号化されたオブジェクトは複製されますが、クローン データベースでは使用できません。 次のセクションに記載されていないオブジェクトはクローンでサポートされていません。
- APPLICATION ROLE
- AVAILABILITY GROUP
- COLUMNSTORE INDEX
- CDB
- CDC
- Change Tracking 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
- TABLE 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 Transact-SQL プロシージャは、SQL Server 2014 (12.x) Service Pack 2 以降のすべてのリリースでサポートされています。 CLR プロシージャは、SQL Server 2014 (12.x) Service Pack 2 CU3 以降でサポートされています。 ネイティブ コンパイルされたプロシージャは、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 の Service Pack について
Service Pack は累積的なものです。 新しい各サービス パックには、以前の Service Pack にあるすべての修正プログラムと新しい修正プログラムが含まれています。 最新の Service Pack と、その Service Pack の最新の累積的な更新プログラムを適用することをおすすめします。 最新の Service Pack をインストールする前に、以前の Service Pack をインストールする必要はありません。 最新の Service Pack と最新の累積的な更新プログラムの詳細については、SQL Server の最新の更新プログラムとバージョン履歴の表 1 を参照してください。
Note
DBCC CLONEDATABA Standard Edition から新しく生成されたデータベースは、運用データベースとして使用することはサポートされておらず、主にトラブルシューティングと診断を目的としています。 データベースの作成後に、複製されたデータベースをデタッチすることをおすすめします。
データベース プロパティ
DATABASEPROPERTYEX('dbname', 'IsClone')
は、データベースが DBCC CLONEDATABASE
を使用して生成された場合に 1 を返します。
DATABASEPROPERTYEX('dbname', 'IsVerifiedClone')
は、データベースが VERIFY_CLONEDB
を使用して正常に検証された場合に 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 CU3 以降のバージョン)。
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