Paginas Corruptas en SQL Server

Mientras nos tomábamos unas caipiriñas en Brasil, el grupo de PFE de SQL estuvimos compartiendo algunas experiencias en clientes y una de ellas fue la corrupción de páginas en SQL Server.

Primero que nada, ¿Qué es una página?, en el contexto de SQL Server es la unidad mínima de almacenamiento para los datos, con una medida de 8KB. Para mayor información, consulta en https://msdn.microsoft.com/es-es/library/ms190969.aspx (Descripción de páginas y extensiones).

Ahora, ¿por qué se corrompen las páginas?, si bien no existe una causa específica, generalmente de debe a fallas a nivel de hardware.

Existen tres pasos simples para identificar si existe el escenario mencionado:

  1. Revisar el SQL Server Error Log, para buscar errores relacionados con páginas corruptas.

  2. Ejecutar el comando DBCC CHECKDB.

    DBCC CHECKDB ('NombreBasedeDatos') WITH ALL_ERRORMSGS

    GO

  3. Revisar la tabla msdb.dbo.suspect_pages.

SELECT *

FROM msdb..suspect_pages

WHERE (event_type = 1 OR event_type = 2 OR event_type = 3)

Una vez identificada la página corrupta, puedes solucionar el problema mediante los siguientes pasos:

  1. Antes de cualquier acción y de ser posible, realiza un respaldo de tu base de datos,

  2. Si la página corrupta corresponde a un índice nonclustered o a una página intermedia de un índice clustered, reconstruir el índice solucionará el problema.

    DBCC CHECKDB (NombreBasedeDatos, REPAIR_REBUILD)

  3. Si la página corrupta corresponde a una página de datos, será necesario recurrir a tu último respaldo consistente. Si utilizas la versión Enterprise de SQL Server, puedes hacer uso de la funcionalidad de restauración a nivel de páginas o archivos. Como ejemplo supongamos que la página dañada corresponde al número 265 del datafile 1 de la base de datos Northwind, en cuyo caso se puede utilizar el siguiente comando para restaurar la página.

USE master

GO

RESTORE DATABASE Northwind

PAGE = '1:265'

FROM DISK = N'D:\DBBackup\NorthwindBackup.bak'

GO

 Existen algunas restricciones para utilizar esta funcionalidad, en general, no es posible utilizar recuperación a nivel de página cuando sea de alguno de los siguientes tipos:

  • Páginas del log de transacciones.
  • Allocation pages: Global Allocation Map (GAM) pages, Shared Global Allocation Map (SGAM) pages, y Page Free Space (PFS) pages.
  • Página 0 de cualquier archivo de datos  (file boot page)
  • Página 1:9 (database boot page)
  • Páginas del Full-text catalog

Adicionalmente, será necesario ejecutar pasos adicionales de acuerdo a las opciones que tengamos habilitadas en la base de datos, para mayor información consulta en https://msdn.microsoft.com/es-es/library/ms175168.aspx (Realizar restauraciones de página).

Como última opción puedes usar el comando REPAIR_ALLOW_DATA_LOSS con DBCC CHECKDB, sin embargo no recomendamos usar esta opción ya que permite la pérdida de datos sin asegurar la recuperación de las páginas.

Continuaremos bebiéndonos las caipiriñas mientras platicamos sobre SQL Server. Hasta el próximo blog!

 

“Las opiniones e ideas expresadas en este blog son las de los Autores y no necesariamente declaran o reflejan la opinión de Microsoft”