DBCC CHECKTABLE (Transact-SQL)
Comprueba la integridad de todas las páginas y estructuras que constituyen la tabla o la vista indizada.
Nota |
|---|
Para llevar a cabo una operación DBCC CHECKTABLE en todas las tablas de la base de datos, utilice DBCC CHECKDB. |
En la tabla especificada, DBCC CHECKTABLE comprueba lo siguiente:
Las páginas de índice, consecutivas, de objetos grandes (LOB) y de datos de desbordamiento de fila están vinculadas correctamente.
Los índices se encuentran en el orden correcto.
Los punteros son coherentes.
Los datos de cada página son razonables, incluidas las columnas calculadas.
Los desplazamientos de página son razonables.
Cada fila de la tabla base tiene una fila correspondiente en cada índice no clúster y viceversa.
Todas las filas de un índice o tabla con particiones están en la partición correcta.
Coherencia de nivel de vínculo entre la tabla y el sistema de archivos cuando se almacenan datos varbinary(max) en el sistema de archivos utilizando FILESTREAM.
Realizar comprobaciones de coherencia lógica en índices
La comprobación de coherencia lógica en índices varía según el nivel de compatibilidad de la base de datos, tal como se indica a continuación:
Si el nivel de compatibilidad es 100 (SQL Server 2008) o superior:
A menos que se especifique NOINDEX, DBCC CHECKTABLE realiza comprobaciones de coherencia física y lógica en una sola tabla y en todos sus índices no clúster. Sin embargo, en los índices XML, índices espaciales y vistas indizadas solo se realizan comprobaciones de coherencia física de forma predeterminada.
Si se especifica WITH EXTENDED_LOGICAL_CHECKS, se realizarán comprobaciones lógicas en una vista indizada, en índices XML e índices espaciales, en caso de que los hubiese. De forma predeterminada, las comprobaciones de coherencia física se realizan antes que las comprobaciones de coherencia lógica. Si se especifica también NOINDEX, solo se realizarán las comprobaciones lógicas.
Estas comprobaciones de coherencia lógica realizan una comprobación cruzada de la tabla de índices interna del objeto de índice con la tabla de usuario a la que hace referencia. Para buscar las filas periféricas, se crea una consulta interna que lleve a cabo una intersección completa de las tablas internas y del usuario. La ejecución de esta consulta puede afectar mucho al rendimiento y no se puede realizar el seguimiento de su progreso. Por consiguiente, se recomienda especificar únicamente WITH EXTENDED_LOGICAL_CHECKS si cree que existen problemas del índice que no estén relacionados con daños físicos, o si las sumas de comprobación del nivel de página se han desactivado y sospecha que puedan existir daños de hardware de nivel de columna.
Si el índice es un índice filtrado, DBCC CHECKDB realizará las comprobaciones de coherencia para comprobar que las entradas de índice satisfacen el predicado de filtro.
Si el nivel de compatibilidad es 90 o menos, a menos que se especifique NOINDEX, DBCC CHECKTABLE realizará las comprobaciones de coherencia física y lógica en una tabla única o vista indizada y en todos sus índices XML y no cluster. Los índices espaciales no se admiten.
Conocer el nivel de compatibilidad de una base de datos
Instantánea de base de datos interna
DBCC CHECKTABLE utiliza una instantánea de base de datos interna para proporcionar la coherencia transaccional que debe tener para realizar estas comprobaciones. Para obtener más información, vea Descripción del tamaño de los archivos dispersos en instantáneas de bases de datos y la sección sobre el uso de la instantánea de la base de datos interna DBCC en DBCC (Transact-SQL).
Si no se puede crear una instantánea, o se ha especificado TABLOCK, DBCC CHECKTABLE adquiere un bloqueo de tabla compartido para lograr la coherencia requerida.
Nota |
|---|
Si DBCC CHECKTABLE se ejecuta con tempdb, debe adquirir un bloqueo de tabla compartido. Esto es debido a que, por motivos de rendimiento, las instantáneas de la base de datos no están disponibles en tempdb. Eso significa que no es posible obtener la coherencia transaccional necesaria. |
Comprobar y reparar datos de FILESTREAM
Cuando FILESTREAM está habilitado para una base de datos y una tabla, puede almacenar opcionalmente los objetos binarios grandes (BLOB) varbinary(max) en el sistema de archivos. Al utilizar DBCC CHECKTABLE en una tabla que almacena objetos BLOB en el sistema de archivos, DBCC comprueba la coherencia de nivel de vínculo entre el sistema de archivos y la base de datos.
Por ejemplo, si una tabla contiene una columna varbinary(max) que utiliza el atributo FILESTREAM, DBCC CHECKTABLE comprobará que existe una asignación uno a uno entre los directorios del sistema de archivos y los archivos y filas de tabla, las columnas, y los valores de columna. DBCC CHECKTABLE puede reparar el daño producido si especifica la opción de REPAIR_ALLOW_DATA_LOSS. Para reparar el daño de FILESTREAM, DBCC quitará todas las filas de tabla a las que les falten datos del sistema de archivos, así como todos los directorios y archivos no asignados a una fila de tabla, columna o valor de columna.
Comprobar objetos en paralelo
De forma predeterminada, DBCC CHECKTABLE realiza comprobaciones paralelas de los objetos. El grado de paralelismo se determina automáticamente mediante el procesador de consultas. El grado de paralelismo máximo se configura de la misma forma que el de las consultas paralelas. Para restringir el número máximo de procesadores disponibles para las comprobaciones DBCC, use sp_configure. Para obtener más información, vea max degree of parallelism (opción).
La comprobación del paralelismo se puede deshabilitar utilizando el marcador de seguimiento 2528. Para obtener más información, vea Marcas de seguimiento (Transact-SQL).
Nota |
|---|
Durante una operación DBCC CHECKTABLE, los bytes almacenados en una columna de tipo definido por el usuario ordenada por bytes deben ser iguales a la serialización calculada del valor del tipo definido por el usuario. Si no es así, la rutina DBCC CHECKTABLE indicará un error de coherencia. |
Descripción de los mensajes de error de DBCC
Cuando finaliza el comando DBCC CHECKTABLE, se escribe un mensaje en el registro de errores de SQL Server. Si el comando DBCC se ejecuta correctamente, el mensaje lo indica, así como el tiempo de ejecución del comando. Si el comando DBCC se detiene antes de finalizar la comprobación debido a un error, el mensaje indica que el comando se ha cancelado, un valor de estado y el tiempo de ejecución del comando. En la tabla siguiente se muestran y describen los valores de estado que pueden aparecer en el mensaje.
Estado | Descripción |
|---|---|
0 | Se ha generado el error número 8930. Indica un daño en los metadatos que provoca la cancelación del comando DBCC. |
1 | Se ha generado el error número 8967. Error DBCC interno. |
2 | Error durante una reparación de base de datos en modo de emergencia. |
3 | Indica un daño en los metadatos que provoca la cancelación del comando DBCC. |
4 | Se ha detectado una infracción de acceso o aserción. |
5 | Error desconocido que cancela el comando DBCC. |
Informes de errores
Un archivo de minivolcado (SQLDUMPnnnn.txt) se crea en el directorio LOG de SQL Server, cada vez que DBCC CHECKTABLE detecta un error relacionado con datos dañados. Si la recopilación de datos de uso de características y la creación informes de errores están habilitadas para la instancia de SQL Server, el archivo se reenvía automáticamente a Microsoft. Los datos recopilados se utilizan para mejorar la funcionalidad de SQL Server.
El archivo de volcado contiene los resultados del comando DBCC CHECKTABLE y salida de diagnóstico adicional. El archivo tiene listas de control de acceso discrecional (DACL) restringidas. El acceso está limitado a la cuenta de servicio de SQL Server y a los miembros de la función sysadmin. De forma predeterminada, la función sysadmin contiene todos los miembros del grupo BUILTIN\Administradores de Windows y el grupo de administradores local. El comando DBCC no producirá error en caso de que se produzca un error en el proceso de recopilación de datos.
Resolver errores
Si DBCC CHECKTABLE informa de errores, se recomienda restaurar la base de datos de la copia de seguridad de base de datos en vez de ejecutar REPAIR con una de las opciones de REPAIR. Si no existe una copia de seguridad, la ejecución de REPAIR puede corregir los errores indicados. La opción REPAIR que se debe utilizar se especifica al final de la lista de errores indicados. No obstante, la corrección de errores mediante la opción REPAIR_ALLOW_DATA_LOSS puede eliminar algunas páginas, y por tanto, también algunos datos.
La reparación se puede realizar en una transacción de usuario para permitirle revertir los cambios que se han realizado. Si se revierten las reparaciones, la base de datos aún contendrá errores por lo que se debe restaurar a partir de una copia de seguridad. Una vez finalizadas todas las reparaciones, realice una copia de seguridad de la base de datos.
DBCC CHECKTABLE devuelve el siguiente conjunto de resultados. Si se especifica solo el nombre de tabla o alguna de las opciones se devuelve el mismo conjunto de resultados.
DBCC results for 'HumanResources.Employee'. There are 288 rows in 13 pages for object 'Employee'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Si se especifica la opción ESTIMATEONLY, DBCC CHECKTABLE devuelve el siguiente conjunto de resultados:
Estimated TEMPDB space needed for CHECKTABLES (KB) -------------------------------------------------- 21 (1 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator.
A. Comprobar una tabla específica
En el siguiente ejemplo se comprueba la integridad de la página de datos de la tabla HumanResources.Employee en la base de datos AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
DBCC CHECKTABLE ("HumanResources.Employee");
GO
B. Ejecutar una comprobación de carga baja de la tabla
En el siguiente ejemplo se realiza una comprobación de carga baja de la tabla Employee en la base de datos AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
DBCC CHECKTABLE ("HumanResources.Employee") WITH PHYSICAL_ONLY;
GO
C. Comprobar un índice específico
En el siguiente ejemplo se comprueba un índice específico, obtenido mediante un acceso a sys.indexes.
USE AdventureWorks2008R2;
GO
DECLARE @indid int;
SET @indid = (SELECT index_id
FROM sys.indexes
WHERE object_id = OBJECT_ID('Production.Product')
AND name = 'AK_Product_Name');
DBCC CHECKTABLE ("Production.Product", @indid);