DBCC CLONEDATABASE (Transact-SQL)

Si applica a:SQL Server

Genera un clone solo schema di un database usando DBCC CLONEDATABASE per analizzare i problemi di prestazioni correlati a Query Optimizer.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

nome_database_di_origine

Nome del database da copiare.

target_database_name

Nome del database in cui verrà copiato il database di origine. Questo database verrà creato da DBCC CLONEDATABASE e non dovrebbe esistere già.

NO_STATISTICS

Si applica a: SQL Server 2014 (12.x) Service Pack 2 CU 3, SQL Server 2016 (13.x) Service Pack 1 e versioni successive.

Specifica se le statistiche di tabella/indice devono essere escluse dal clone. Se questa opzione non è specificata, le statistiche di tabella/indice vengono incluse automaticamente.

NO_QUERYSTORE

Si applica a: SQL Server 2016 (13.x) Service Pack 1 e versioni successive.

Specifica se i dati di Query Store devono essere esclusi dal clone. Se questa opzione non è specificata, i dati di Query Store verranno copiati nel clone se Query Store è abilitato nel database di origine.

VERIFY_CLONEDB

Si applica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 e versioni successive.

Controlla la coerenza del database. Questa opzione è obbligatoria se il database clonato è destinato all'utilizzo per la produzione. L'abilitazione VERIFY_CLONEDB disabilita anche le statistiche e la raccolta di Query Store, quindi equivale all'esecuzione WITH VERIFY_CLONEDB, NO_STATISTICS, NO_QUERYSTOREdi .

Per confermare che il database clonato è pronto per la produzione è possibile utilizzare il comando seguente:

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

SERVICEBROKER

Si applica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 e versioni successive.

Specifica se i cataloghi del sistema correlato Service Broker devono essere inclusi nel clone. L'opzione SERVICEBROKER non può essere usata in combinazione con VERIFY_CLONEDB.

BACKUP_CLONEDB

Si applica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 e versioni successive.

Crea e verifica una copia di backup del database clone. Se usato in combinazione con VERIFY_CLONEDB, il database clone viene verificato prima dell'esecuzione del backup.

Osservazioni

Le convalide seguenti vengono eseguite da DBCC CLONEDATABASE. Il comando non riesce se una delle convalide ha esito negativo.

  • Il database di origine deve essere un database utente. La clonazione di database di sistema (master, model, msdb, tempdb, distribution database e così via) non è consentita.
  • Il database di origine deve essere online e leggibile.
  • Non deve esistere già un database che utilizza lo stesso nome del database clone.
  • Il comando non si trova in una transazione utente.

Se tutte le convalide hanno esito positivo, la clonazione del database di origine viene eseguita con le operazioni seguenti:

  • Crea un nuovo database di destinazione che usa lo stesso layout di file dell'origine, ma con dimensioni predefinite del file dal model database.
  • Crea uno snapshot interno del database di origine.
  • Copia i metadati di sistema dal database di origine al database di destinazione.
  • Copia gli schemi di tutti gli oggetti dal database di origine al database di destinazione.
  • Copia le statistiche per tutti gli indici dal database di origine al database di destinazione.

Nota

Il nuovo database generato da DBCC CLONEDATABASE è destinato principalmente alla risoluzione dei problemi e alla diagnostica. Affinché il database clonato sia supportato per l'uso come database di produzione, è necessario usare l'opzione VERIFY_CLONEDB .

Tutti i file nel database di destinazione erediteranno le dimensioni e le impostazioni di crescita dal model database. I nomi di file per il database di destinazione seguiranno la <source_file_name_underscore_random number> convenzione. Se il nome file generato esiste già nella cartella di destinazione, DBCC CLONEDATABASE avrà esito negativo.

DBCC CLONEDATABASE non supporta la creazione di un clone se sono presenti oggetti utente (tabelle, indici, schemi, ruoli e così via) creati nel model database. Se nel database sono presenti model oggetti utente, il clone del database ha esito negativo e viene visualizzato il messaggio di errore seguente:

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>

