Compartir a través de


Diagnósticos de SQL Server detecta problemas de E/S no notificados debido a lecturas obsoletas o escrituras perdidas

En este artículo se explica cómo diagnósticos de SQL Server ayuda a detectar problemas de entrada o salida no notificados que se producen debido a lecturas obsoletas o escrituras perdidas.

Versión del producto original: SQL Server
Número de KB original: 826433

Síntomas

Si los problemas de sistema operativo, controlador o hardware provocan condiciones de lectura perdidas o obsoletas en la ruta de acceso de E/S, es posible que vea mensajes de error relacionados con la integridad de los datos, como los errores 605, 823, 3448 y 3456 en SQL Server. Puede recibir mensajes de error similares a los ejemplos siguientes:

2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.

Nuevas funcionalidades de diagnóstico de E/S en SQL Server

SQL Server introdujo nuevas funcionalidades de diagnóstico de E/S a partir de SQL Server 2000 Service Pack 4 y estos diagnósticos han sido parte del producto desde entonces. Estas funcionalidades están diseñadas para ayudar a detectar problemas relacionados con E/S externos y a solucionar los mensajes de error descritos en la sección Síntomas .

Si recibe cualquiera de los mensajes de error que aparecen en la sección Síntomas y no se explican por un evento como un error de unidad física, revise los problemas conocidos con SQL Server, el sistema operativo, los controladores y el hardware. Los diagnósticos intentan proporcionar información sobre las dos condiciones siguientes:

  • Escritura perdida: una llamada correcta a writeFile API, pero el sistema operativo, un controlador o el controlador de almacenamiento en caché no vacía correctamente los datos en los medios físicos, aunque SQL Server esté informado de que la escritura se realizó correctamente.

  • Lectura obsoleta: una llamada correcta a readFile API, pero el sistema operativo, un controlador o el controlador de almacenamiento en caché devuelven incorrectamente una versión anterior de los datos.

Para ilustrarlo, Microsoft ha confirmado escenarios en los que una llamada a la API WriteFile devuelve un estado de éxito, pero una lectura inmediata y correcta del mismo bloque de datos devuelve datos anteriores, incluidos los datos que probablemente se almacenan en una caché de lectura de hardware. A veces, este problema se produce debido a un problema de caché de lectura. En otros casos, los datos de escritura nunca se escriben en el disco físico.

Cómo habilitar los diagnósticos

En SQL Server 2017 y versiones posteriores, esta funcionalidad de diagnóstico está habilitada de forma predeterminada. En SQL Server 2016 y versiones anteriores, estos diagnósticos solo se pueden habilitar mediante la marca de seguimiento 818. Puede especificar la marca de seguimiento 818 como parámetro de inicio, -T818, para la instancia de SQL Server o puede ejecutar la siguiente instrucción T-SQL para habilitarlas en tiempo de ejecución:

DBCC TRACEON(818, -1)

La marca de seguimiento 818 habilita un búfer en anillo en memoria que se usa para realizar el seguimiento de las últimas 2048 operaciones de escritura correctas realizadas por el equipo que ejecuta SQL Server, no incluidas las E/S de ordenación y de archivo de trabajo. Cuando se producen errores como 605, 823 o 3448, el valor del número de secuencia de registro (LSN) del búfer entrante se compara con la lista de escritura reciente. Si el LSN que se recupera durante la operación de lectura es anterior al usado en la operación de escritura, se registra un nuevo mensaje de error en el registro de errores de SQL Server. La mayoría de las operaciones de escritura de SQL Server se producen como puntos de comprobación o como escrituras diferidas (una escritura diferida es una tarea en segundo plano que usa E/S asincrónica). La implementación del búfer de anillo es ligera y el efecto de rendimiento en el sistema es insignificante.

Detalles sobre el mensaje en el registro de errores

El mensaje siguiente no muestra ningún error explícito de writeFile API o la API ReadFile llama a SQL Server. En su lugar, muestra un error de E/S lógico que resultó cuando se revisó el LSN y su valor esperado no era correcto:

A partir de SQL Server 2005, el mensaje de error que se muestra es:

SQL Server detectó un error de E/S basado en coherencia lógica: Lectura obsoleta. Se produjo durante una <Read/Write> de las páginas <PAGEID> del identificador <DBID> de base de datos en el desplazamiento <PHYSICAL OFFSET> en el archivo <FILE NAME>. El registro de errores de SQL Server o el registro de eventos del sistema pueden contener mensajes adicionales con más detalles. Se trata de una condición de error grave que amenaza la integridad de la base de datos y que se debe corregir de inmediato. Realice una comprobación completa de coherencia de la base de datos (DBCC CHECKDB). Este error puede deberse a muchos factores. Para obtener más información, vea los Libros en pantalla de SQL Server.

Para obtener más información sobre el error 824, consulte MSSQLSERVER_824.

En el momento o notificando este error, la caché de lectura contiene una versión anterior de la página o los datos no se escribieron correctamente en el disco físico. En cualquier caso (una escritura perdida o una lectura obsoleta), SQL Server notifica un problema externo con el sistema operativo, el controlador o las capas de hardware.

Si se produce el error 3448 al intentar revertir una transacción que tiene el error 605 o 823, la instancia de SQL Server cierra automáticamente la base de datos e intenta abrirla y recuperarla. La primera página que experimenta el error 605 o 823 se considera una página incorrecta y el equipo que ejecuta SQL Server mantiene el identificador de página. Durante la recuperación (antes de la fase de puesta al día) cuando se lee el identificador de página incorrecto, los detalles principales sobre el encabezado de página se registran en el registro de errores de SQL Server. Esta acción es importante porque ayuda a distinguir entre escenarios de escritura perdida y lectura obsoleta.

