DBCC CLONEDATABASE (Transact-SQL)

Aplica-se a:SQL Server

Gera um clone somente de esquema de um banco de dados usando DBCC CLONEDATABASE para investigar problemas de desempenho relacionados ao otimizador de consulta.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

Para ver a sintaxe do Transact-SQL para o SQL Server 2014 e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

source_database_name

É o nome do banco de dados a ser copiado.

target_database_name

É o nome do banco de dados para o qual o banco de dados de origem será copiado. Este banco de dados será criado por DBCC CLONEDATABASE e não deve já existir.

NO_STATISTICS

Aplica-se a: SQL Server 2014 (12.x) Service Pack 2 CU 3, SQL Server 2016 (13.x) Service Pack 1 e versões posteriores.

Especifica se as estatísticas de tabela/índice precisam ser excluídas do clone. Se esta opção não for especificada, as estatísticas de tabela/índice serão incluídas automaticamente.

NO_QUERYSTORE

Aplica-se a: SQL Server 2016 (13.x) Service Pack 1 e versões posteriores.

Especifica se os dados do Repositório de Consultas precisam ser excluídos do clone. Se esta opção não for especificada, quando o Repositório de Consultas estiver habilitado no banco de dados de origem, os dados do Repositório de Consultas serão copiados para o clone.

VERIFY_CLONEDB

Aplica-se 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 versões posteriores.

Verifica a consistência do novo banco de dados. Essa opção é necessária se o banco de dados clonado é destinado ao uso de produção. A habilitação de VERIFY_CLONEDB também desabilita as estatísticas e a coleta do Repositório de Consultas, portanto, é equivalente a executar WITH VERIFY_CLONEDB, NO_STATISTICS, NO_QUERYSTORE.

O comando a seguir pode ser usado para confirmar se o banco de dados clonado está pronto para produção:

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

SERVICEBROKER

Aplica-se 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 versões posteriores.

Especifica se os catálogos de sistema relacionados ao Service Broker devem ser incluídos no clone. A opção SERVICEBROKER não pode ser usada com VERIFY_CLONEDB.

BACKUP_CLONEDB

Aplica-se 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 versões posteriores.

Cria e verifica se um backup do banco de dados do clone. Se usado com VERIFY_CLONEDB, o banco de dados de clone é verificado antes da realização do backup.

Comentários

As validações a seguir são executadas por DBCC CLONEDATABASE. O comando falhará se alguma das validações falhar.

  • O banco de dados de origem deve ser um banco de dados de usuário. A clonagem de bancos de dados do sistema (como master, model, msdb, tempdb, distribution, entre outros) não é permitida.
  • O banco de dados de origem deve estar online e legível.
  • Um banco de dados que usa o mesmo nome do banco de dados do clone não deve existir.
  • O comando não está em uma transação de usuário.

Se todas as validações forem bem-sucedidas, a clonagem do banco de dados de origem será executada pelas seguintes operações:

  • Cria um banco de dados de destino que usa o mesmo layout de arquivo que o de origem, mas com os tamanhos de arquivo padrão do banco de dados model.
  • Cria um instantâneo interno do banco de dados de origem.
  • Copia os metadados do sistema da origem para o banco de dados de destino.
  • Copia todo o esquema para todos os objetos da origem para o banco de dados de destino.
  • Copia estatísticas para todos os índices da origem para o banco de dados de destino.

Observação

O novo banco de dados gerado por meio de DBCC CLONEDATABASE destina-se principalmente para fins de diagnóstico e solução de problemas. Para que o banco de dados clonado tenha suporte para uso como um banco de dados de produção, a opção VERIFY_CLONEDB deve ser usada.

Todos os arquivos no banco de dados de destino herdarão as configurações de tamanho e crescimento do banco de dados model. Os nomes de arquivo para o banco de dados de destino seguirão a convenção <source_file_name_underscore_random number>. Se o nome de arquivo gerado já existir na pasta de destino, DBCC CLONEDATABASE falhará.