Importante

Se sono presenti indici columnstore, vedere Considerazioni quando si ottimizzano le query con indici Columnstore nei database clone per aggiornare le statistiche dell'indice columnstore prima di eseguire il DBCC CLONEDATABASE comando . A partire da SQL Server 2019 (15.x), i passaggi manuali descritti nell'articolo precedente non saranno più necessari perché il DBCC CLONEDATABASE comando raccoglie automaticamente queste informazioni.

BLOB di statistiche per gli indici columnstore

A partire da SQL Server 2019 (15.x), DBCC CLONEDATABASE acquisisce automaticamente i BLOB delle statistiche per gli indici columnstore, quindi non sono necessari passaggi manuali. DBCC CLONEDATABASE crea una copia di un database con il solo schema, che include tutti gli elementi necessari per la risoluzione dei problemi di prestazioni delle query senza copiare i dati. Nelle versioni precedenti di SQL Server, il comando non ha copiato le statistiche necessarie per risolvere con precisione le query sugli indici columnstore e i passaggi manuali necessari per acquisire queste informazioni.

Per informazioni correlate alla sicurezza dei dati nei database clonati, vedere Understanding data security in cloned databases (Informazioni sulla sicurezza dei dati nei database clonati).

Snapshot interno del database

DBCC CLONEDATABASE usa uno snapshot interno del database di origine per la coerenza transazionale necessaria per eseguire la copia. L'uso dello snapshot consente di evitare problemi di blocco e concorrenza durante l'esecuzione di questi comandi. Se non è possibile creare uno snapshot, DBCC CLONEDATABASE l'operazione avrà esito negativo.

Vengono mantenuti blocchi a livello di database durante i passaggi del processo di copia seguenti:

  • Convalidare il database di origine
  • Ottenere il blocco condiviso (S) per il database di origine
  • Creare uno snapshot del database di origine
  • Creare un database clone (un database vuoto ereditato dal model database)
  • Ottenere un blocco esclusivo (X) per il database clone
  • Copiare i metadati nel database clone
  • Rilasciare tutti i blocchi del database

Non appena il comando è terminato, lo snapshot interno viene eliminato. TRUSTWORTHY Le opzioni e DB_CHAINING sono disattivate in un database clonato.

Oggetti supportati

Nel database di destinazione possono essere clonati solo gli oggetti seguenti. Gli oggetti crittografati sono clonati, ma non sono utilizzabili nel database clone. Gli oggetti non elencati nella sezione seguente non sono supportati nel clone:

  • APPLICATION ROLE
  • AVAILABILITY GROUP
  • COLUMNSTORE INDEX
  • CDB
  • CDC
  • Rilevamento modifiche 6, 7, 8
  • CLR 1, 2
  • DATABASE PROPERTIES
  • DEFAULT
  • FILES AND FILEGROUPS
  • Full-text 3
  • FUNCTION
  • INDEX
  • LOGIN
  • PARTITION FUNCTION
  • PARTITION SCHEME
  • PROCEDURA 4
  • QUERY STORE 2, 5
  • ROLE
  • RULE
  • SCHEMA
  • SEQUENCE
  • SPATIAL INDEX
  • STATISTICS
  • SYNONYM
  • TABLE
  • TABELLE OTTIMIZZATE PER LA MEMORIA 2
  • OGGETTI FILESTREAM E FILETABLE 1, 2
  • TRIGGER
  • TIPO
  • UPGRADED DB
  • USER
  • VIEW
  • XML INDEX
  • XML SCHEMA COLLECTION

1 A partire da SQL Server 2014 (12.x) Service Pack 2 CU 3.

2 A partire da SQL Server 2016 (13.x) Service Pack 1.

3 A partire da SQL Server 2016 (13.x) Service Pack 1 CU 2.