Comportamiento observado con lecturas obsoletas y escrituras perdidas

Es posible que vea los dos comportamientos comunes siguientes en escenarios de lectura obsoletos:

  • Si los archivos de base de datos están cerrados y abiertos, se devuelven los datos escritos correctos y escritos más recientemente durante la recuperación.

  • Al emitir un punto de control y ejecutar la DBCC DROPCLEANBUFFERS instrucción (para quitar todas las páginas de base de datos de la memoria) y, a continuación, ejecutar la DBCC CHECKDB instrucción en la base de datos, se devuelven los datos escritos más recientemente.

Los comportamientos mencionados en el párrafo anterior indican un problema de almacenamiento en caché de lectura y se resuelven con frecuencia deshabilitando la memoria caché de lectura. Las acciones que se describen en el párrafo anterior suelen forzar una invalidación de caché y las lecturas correctas que se producen muestran que los medios físicos se actualizan correctamente. El comportamiento de escritura perdido se produce cuando la página que se lee sigue siendo la versión anterior de los datos, incluso después de un vaciado forzado de los mecanismos de almacenamiento en caché.

A veces, es posible que el problema no sea específico de una caché de hardware. Puede ser un problema con un controlador de filtro. En tales casos, revise el software, incluidas las utilidades de copia de seguridad y el software antivirus, y luego vea si hay problemas con el controlador de filtro.

Descripción de varios escenarios de lecturas obsoletas y escrituras perdidas

Microsoft también ha observado condiciones que no cumplen los criterios para el error 605 o 823, pero que se deben a la misma actividad de lectura o pérdida de escritura obsoletas. En algunos casos, una página parece actualizarse dos veces, pero con el mismo valor LSN. Este comportamiento puede producirse si el id. de objeto y el id. de página son correctos (la página ya está asignada al objeto) y se realiza un cambio en la página y se vacía en el disco. La recuperación de la página siguiente devuelve una imagen anterior y, a continuación, se realiza un segundo cambio. El registro de transacciones de SQL Server muestra que la página se actualizó dos veces con el mismo valor LSN. Esta acción se convierte en un problema al intentar restaurar una secuencia del registro de transacciones o con problemas de coherencia de datos, como errores de clave externa o entradas de datos que faltan. El siguiente mensaje de error muestra un ejemplo de esta condición:

Error: 3456, Gravedad: 21, Estado: 1 No se pudo rehacer el registro (276666:1664:19), para el identificador de transacción (0:825853240), en la página (1:1787100), la base de datos 'authors' (7). Página: LSN = (276658:4501:9), escriba = 1. Log: OpCode = 4, context 2, PrevPageLSN: (275565:3959:31)..

Algunos escenarios se describen con más detalle en las listas siguientes:

LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Table created or truncated
4   Inserts (Pages allocated)
5   Newly allocated page written to disk by Lazy Writer
6   Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7   Rollback of transaction initiated
LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Page Modification
4   Page written to disk by Lazy Writer
5   Page read in for another modification (stale image returned)
6   Page Modified for a second time but because of stale image does not see first modification 
7   Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page

Los operadores de SQL Server sort realizan actividades de E/S, normalmente en la tempdb base de datos. Estas operaciones de E/S son similares a las operaciones de E/S del búfer; sin embargo, ya se han diseñado para usar la lógica de reintento de lectura para intentar resolver problemas similares. Los diagnósticos adicionales que se explican en este artículo no se aplican a estas operaciones de E/S.

Microsoft ha observado que la causa principal de los siguientes errores de lectura de ordenación suele ser una lectura obsoleta o una escritura perdida:

2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)

Dado que una lectura obsoleta o una escritura perdida da como resultado el almacenamiento de datos que no se espera, puede producirse una amplia variedad de comportamientos. Puede aparecer como datos que faltan, pero algunos de los efectos más comunes de los datos que faltan aparecen como daños en el índice, como el error 644 o 625:

Error 644 Texto de mensaje de nivel de gravedad 21 No se encontró la entrada de índice para RID '%.*hs' en la página de índice %S_PGID, id. de índice %d, base de datos '%.*ls'.

Error 625 Texto de mensaje de nivel de gravedad 21 No se puede recuperar la fila de la página %S_PGID por RID porque el slotid (%d) no es válido.

Algunos clientes han notificado que faltan filas después de realizar actividades de recuento de filas. Este problema se produce debido a una escritura perdida. Quizás, se suponía que la página estaba vinculada a la cadena de páginas de índice agrupada. Si la escritura se perdió físicamente, también se perderán los datos.

Importante

Si experimenta cualquiera de los comportamientos o si es sospechoso de problemas similares junto con la deshabilitación de mecanismos de almacenamiento en caché, Microsoft recomienda encarecidamente obtener la actualización más reciente para SQL Server. Microsoft también recomienda encarecidamente que realice una revisión estricta del sistema operativo y sus configuraciones asociadas.

Tenga en cuenta que Microsoft ha confirmado que en cargas de E/S poco frecuentes y pesadas, algunas plataformas de hardware pueden devolver una lectura obsoleta. Si los diagnósticos extendidos indican una posible condición de lectura obsoleta o escritura perdida, póngase en contacto con el proveedor de hardware para realizar un seguimiento inmediato y probarlo con la utilidad SQLIOSim .

SQL Server requiere que los sistemas admitan la entrega garantizada a medios estables, como se describe en Requisitos del programa de confiabilidad de E/S de SQL Server. Para obtener más información sobre los requisitos de entrada y salida para el motor de base de datos de SQL Server, consulte Motor de base de datos de Microsoft SQL Server Requisitos de entrada y salida.