DBCC CLONEDATABASE (Transact-SQL)

Se aplica a:SQL Server

Genera un clon de solo esquema de una base de datos mediante DBCC CLONEDATABASE para investigar problemas de rendimiento relacionados con el optimizador de consultas.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

source_database_name

El nombre de la base de datos que se va a copiar.

target_database_name

El nombre de la base de datos en la que se copiará la base de datos de origen. DBCC CLONEDATABASE creará esta base de datos, que no debería existir.

NO_STATISTICS

Se aplica a: SQL Server 2014 (12.x) Service Pack 2 CU 3, SQL Server 2016 (13.x) Service Pack 1 y versiones posteriores.

Especifica si las estadísticas de tabla o índice se deben excluir de la clonación. Si no se especifica esta opción, se incluirán automáticamente estadísticas de tabla o de índice.

NO_QUERYSTORE

Se aplica a: SQL Server 2016 (13.x) Service Pack 1 y versiones posteriores.

Especifica si los datos del Almacén de consultas se deben excluir del clon. Si no se especifica esta opción, los datos del Almacén de consultas se copiarán en el clon si el Almacén de consultas está habilitado en la base de datos de origen.

VERIFY_CLONEDB

Se aplica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 y versiones posteriores.

Comprueba la coherencia de la base de datos nueva. Esta opción es necesaria si la base de datos clonada está pensada para usarse en producción. Habilitar VERIFY_CLONEDB también deshabilita las estadísticas y la recopilación del Almacén de consultas, lo que equivale a ejecutar WITH VERIFY_CLONEDB, NO_STATISTICS, NO_QUERYSTORE.

El comando siguiente se puede usar para confirmar que la base de datos clonada está preparada para usarse en producción:

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

SERVICEBROKER

Se aplica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 y versiones posteriores.

Especifica si los catálogos del sistema relacionados con Service Broker deben incluirse en el clon. La opción SERVICEBROKER no se puede usar en combinación con VERIFY_CLONEDB.

BACKUP_CLONEDB

Se aplica a: SQL Server 2014 (12.x) Service Pack 3, SQL Server 2016 (13.x) Service Pack 2, SQL Server 2017 (14.x) CU 8 y versiones posteriores.

Crea y comprueba una copia de seguridad de la base de datos clonada. Si se usa en combinación con VERIFY_CLONEDB, la base de datos clonada se comprueba antes de que se realice la copia de seguridad.

Comentarios

Las validaciones siguientes las realiza DBCC CLONEDATABASE. Se produce un error en el comando si alguna de las validaciones no se efectúa correctamente.

  • La base de datos de origen debe ser una base de datos de usuario. No se permite la clonación de bases de datos del sistema (bases de datos master, model, msdb, tempdb, distribution, etc.).
  • La base de datos de origen debe ser legible o estar en línea.
  • No puede existir una base de datos que use el mismo nombre que la base de datos clonada.
  • El comando no se encuentra en una transacción de usuario.

Si todas las validaciones se efectúan correctamente, la clonación de la base de datos de origen se lleva a cabo mediante las siguientes operaciones:

  • Crea una base de datos de destino que usa el mismo diseño de archivo como origen, pero tiene tamaños de archivo predeterminados de la base de datos model.
  • Crea una instantánea interna de la base de datos de origen.
  • Copia los metadatos del sistema de la base de datos de origen a la base de datos de destino.
  • Copia todos los esquemas de todos los objetos de la base de datos de origen a la base de datos de destino.
  • Copia las estadísticas de todos los índices de la base de datos de origen a la base de datos de destino.

Nota

La nueva base de datos generada a partir de DBCC CLONEDATABASE sirve principalmente para fines de diagnóstico y de solución de problemas. Para que la base de datos clonada se pueda usar como base de datos de producción, se debe usar la opción VERIFY_CLONEDB.

Todos los archivos de la base de datos de destino heredarán la configuración de tamaño y crecimiento de la base de datos model. Los nombres de archivo para la base de datos de destino siguen la convención <source_file_name_underscore_random number>. Si el nombre del archivo generado ya existe en la carpeta de destino, se producirá un error en DBCC CLONEDATABASE.