DBCC CLONEDATABASE não dá suporte à criação de um clone quando há objetos de usuário (tabelas, índices, esquemas, funções e assim por diante) que foram criados no banco de dados model. Se objetos do usuário estiverem presentes no banco de dados model, o clone do banco de dados falhará com a seguinte mensagem de erro:

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 você tiver índices columnstore, veja Considerações ao ajustar as consultas com índices Columnstore em bancos de dados do clone para atualizar as estatísticas de índice columnstore antes de executar o comando DBCC CLONEDATABASE. Desde o SQL Server 2019 (15.x), as etapas manuais descritas no artigo acima não são mais necessárias, pois o comando DBCC CLONEDATABASE coleta essas informações automaticamente.

Blob de estatísticas para índices columnstore

Desde o SQL Server 2019 (15.x), DBCC CLONEDATABASE captura automaticamente os blobs de estatísticas dos índices columnstore, portanto, nenhuma etapa manual é necessária. O DBCC CLONEDATABASE cria uma cópia somente de esquema de um banco de dados que inclui todos os elementos necessários para solucionar problemas de desempenho de consulta sem copiar os dados. Nas versões anteriores do SQL Server, o comando não copiava as estatísticas necessárias para solucionar com precisão os problemas de consultas de índice columnstore e eram necessárias etapas manuais para capturar essas informações.

Para obter informações relacionadas à segurança de dados em bancos de dados clonados, veja Noções básicas sobre segurança de dados em bancos de dados clonados.

Instantâneo de banco de dados interno

DBCC CLONEDATABASE usa um instantâneo de banco de dados interno do banco de dados de origem para a consistência transacional necessária a fim de executar a cópia. O uso desse instantâneo evita bloqueio e problemas de simultaneidade quando esses comandos são executados. Se não for possível criar um instantâneo, DBCC CLONEDATABASE falhará.

Bloqueios de nível de banco de dados são mantidos durante as seguintes etapas do processo de cópia:

  • Validar o banco de dados de origem
  • Obter um bloqueio compartilhado (S) para o banco de dados de origem
  • Cria um instantâneo do banco de dados de origem
  • Criar um banco de dados clone (um banco de dados vazio herdado do banco de dados model)
  • Obter um bloqueio exclusivo (X) para o banco de dados clone
  • Copiar os metadados para o banco de dados do clone
  • Liberar todos os bloqueios do banco de dados

Assim que o comando tiver concluído a execução, o instantâneo interno será descartado. As opções TRUSTWORTHY e DB_CHAINING estão desativadas em um banco de dados clonado.

Objetos com suporte

Somente os seguintes objetos podem ser clonados no banco de dados de destino. Objetos criptografados são clonados, mas não podem ser usados no banco de dados de clones. Qualquer objeto que não esteja listado na seção a seguir não tem suporte no clone:

  • APPLICATION ROLE
  • AVAILABILITY GROUP
  • COLUMNSTORE INDEX
  • CDB
  • CDC
  • Controle de alterações 6, 7, 8
  • CLR 1, 2
  • DATABASE PROPERTIES
  • DEFAULT
  • FILES AND FILEGROUPS
  • Texto completo 3
  • FUNCTION
  • INDEX
  • LOGIN
  • PARTITION FUNCTION
  • PARTITION SCHEME
  • PROCEDIMENTO 4
  • REPOSITÓRIO DE CONSULTAS 2, 5
  • ROLE
  • RULE
  • SCHEMA
  • SEQUENCE
  • SPATIAL INDEX
  • STATISTICS
  • SYNONYM
  • TABLE
  • TABELAS OTIMIZADAS PARA MEMÓRIA 2
  • OBJETOS DE TABELA DE ARQUIVOS E FLUXO DE ARQUIVOS 1, 2
  • TRIGGER
  • TYPE
  • UPGRADED DB
  • USER
  • VIEW
  • XML INDEX
  • XML SCHEMA COLLECTION

1 A partir do SQL Server 2014 (12.x) Service Pack 2 CU 3.

2 A partir do SQL Server 2016 (13.x) Service Pack 1.

3 A partir do SQL Server 2016 (13.x) Service Pack 1 CU 2.

