Summary: En este post, vamos a hablar de la causa raíz detrás de la corrupción a nivel de página en SQL Server. También vamos a discutir las formas de solucionar la corrupción y restaurar la base de datos. Además, usted encontrará acerca de un software de reparación de base de datos SQL que puede reparar fácilmente una base de datos corrupta y restaurar todos sus objetos.
Las bases de datos pueden corromperse en cualquier momento y es un problema preocupante para los administradores de bases de datos, ya que pone en riesgo todos los datos cruciales en el servidor SQL. Además, los datos se vuelven inaccesibles, lo que afecta al flujo de trabajo de la organización. Por lo tanto, es importante solucionar la corrupción de inmediato. Sin embargo, es igualmente importante entender las causas de la corrupción, de lo contrario, volverá a ocurrir. Este blog cubre información esencial sobre cómo solucionar la corrupción de páginas en SQL Server.
Causas de la corrupción a nivel de página de SQL Server
Estas son algunas de las principales razones que pueden conducir a la corrupción de bases de datos SQL Server.
-
Error de software en el programa SQL Server: En este caso, los datos se escriben mal en el disco. Mira estos documentos de Microsoft:
- KB2548593 – CORRECCIÓN: Corrupción de la base de datos si se activa la compresión de datos en una tabla particionada en SQL Server 2008.
- KB2803994 – CORRECCIÓN: Los datos se corrompen cuando los datos LOB se cargan en una variable Transact-SQL en SQL Server 2008 R2, SQL Server 2012 o SQL Server 2008.
Podemos evitar este tipo de problemas instalando la última actualización acumulativa (CU) de la versión de SQL Server.
- Problemas de Memoria: Estamos hablando de problemas de hardware que pueden afectar a todo el sistema y no sólo al MS SQL Server. Existen programas para verificar la corrección de los datos en memoria.
- Problemas del subsistema de E/S: En este caso, entender la causa del problema no es fácil porque el sistema de almacenamiento puede tener una arquitectura complicada. Por ejemplo, antes de escribir en el disco físico, puede que tengamos que atravesar una red o puede que tengamos un controlador de disco y sus controladores. Cualquiera de estos componentes puede fallar.
- Apagado repentino del servidor: Existe un riesgo sustancial de corrupción de la base de datos, si por alguna razón el servidor se apaga repentinamente. Esto puede ocurrir por un fallo físico del servidor o por falta de electricidad.
¿Cómo detectar la corrupción a nivel de página en SQL Server?
Las bases de datos de MS SQL Server constan de páginas de datos de 8 KB. Ocho páginas físicamente contiguas forman una extensión, que tiene un tamaño de 64 KB. La corrupción de páginas significa que tenemos una o más páginas que contienen valores incorrectos.
Si tenemos una base de datos corrupta, podemos comprobarlo de tres maneras:
1. La ejecución de la sentencia SELECT en la tabla dañada muestra un error
En este caso, aparece el mensaje de error:
- El tipo de error (aquí, tenemos un error de E/S basado en la consistencia lógica, causado por una suma de comprobación incorrecta).
- La página donde se encuentra el error (página 1:368).
- El offset donde se encuentra el error (0x00000002e0000).
- ID de la base de datos dañada (ID=31).
2. Ejecute la sentencia DBCC CHECKDB
Este comando comprueba la integridad física y lógica de los objetos de la base de datos, las relaciones entre índices y otras comprobaciones estructurales. Basta con escribir DBCC CHECK con el nombre de la base de datos entre paréntesis.
En este caso, aparece el error:
- El número de páginas dañadas (página 1:368).
- El nombre de la tabla corrupta (persona).
3. Ejecutar SELECT en la tabla [msdb].[dbo].[suspect_pages]
El comando SELECT devolverá una cuadrícula con una fila de cada página dañada. En este caso, podemos ver que en la base de datos con ID = 31 la página 1:368 está dañada.
¿Cómo corregir la corrupción a nivel de página en SQL Server?
Aquí hemos mencionado dos formas diferentes de reparar y recuperar la base de datos.
1. Recuperación manual mediante comandos T-SQL
Nota: Realice una copia de seguridad de las bases de datos y/o copia de los ficheros físicos antes de proceder. El proceso manual es arriesgado.
Para proceder a la recuperación manualmente a través de comandos T-SQL para arreglar la corrupción de páginas en SQL server, siga las siguientes instrucciones.
Utilice el comando no documentado DBCC IND para asegurarse de que la página 368 es una página de datos.
DBCC IND('Recovery_test',Person,-1)
Este comando muestra todas las páginas relativas a la tabla, indicada en el segundo parámetro, con la información relativa al tipo de página. En el ejemplo siguiente,
- La primera fila tiene el tipo de página 10. Por lo tanto, es la página del mapa de asignación de índices (IAM).
- La segunda fila tiene el tipo de página 1. Indica que la página 368 contiene datos.
Para visualizar los datos contenidos en la página 1:368, podemos abrir el archivo recovery_test.mdf con un editor hexadecimal e ir al desplazamiento 2e0000.
El carácter rojo ‘b’ (ver imagen inferior) parece sospechoso ya que mi nombre es “Luca” y no “Lucb”.
2. Utilice el comando DBCC PAGE:
Para obtener el resultado del comando DBCC PAGE, primero debe activarse el indicador Trace 3604.
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) WITH TABLERESULTS
Los parámetros requeridos son:
- Nombre de la base de datos
- Número del expediente
- Número de la página
- PRINTOPT
Los valores del parámetro printopt son:
- 0 – Imprimirá la parte de la cabecera de la página.
- 1 – Cabecera de la página SQL con volcados hexadecimales por fila.
- 2 – Detalles de cabecera de página con volcado hexadecimal completo de la página.
- 3 – Cabecera de la página con descripción de la interpretación por fila.
Los datos mostrados son los mismos.
Tenemos que cambiar el valor del carácter del valor hexadecimal 62 (b) al valor hexadecimal 61 (a).
Podemos utilizar otro comando no documentado, que es el comando DBCC WRITEPAGE. Se trata de un potente comando que permite escribir directamente en una página.
Para utilizar el comando DBCC WRITEPAGE, necesitamos la siguiente información:
- El primer parámetro es el nombre de la base de datos.
- El segundo y el tercero son el fileId y el PageId que debo cambiar (1: 368).
- El cuarto parámetro es el offset (hex.74 -> 116 dec.) y el quinto es el número de caracteres que vamos a escribir (1).
- El sexto parámetro es el valor que debo escribir. En nuestro caso, es 0x000000.
- El séptimo parámetro especifica si se escribe el valor a través del buffer pool. Establecemos el valor 1 para escribir directamente en el archivo mdf físico.
En primer lugar, ponga la base de datos en modo SINGLE_USER:
ALTER DATABASE recovery_test SET SINGLE_USER WITH ROLLBACK IMMEDIATE
A continuación, ejecute el comando WRITEPAGE:
DBCC WRITEPAGE ('prueba_recuperación', 1, 368, 116, 1, 0x61,1)
Ahora, ejecútelo de nuevo para ver si los datos han cambiado:
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) WITH TABLERESULTS
Sí, los datos han cambiado.
Poner la base de datos en modo MULTI_USUARIO:
ALTER DATABASE recovery_test SET MULTI_USER WITH ROLLBACK IMMEDIATE
Compruebe el estado de salud de la base de datos:
DBCC CHECKDB ('prueba_recuperación')
En el registro, podemos ver que no hay errores. Esto significa que la base de datos ya no está corrupta.
Repare la base de datos con Stellar Repair for MS SQL
Consideremos, que el problema que hemos resuelto manualmente es un caso notablemente simple. Pero reparar casos complejos de corrupción requiere conocimientos avanzados e implica el riesgo de dañar más los datos. Sin embargo, una aplicación dedicada como Stellar Repair for MS SQL puede resolver el mismo problema de forma segura y rápida. Sólo se requieren unos sencillos pasos para recuperar una base de datos corrupta. Estos son:
- Inicie la aplicación Stellar Repair for MS SQL.
- Al iniciarse, la aplicación le pide que seleccione la base de datos que desea recuperar. Indique un archivo con la extensión .mdf.
- A continuación, puede optar por recuperar también los registros eliminados.
- Pulse el botón Reparar.
- Existen dos modos de recuperación: Estándar y Avanzado.
Se escaneará la estructura de la base de datos para repararla. Una barra de progreso muestra el progreso del trabajo.
- El resultado de esta fase de exploración se guarda. Por lo tanto, se puede reutilizar. Desde la interfaz gráfica, podemos ver todos los objetos de la base de datos.
- El último paso es guardar los datos recuperados. Podemos guardar los datos en una base de datos nueva, en una base de datos existente o en otro formato (CSV, XLS o HTML).
- Cuando seleccione la opción Nueva base de datos, se le pedirá el nombre de la base de datos a crear. Los datos se copiarán en la base de datos generada.
Para concluir
La base de datos SQL se corrompe debido a una variedad de razones. En este post, hemos discutido las causas detrás de la corrupción a nivel de página en SQL Server. También hemos visto cómo detectar la corrupción en la base de datos y cómo reparar la base de datos dañada manualmente a través de comandos T-SQL y el uso de software de reparación de SQL. El software puede hacer un trabajo encomiable de resolver el problema y conseguir la base de datos de nuevo a un estado perfecto funcionamiento.