DBCC CLONEDATABASE no admite la creación de un clon si hay algún objeto de usuario (tablas, índices, esquemas, roles, etc.) que se ha creado en la base de datos model. Si hay objetos de usuario en la base de datos model, se produce un error en el clon de la base de datos con el siguiente mensaje de error:

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

Si tiene índices de almacén de columnas, vea Consideraciones al optimizar las consultas con índices de almacén de columnas en las bases de datos clonadas para actualizar las estadísticas de los índices de almacén de columnas antes de ejecutar el comando DBCC CLONEDATABASE. A partir de SQL Server 2019 (15.x), los pasos manuales descritos en el artículo anterior ya no serán necesarios, ya que el comando DBCC CLONEDATABASE recopila esta información automáticamente.

Blob de estadísticas para los índices de almacén de columnas

A partir de SQL Server 2019 (15.x), DBCC CLONEDATABASE captura automáticamente los blobs de estadísticas de índices de almacén de columnas, por lo que no es necesario realizar ningún paso manual. DBCC CLONEDATABASE crea una copia de solo esquema de una base de datos que incluye todos los elementos necesarios para solucionar problemas de rendimiento de consultas sin copiar los datos. En versiones anteriores de SQL Server, el comando no copiaba las estadísticas necesarias para solucionar con precisión los problemas de las consultas del índice de almacén de columnas y se tenían que realizar pasos manuales para capturar esta información.

Para obtener información relacionada con la seguridad de los datos en bases de datos clonadas, vea Understanding data security in cloned databases (Descripción de la seguridad de los datos en bases de datos clonadas).

Instantánea de base de datos interna

DBCC CLONEDATABASE usa una instantánea de base de datos interna de la base de datos de origen para la coherencia transaccional que se necesita para realizar la copia. Con esta instantánea se evitan problemas de bloqueo y de simultaneidad cuando se ejecutan estos comandos. Si no se puede crear una instantánea, se producirá un error en DBCC CLONEDATABASE.

Durante los siguientes pasos del proceso de copia se mantienen bloqueos de nivel de base de datos:

  • Validar la base de datos de origen
  • Obtener el bloqueo S compartido para la base de datos de origen
  • Crear una instantánea de la base de datos de origen
  • Crear una base de datos clonada (una base de datos vacía heredada de la base de datos model)
  • Obtener el bloqueo X exclusivo para la base de datos clonada
  • Copiar los metadatos en la base de datos clonada
  • Liberar todos los bloqueos de base de datos

Tan pronto como el comando haya terminado de ejecutarse, se quitará la instantánea interna. Las opciones TRUSTWORTHY y DB_CHAINING están desactivadas en una base de datos clonada.

Objetos admitidos

Solo se pueden clonar los siguientes objetos en la base de datos de destino. Los objetos cifrados se clonan, pero no se pueden usar en la base de datos clonada. Los objetos que no figuran en la siguiente sección no se admiten en el clon:

  • APPLICATION ROLE
  • AVAILABILITY GROUP
  • COLUMNSTORE INDEX
  • CDB
  • CDC
  • Change Tracking 6, 7, 8
  • CLR 1, 2
  • DATABASE PROPERTIES
  • DEFAULT
  • FILES AND FILEGROUPS
  • Full text 3
  • FUNCTION
  • INDEX
  • LOGIN
  • PARTITION FUNCTION
  • PARTITION SCHEME
  • PROCEDURE 4
  • QUERY STORE 2, 5
  • ROLE
  • RULE
  • SCHEMA
  • SEQUENCE
  • SPATIAL INDEX
  • STATISTICS
  • SYNONYM
  • TABLE
  • MEMORY OPTIMIZED TABLES 2
  • FILESTREAM AND FILETABLE OBJECTS 1, 2
  • TRIGGER
  • TYPE
  • UPGRADED DB
  • USER
  • VIEW
  • XML INDEX
  • XML SCHEMA COLLECTION

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

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

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