4 Os procedimentos de Transact-SQL são compatíveis em todas as versões a partir do SQL Server 2014 (12.x) Service Pack 2. Os procedimentos CLR são compatíveis a partir do SQL Server 2014 (12.x) Service Pack 2 CU 3. Os procedimentos compilados nativamente são compatíveis a partir do SQL Server 2016 (13.x) Service Pack 1.

5 Os dados do Repositório de Consultas são copiados apenas quando a cópia está habilitada no banco de dados de origem. Para copiar as estatísticas de runtime mais recentes como parte do Repositório de Consultas, execute sp_query_store_flush_db a fim de liberá-las para o Repositório de Consultas antes de executar DBCC CLONEDATABASE.

6 A partir do SQL Server 2016 (13.x) Service Pack 2 CU 10.

7 A partir do SQL Server 2017 (14.x) Service Pack 2 CU 17.

8 A partir do SQL Server 2019 (15.x) CU 1 e versões posteriores.

Permissões

Exige associação à função de servidor fixa sysadmin .

Mensagens de log de erros

As mensagens a seguir são um exemplo de como as mensagens são registradas no log de erros durante o processo de clonagem:

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

Sobre service packs para o SQL Server

Os service packs são cumulativos. Cada novo service pack contém todas as correções que estão nos service packs anteriores, juntamente com quaisquer novas correções. Nossa recomendação é aplicar o service pack mais recente e a atualização cumulativa mais recente para esse service pack. Não é necessário instalar um service pack anterior antes de instalar o service pack mais recente. Consulte a Tabela 1 em Atualizações mais recentes e histórico de versões do SQL Server para obter mais informações sobre o service pack mais recente e a atualização cumulativa mais recente.

Observação

O banco de dados recém-criado a partir do DBCC CLONEDATABASE não tem suporte para ser usado como banco de dados de produção e destina-se principalmente à solução de problemas e a fins de diagnóstico. Recomendamos desconectar o banco de dados clonado depois que o banco de dados for criado.

Propriedades do banco de dados

DATABASEPROPERTYEX('dbname', 'IsClone') retornará 1 se o banco de dados tiver sido gerado usando DBCC CLONEDATABASE.

DATABASEPROPERTYEX('dbname', 'IsVerifiedClone') retornará 1 se o banco de dados tiver sido verificado com sucesso por meio de WITH VERIFY_CLONEDB.

Exemplos

A. Criar um clone de um banco de dados que inclua o esquema, as estatísticas e o Repositório de Consultas

O exemplo a seguir cria um clone do banco de dados AdventureWorks2022 que inclui o esquema, as estatísticas e os dados do Repositório de Consultas (SQL Server 2016 (13.x) Service Pack 1 e versões posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone);
GO

B. Criar um clone somente de esquema de um banco de dados sem estatísticas

O exemplo a seguir cria um clone do banco de dados AdventureWorks2022 que não inclui estatísticas (SQL Server 2014 (12.x) Service Pack 2 CU 3 e versões posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH NO_STATISTICS;
GO

C. Criar um clone somente de esquema de um banco de dados sem estatísticas e do Repositório de Consultas

O exemplo a seguir cria um clone do banco de dados AdventureWorks2022 que não inclui estatísticas nem dados do Repositório de Consultas (SQL Server 2016 (13.x) Service Pack 1 e versões posteriores):

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

D. Criar um clone de um banco de dados verificado para uso em produção

O exemplo a seguir cria um clone somente de esquema do banco de dados AdventureWorks2022 sem estatísticas nem dados do Repositório de Consultas que é verificado para uso como um banco de dados de produção (SQL Server 2016 (13.x) Service Pack 2 e versões posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH VERIFY_CLONEDB;
GO

E. Criar um clone de um banco de dados verificado para uso em produção que inclua um backup do banco de dados clonado

O exemplo a seguir cria um clone somente de esquema do banco de dados AdventureWorks2022 sem estatísticas nem dados do Repositório de Consultas que é verificado para uso como um banco de dados de produção. Um backup verificado do banco de dados clonado também será criado (SQL Server 2016 (13.x) Service Pack 2 e versões posteriores).

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

Confira também