Solución de problemas error DBCC 2570 en SQL Server 2005 y versiones posteriores

INTRODUCCIÓN

Este artículo describe el error de SQL Server 2570, las causas del error y cómo resolver el problema.

Más información

Comprobaciones DATA_PURITY

En SQL Server 2005, se agregó una nueva opción, DATA_PURITY, a los comandos de DBCC CHECKDB y DBCC CHECKTABLE. Cuando se ejecuta un comando DBCC CHECKDB o DBCC CHECKTABLE con esta opción habilitada, el comando realizar validaciones de "pureza de datos" cada valor de columna de todas las filas de la tabla o tablas de la base de datos. Estas nuevas comprobaciones se realizan para asegurar que los valores almacenados en las columnas son válidos (es decir, los valores no están fuera del intervalo para el dominio asociado con el tipo de datos de la columna). La naturaleza de la validación realizada depende del tipo de datos de la columna. La siguiente lista no exhaustiva ofrece algunos ejemplos:
Tipo de datos de columnaTipo de validación de datos realizado
Carácter UnicodeLa longitud de los datos debe ser un múltiplo de 2.
Fecha y horaEl campo de días debe estar entre el 1 de enero de 1753 y el 31 de diciembre 9999. El campo de hora debe ser anterior a '11:59:59:999 PM'.
Real y FloatCompruebe la existencia de valores de punto flotante no válida como SNAN, QNAN, NIMF, ND, PD, PINF.
No todos los tipos de datos se comprueban la validez de los datos de la columna. Sólo aquellos donde es posible tener un valor almacenado que está fuera del intervalo se comprueban. Por ejemplo, el tipo de datos tinyint tiene un intervalo válido de 0 a 255 y se almacena en un solo byte (que sólo se puede almacenar valores de 0 a 255), por lo que la comprobación del valor no es necesario.

Las comprobaciones de validación de la pureza de datos no se habilitan automáticamente para todas las bases de datos. Los cheques se habilitan dependiendo de varios factores:
  • Para bases de datos creadas en SQL Server 2005 y versiones posteriores, estas comprobaciones están habilitadas de forma predeterminada y no se puede deshabilitar, por lo que el uso de la opción DATA_PURITY cuando ejecuta un comando DBCC CHECKDB o DBCC CHECKTABLE es irrelevante.
  • Para bases de datos creadas en versiones anteriores de SQL Server, como SQL Server 2000, SQL Server 7.0 y versiones actualizadas a SQL Server 2005, estas comprobaciones no están habilitadas de forma predeterminada. A fin de realizar estas comprobaciones, debe especificar la opción DATA_PURITY en el comando DBCC CHECKDB o DBCC CHECKTABLE. Esto puede resultar en dos cosas:
    • El comando DBCC finaliza y se informa de que la base de datos está limpio, incluyendo todas las comprobaciones de pureza de datos. Este hecho se registra en el encabezado de la base de datos. Todas las ejecuciones de comandos posteriores DBCC CHECKDB o DBCC CHECKTABLE observará esta información y automáticamente realizará las comprobaciones de pureza de datos, como sucedería para bases de datos creadas en SQL Server 2005. En otras palabras, una vez que una base de datos se conoce como "limpia", siempre se realizan las comprobaciones de pureza de datos.
    • El comando DBCC finaliza pero informa de problemas sobre la inconsistencia de los datos. Si éste es el caso, tendrá que limpiar la base de datos para eliminar las incoherencias y, a continuación, intente ejecutar de nuevo el comando DBCC. Tendrá que especificar la opción DATA_PURITY del comando DBCC hasta que se informa de la base de datos están limpios.
  • Si se especifica la opción PHYSICAL_ONLY cuando se ejecuta el comando DBCC CHECKDB o DBCC CHECKTABLE, no se realizan las comprobaciones de pureza de datos.

SÍNTOMAS

Datos no válidos o fuera de intervalo que se han almacenado en la base de datos de SQL Server en versiones anteriores por las siguientes razones:
  • Datos no válidos eran presentes en el origen al utilizar los métodos de inserción masiva, como la utilidad de bcp.
  • Datos no válidos se pasan a través de llamadas de eventos RPC realizadas en SQL Server.
  • Otras causas potenciales de la corrupción de datos físicos izquierda el valor de la columna en un estado no válido.