4 Los procedimientos de Transact-SQL se admiten en todas las versiones a partir de SQL Server 2014 (12.x) Service Pack 2. Los procedimientos CLR se admiten a partir de SQL Server 2014 (12.x) Service Pack 2 CU 3. Los procedimientos compilados de forma nativa se admiten a partir de SQL Server 2016 (13.x) Service Pack 1.

5 Los datos de Almacén de consultas solo se copian si están habilitados en la base de datos de origen. Para copiar las estadísticas en tiempo de ejecución más recientes como parte del Almacén de consultas, ejecute sp_query_store_flush_db para vaciar las estadísticas en tiempo de ejecución en el Almacén de consultas antes de ejecutar DBCC CLONEDATABASE.

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

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

8 A partir de SQL Server 2019 (15.x) CU 1 y las versiones posteriores.

Permisos

Requiere la pertenencia al rol fijo de servidor sysadmin .

Mensajes de registro de error

Los siguientes mensajes son un ejemplo de los mensajes registrados en el registro de errores durante el proceso de clonación:

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

Acerca de Service Packs para SQL Server

Los Service Packs son acumulativos. Cada nuevo Service Pack contiene todas las correcciones que se encuentran en los service packs anteriores, junto con las nuevas correcciones. Nuestra recomendación es aplicar el Service Pack más reciente y la actualización acumulativa más reciente para ese Service Pack. No tiene que instalar un Service Pack anterior antes de instalar el Service Pack más reciente. Consulte la tabla 1 en Actualizaciones e historial de versiones más recientes para SQL Server para obtener más información sobre el Service Pack más reciente y la actualización acumulativa más reciente.

Nota:

La base de datos recién generada a partir de DBCC CLONEDATABASE no se admite para usarse como base de datos de producción y está pensada principalmente para la solución de problemas y el diagnóstico. Se recomienda desasociar la base de datos clonada después de crear la base de datos.

Propiedades de la base de datos

DATABASEPROPERTYEX('dbname', 'IsClone') devolverá 1 si la base de datos se generó mediante DBCC CLONEDATABASE.

DATABASEPROPERTYEX('dbname', 'IsVerifiedClone') devolverá 1 si la base de datos se ha comprobado correctamente con WITH VERIFY_CLONEDB.

Ejemplos

A. Creación de un clon de una base de datos que incluye un esquema, estadísticas y un Almacén de consultas

En el ejemplo siguiente se crea un clon de la base de datos AdventureWorks2022 que incluye datos de esquema, de estadísticas y de Almacén de consultas (SQL Server 2016 (13.x) Service Pack 1 y versiones posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone);
GO

B. Creación de un clon de solo esquema de una base de datos sin estadísticas

En el ejemplo siguiente se crea un clon de la base de datos AdventureWorks2022 que no incluye estadísticas (SQL Server 2014 (12.x) Service Pack 2 CU 3 y versiones posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH NO_STATISTICS;
GO

C. Creación de un clon de solo esquema de una base de datos sin estadísticas y sin Almacén de consultas

En el ejemplo siguiente se crea un clon de la base de datos AdventureWorks2022 que no incluye datos de estadísticas y de Almacén de consultas (SQL Server 2016 (13.x) Service Pack 1 y versiones posteriores):

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

D. Creación de un clon de una base de datos que se comprueba para su uso en producción

En el ejemplo siguiente se crea un clon de solo esquema de la base de datos AdventureWorks2022 sin datos de estadísticas ni de Almacén de consultas que se comprueba para su uso como base de datos de producción (SQL Server 2016 (13.x) Service Pack 2 y versiones posteriores):

DBCC CLONEDATABASE (AdventureWorks2022, AdventureWorks_Clone) WITH VERIFY_CLONEDB;
GO

E. Creación de un clon de una base de datos que se comprueba para su uso en producción que incluye una copia de seguridad de la base de datos clonada

En el ejemplo siguiente se crea un clon de solo esquema de la base de datos AdventureWorks2022 sin datos de estadísticas ni de Almacén de consultas que se comprueba para su uso como base de datos de producción. También se creará una copia de seguridad comprobada de la base de datos clonada (SQL Server 2016 (13.x) Service Pack 2 y versiones posteriores).

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

Consulte también