4 Le procedure Transact-SQL sono supportate in tutte le versioni a partire da SQL Server 2014 (12.x) Service Pack 2. Le procedure CLR sono supportate a partire da SQL Server 2014 (12.x) Service Pack 2 CU 3. Le procedure compilate in modo nativo sono supportate a partire da SQL Server 2016 (13.x) Service Pack 1.

5 I dati di Query Store vengono copiati solo se sono abilitati nel database di origine. Per copiare le statistiche di runtime più recenti come parte di Query Store, eseguire sp_query_store_flush_db per scaricare le statistiche di runtime in Query Store prima di eseguire DBCC CLONEDATABASE.

6 A partire da SQL Server 2016 (13.x) Service Pack 2 CU 10.

7 A partire da SQL Server 2017 (14.x) Service Pack 2 CU 17.

8 A partire da SQL Server 2019 (15.x) CU 1 e versioni successive.

Autorizzazioni

È richiesta l'appartenenza al ruolo predefinito del server sysadmin .

Messaggi del registro errori

I messaggi seguenti sono un esempio di quelli registrati nel registro errori durante il processo di clonazione:

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'.

Informazioni sui Service Pack per SQL Server

I Service Pack sono cumulativi. Ogni nuovo Service Pack contiene tutte le correzioni contenute nei Service Pack precedenti, insieme a eventuali nuove correzioni. È consigliabile applicare il Service Pack più recente e l'aggiornamento cumulativo più recente per tale Service Pack. Non è necessario installare un Service Pack precedente prima di installare il Service Pack più recente. Per altre informazioni sul Service Pack più recente e sull'aggiornamento cumulativo più recente, vedere la tabella 1 nella cronologia degli aggiornamenti più recenti e della cronologia delle versioni per SQL Server .

Nota

Il database appena generato da DBCC CLONEDATABA edizione Standard non è supportato per essere usato come database di produzione ed è destinato principalmente alla risoluzione dei problemi e alla diagnostica. È consigliabile scollegare il database clonato dopo la creazione del database.

Proprietà del database

DATABASEPROPERTYEX('dbname', 'IsClone') restituisce 1 se il database è stato generato tramite DBCC CLONEDATABASE.

DATABASEPROPERTYEX('dbname', 'IsVerifiedClone') restituisce 1 se il database è stato verificato correttamente tramite WITH VERIFY_CLONEDB.

Esempi

R. Creare un clone di un database che include schema, statistiche e Query Store

Nell'esempio seguente viene creato un clone del AdventureWorks2022 database che include schema, statistiche e dati di Query Store (SQL Server 2016 (13.x) Service Pack 1 e versioni successive:

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone);
GO

B. Creare un clone solo schema di un database senza statistiche

Nell'esempio seguente viene creato un clone del AdventureWorks2022 database che non include statistiche (SQL Server 2014 (12.x) Service Pack 2 CU 3 e versioni successive:

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH NO_STATISTICS;
GO

C. Creare un clone solo schema di un database senza statistiche e Query Store

Nell'esempio seguente viene creato un clone del AdventureWorks2022 database che non include statistiche e dati di Query Store (SQL Server 2016 (13.x) Service Pack 1 e versioni successive:

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

D. Creare un clone di un database verificato per l'uso in produzione

Nell'esempio seguente viene creato un clone solo schema del AdventureWorks2022 database senza statistiche e dati di Query Store verificati per l'uso come database di produzione (SQL Server 2016 (13.x) Service Pack 2 e versioni successive:

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH VERIFY_CLONEDB;
GO

E. Creare un clone di un database verificato per l'uso di produzione che include un backup del database clonato

Nell'esempio seguente viene creato un clone solo schema del AdventureWorks2022 database senza statistiche e dati di Query Store verificati per l'uso come database di produzione. Verrà creato anche un backup verificato del database clonato (SQL Server 2016 (13.x) Service Pack 2 e versioni successive.

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

Vedi anche