Si tiene datos no válidos en una columna de una tabla, pueden surgir problemas según el tipo de operación que se realiza en los datos no válidos. Sin embargo, también es posible que no aparecerán problemas, y los datos no válidos no se detectarán hasta que ejecute un comando DBCC CHECKDB o DBCC CHECKTABLE en SQL Server 2005 y versiones posteriores.

Algunos de los síntomas que puede observar debido a la presencia de datos no válidos incluyen (pero no se limitan a):
  • Infracciones de acceso u otros tipos de excepciones al ejecutar consultas en la columna afectada.
  • Resultados incorrectos devueltos por las consultas ejecutadas en la columna afectada.
  • Errores o problemas cuando se están creando estadísticas contra las columnas afectadas.
  • Mensajes de error similar al siguiente:
    Msg 9100, 23 de nivel, estado 2, línea 1 posible índice esté dañado. Ejecute DBCC CHECKDB.

Informe de problemas DATA_PURITY

Al ejecutar un DBCC CHECKDB o DBCC CHECKTABLE con la opción DATA_PURITY habilitada (o comprobaciones se realizan automáticamente la pureza de datos) y no válidos existen datos en las tablas que se comprueba mediante los comandos DBCC, la salida DBCC incluye otros mensajes que indican los problemas con los datos. Algunos mensajes de error de ejemplo que indican problemas de pureza de datos se muestran a continuación:
Resultados de DBCC para "account_history".
Msg 2570, nivel 16, estado 2, línea 1
Índice de página (1:1073), objeto de 33 de ranura 1977058079 ID, ID 0, partición 129568478265344 ID, unidad alloc ID 129568478265344 (tipo "datos de la fila"). Valor de la columna "account_name_japan" está fuera del intervalo para el tipo de datos "nvarchar". Actualizar la columna en un valor válido.

Msg 2570, nivel 16, estado 2, línea 1
Índice de página (1:1156), objeto de 120 de ranura 1977058079 ID, ID 0, partición 129568478265344 ID, unidad alloc ID 129568478265344 (tipo "datos de la fila"). Valor de la columna "account_name_japan" está fuera del intervalo para el tipo de datos "nvarchar". Actualizar la columna en un valor válido.
Hay 153137 filas en 1080 páginas para objeto "account_history".
CHECKDB encuentra 0 errores de asignación y los errores de coherencia 338 en tabla "account_history" (objeto 1977058079 ID).
CHECKDB encuentra 0 errores de asignación y los errores de coherencia 338 'BadUnicodeData' de la base de datos.
Ejecución de DBCC completada. Si DBCC imprime mensajes de error, póngase en contacto con el administrador del sistema.
Resultados de DBCC para 'tabla 1'.
Msg 2570, nivel 16, estado 3, línea 1
Página (1:154), ranura 0 en objeto 2073058421 ID, índice ID 0, partición 72057594038321152 ID, unidad alloc ID 72057594042318848 (tipo "datos de la fila"). Valor de columna "col2" está fuera del intervalo para el tipo de datos "real". Actualizar la columna en un valor válido.
Hay 4 filas en 2 páginas para objeto "Tabla1".
CHECKDB encuentra 0 errores de asignación y errores de 1 coherencia en la tabla 'tabla 1' (objeto 2073058421 ID).
CHECKDB encuentra 0 errores de asignación y 1 errores de coherencia en la base de datos 'realdata'. Ejecución de DBCC completada. Si DBCC imprime mensajes de error, póngase en contacto con el administrador del sistema.
Resultados de DBCC para 'tabla2'.
Msg 2570, nivel 16, estado 3, línea 1
Página (1:155), ranura 0 en objeto 2105058535 ID, índice ID 0, partición 72057594038452224 ID, unidad alloc ID 72057594042449920 (tipo "datos de la fila"). Valor de columna "col2" está fuera del intervalo para el tipo de datos "decimal". Actualizar la columna en un valor válido.
Hay 4 filas en 1 páginas para objeto "Tabla2".
CHECKDB encuentra 0 errores de asignación y errores de 1 coherencia en la tabla 'tabla2' (objeto 2105058535 ID).
CHECKDB encuentra 0 errores de asignación y 1 errores de coherencia en la base de datos 'realdata'. Ejecución de DBCC completada. Si DBCC imprime mensajes de error, póngase en contacto con el administrador del sistema.
Resultados de DBCC para 'tabla3'.
Msg 2570, nivel 16, estado 3, línea 1
Página (1:157), ranura 0 en objeto 2121058592 ID, índice ID 0, partición 72057594038517760 ID, unidad alloc ID 72057594042515456 (tipo "datos de la fila"). Valor de columna "col2" está fuera del intervalo para el tipo de datos "datetime". Actualizar la columna en un valor válido.
Hay 3 filas en 1 páginas para objeto "Tabla3".
CHECKDB encuentra 0 errores de asignación y errores de 1 coherencia en la tabla 'tabla3' (objeto 2121058592 ID).
CHECKDB encuentra 0 errores de asignación y 1 errores de coherencia en la base de datos 'realdata'. Ejecución de DBCC completada. Si DBCC imprime mensajes de error, póngase en contacto con el administrador del sistema.
Para cada fila que contiene un valor de columna no válido, se genera un error 2570.

