DBCC CLONEDATABASE (Transact-SQL)

Se aplica a: SQL Server (todas las versiones admitidas)

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.

Icono de vínculo de temaConvenciones 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
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. Esta opción está disponible a partir de SQL Server 2014 (12.x) SP2 CU3 y SQL Server 2016 (13.x) SP1.

NO_QUERYSTORE
Especifica si se deben excluir del clon los datos del almacén de consultas. 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. Esta opción solo está disponible a partir de SQL Server 2016 (13.x) SP1.

VERIFY_CLONEDB
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. La acción de habilitar VERIFY_CLONEDB también deshabilita la recopilación de estadísticas y del almacén de consultas, por lo que equivale a ejecutar WITH VERIFY_CLONEDB, NO_STATISTICS y NO_QUERYSTORE. Esta opción está disponible a partir de SQL Server 2014 (12.x) SP3, SQL Server 2016 (13.x) SP2 y SQL Server 2017 (14.x) CU8.

Nota

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
Especifica si los catálogos del sistema relacionados con Service Broker deben incluirse en el clon. No se puede usar la opción SERVICEBROKER en combinación con VERIFY_CLONEDB. Esta opción está disponible a partir de SQL Server 2014 (12.x) SP3, SQL Server 2016 (13.x) SP2 y SQL Server 2017 (14.x) CU8.

BACKUP_CLONEDB
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. Esta opción está disponible a partir de SQL Server 2014 (12.x) SP3, SQL Server 2016 (13.x) SP2 y SQL Server 2017 (14.x) CU8.

Observaciones

DBCC CLONEDATABASE lleva a cabo las siguientes validaciones. 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 clonar bases de datos del sistema (master, model, msdb, tempdb, bases de datos de distribución, 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 modelo.
  • 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 modelo. Los nombres de archivo de la base de datos de destino seguirán la convención de números source_file_name _underscore_random. 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 modelo. Si hay objetos de usuario en la base de datos modelo, 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, 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

En 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 copió las estadísticas necesarias para solucionar con precisión los problemas de las consultas del índice de almacén de columnas y se tuvieron 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 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 modelo)
  • Obtener el bloqueo X 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
  • CLR (a partir de SQL Server 2014 (12.x) SP2 CU3, SQL Server 2016 (13.x) SP1 y versiones posteriores)
  • DATABASE PROPERTIES
  • DEFAULT
  • FILES AND FILEGROUPS
  • Texto completo (a partir de SQL Server 2016 (13.x) SP1 CU2)
  • FUNCTION
  • INDEX
  • LOGIN
  • PARTITION FUNCTION
  • PARTITION SCHEME
  • PROCEDURE

Nota

Los procedimientos de Transact-SQL se admiten en todas las versiones a partir de SQL Server 2014 (12.x) SP2. Los procedimientos CLR se admiten a partir de SQL Server 2014 (12.x) SP2 CU3. Los procedimientos compilados de forma nativa se admiten a partir de SQL Server 2016 (13.x) SP1.

  • QUERY STORE (a partir de SQL Server 2016 (13.x) SP1)

Nota

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.

  • ROLE
  • RULE
  • SCHEMA
  • SEQUENCE
  • SPATIAL INDEX
  • STATISTICS
  • SYNONYM
  • TABLE
  • MEMORY OPTIMIZED TABLES (solo en SQL Server 2016 (13.x) SP1 y versiones posteriores).
  • FILESTREAM AND FILETABLE OBJECTS (a partir de SQL Server 2014 (12.x) SP2 CU3, SQL Server 2016 (13.x) SP1 y versiones posteriores).
  • TRIGGER
  • TYPE
  • UPGRADED DB
  • USER
  • VIEW
  • XML INDEX
  • XML SCHEMA COLLECTION

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

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. Crear 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 AdventureWorks que incluye datos de esquema, de estadísticas y de almacén de consultas (SQL Server 2016 (13.x) SP1 y versiones posteriores)

DBCC CLONEDATABASE (AdventureWorks, AdventureWorks_Clone);    
GO 

B. Crear 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 AdventureWorks que no incluye estadísticas (SQL Server 2014 (12.x) SP2 CU3 y versiones posteriores)

DBCC CLONEDATABASE (AdventureWorks, AdventureWorks_Clone) WITH NO_STATISTICS;    
GO 

C. Crear 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 AdventureWorks que no incluye datos de estadísticas ni de almacén de consultas (SQL Server 2016 (13.x) SP1 y versiones posteriores)

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

D. Crear 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 AdventureWorks 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) SP2 y versiones posteriores).

DBCC CLONEDATABASE (AdventureWorks, AdventureWorks_Clone) WITH VERIFY_CLONEDB;    
GO 

E. Crear 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 AdventureWorks 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) SP2 y versiones posteriores).

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

Consulte también

DBCC (Transact-SQL)
Cómo generar un script de los metadatos de base de datos necesarios para crear una base de datos de solo estadísticas en SQL Server