Solucionar el problema de la pureza de datos

No se pueden reparar los errores 2570 utilizando cualquiera de las opciones de reparación DBCC. Esto es porque es imposible que DBCC determinar qué valor debe utilizar para reemplazar el valor de columna no válido. Por lo tanto, debe actualizar manualmente el valor de la columna.

Para realizar una actualización manual, usted tiene que encontrar la fila que tiene el problema. Hay dos maneras de lograrlo.
  • Ejecutar una consulta en la tabla que contiene los valores no válidos para buscar las filas que contienen los valores no válidos.
  • Utilice la información del error 2570 para identificar las filas que tienen un valor no válido.
Ambos métodos en detalle a continuación, analizaremos con ejemplos para buscar las filas que tienen datos no válidos.

Una vez que encuentre la fila correcta, una decisión debe realizarse en el nuevo valor que se utilizará para reemplazar los datos existentes no válidos. Esta decisión debe basarse cuidadosamente en el intervalo de valores que funcionan para la aplicación, así como lo que tiene sentido lógico para esa fila de datos determinada. Las opciones que tiene son:
  • Si sabe qué valor debe ser, establecer ese valor específico.
  • Establecerla en un valor aceptable.
  • Establezca el valor de la columna a NULL.
  • Establezca el valor de la columna en el valor máximo o mínimo para ese tipo de datos de la columna.
  • Si crees que la fila específica no es cualquier uso sin un valor válido para la columna, puede eliminar esa fila en conjunto.

Buscar filas con valores no válidos mediante consultas de T-SQL

El tipo de consulta que se debe ejecutar para buscar las filas que tienen valores no válidos depende del tipo de datos de la columna que se notifica un problema. Si examina el mensaje de error 2570, observará dos elementos importantes de información que le ayudará con esto. En el ejemplo siguiente, el valor de columna "account_name_japan" está fuera del intervalo para el tipo de datos "nvarchar". Podemos identificar fácilmente la columna que tiene el problema, así como el tipo de datos de la columna implicado. Por lo tanto, una vez que sabe escribir los datos y la columna implicados, puede formular la consulta para buscar las filas que contienen valores no válidos para esa columna, seleccionar las columnas necesaria para identificar esa fila (como los predicados en una cláusula WHERE) para cualquier más actualizar o eliminar.

Tipo de datos Unicode:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Tipo de datos float:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
SELECT col1, col2 FROM table1
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)

Tipo de datos real:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
SELECT col1, col2 FROM testReal
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))
ORDER BY col1; -- checks for real out of range

Decimal y Numeric tipo de datos:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Tenga en cuenta que necesitará para ajustar los valores basados en la precisión y la escala con la que ha definido la columna decimal o numeric. En el ejemplo anterior, la columna se define como col2 decimal(15,5).

Datos de hora fecha tipo:
Debe ejecutar dos consultas diferentes para identificar las filas que contienen valores no válidos para la columna de tiempo de fecha.
SELECT col1 FROM table3WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM'

SELECT col1 FROM table3 WHERE
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))
> 25919999

Buscar filas con un valor no válido mediante la ubicación física:

Puede utilizar este método si no puede encontrar las filas de interés mediante el método de T-SQL que se ha explicado anteriormente. En el mensaje de error 2570, se imprime la ubicación física de la fila que contiene el valor no válido. Por ejemplo, observe el siguiente mensaje:
Página (1:157), ranura 0 en objeto 2121058592 ID, índice ID 0, partición 72057594038517760 ID, unidad alloc ID 72057594042515456 (tipo "datos de la fila"). Valor de columna "col2" está fuera del intervalo para el tipo de datos "datetime". Actualizar la columna en un valor válido.
En este mensaje, observará la información: página (1:157), ranura 0. Se trata de la información que necesita identificar la fila. El FileId es 1, el PageInFile es 157 y lo RanuraID es 0. Una vez que disponga de esta información, debe ejecutar el comando, como sigue:
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Este comando imprimirá todo el contenido de una página. Parámetros para el comando DBCC PAGE son:
  • nombre de la base de datos
  • FileId
  • PageInFile
  • opción de impresión
Una vez que se ejecuta este comando, verá resultados que contienen información similar al formato siguiente:
Slot 0  Offset 0x60 Length 19 Record Type = PRIMARY_RECORD Record  Attributes = NULL_BITMAP Memory Dump @0x44D1C060 00000000: 10001000 01000000
ffffffff ffffffff †................ 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 0 Column 0 Offset 0x4 Length 4 col1 = 1 Slot 0 Column 1 Offset 0x8 Length 8 col2 = Dec 31 1899 19:04PM Slot 1 Offset 0x73 Length 19 Record Type = PRIMARY_RECORD Record
Attributes = NULL_BITMAP Memory Dump @0x44D1C073 00000000: 10001000 02000000
0ba96301 f8970000 †..........c..... 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 1 Column 0 Offset 0x4 Length 4
col1 = 2 Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM Slot 2
Offset 0x86 Length 19 Record Type = PRIMARY_RECORD Record Attributes =
NULL_BITMAP Memory Dump @0x44D1C086 00000000: 10001000 03000000 0ba96301
f8970000 †..........c..... 00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3 Slot 2 Column 1 Offset 0x8 Length
8 col2 = Jul 8 2006 9:34PM
En esta salida puede ver claramente los valores de columna de la fila de su interés. En este caso, necesita la fila almacenada en la ranura 0 de la página. El mensaje de error, sabrá que col2 es aquella con el problema. Por lo que tomamos el valor de col1 ranura 0 y utilizarlo como el predicado de la cláusula WHERE de la instrucción update o la instrucción delete.

Advertencia Recomendamos que utilice el primer método (es decir, usar T-SQL consultas para encontrar la información requerida). Utilice el comando DBCC PAGE sólo como último recurso. Tome el máximo cuidado mientras utiliza este comando en un entorno de producción. Es aconsejable restaurar la base de datos de producción en un servidor de prueba, y obtener toda la información necesaria mediante DBCC PAGE y realice las actualizaciones en el servidor de producción. Como siempre, asegúrese de mantener una copia de seguridad preparada en caso de que algo salga mal y necesita volver a una copia anterior de la base de datos.

Referencias

Para obtener más información acerca de la instrucción DBCC CHECKDB, vea el tema "DBCC CHECKDB (Transact-SQL)" en el siguiente sitio Web de Microsoft Developer Network (MSDN):Para obtener más información acerca de problemas conocidos en SQL Server 2000, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
CORREGIR 900335 : operación de recuperación automática de la base de datos el SQL Server 2000 puede no tener éxito si un índice contiene un tipo de datos FLOAT o un tipo de datos REAL y este tipo de datos contiene un valor NaN

Para obtener más información acerca de los eventos RPC, consulte el tema "Llamar a un procedimiento almacenado (OLE DB)" en el siguiente sitio Web de MSDN:Para obtener más información acerca de los tipos de datos diferentes, vea el tema "Llamar a un procedimiento almacenado (OLE DB)" en el siguiente sitio Web de MSDN:Para obtener más información acerca de las convenciones de valor de punto flotante, visite el siguiente sitio Web de Intel:Microsoft proporciona información de contacto de terceros para ayudarle a encontrar soporte técnico. Esta información de contacto puede cambiar sin previo aviso. Microsoft no garantiza la exactitud de esta información de contacto de terceros.
Propiedades

Id. de artículo: 923247 - Última revisión: 14 ene. 2017 - Revisión: 1

Comentarios