Reparar una base dañada de MS SQL Server

Últimamente me ha tocado quemarme las pestañas por casos de bases de datos dañadas. Una mala infraestructura, y/o un mal plan de backups termina provocando este tipo de post luego de sufrir por un rato…

Reparar una base dañada

El siguiente es un error común cuando se daña una base:

Msg 824, Level 24, State 2, Line 11
SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:49876; actual 17253:-991032068). It occurred during a read of page (1:49876) in database ID 15 at offset 0x000000185a8000 in file ‘E:\Bases\SBDAXXXX.MDF’.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

A continuación los pasos que se debería seguir:

  1. Intentar hacer un backup de la base
  2. Obtener la cantidad de registros que hay en ese momento en cada tabla (script adjunto al final)
  3. Colocar la base en modo de usuario único
    ALTER DATABASE SBDAXXXX SET SINGLE_USER WITH ROLLBACK IMMEDIATE

     

  4. Intentar reparar la base
    DBCC CHECKDB(SBDAXXXX,REPAIR_ALLOW_DATA_LOSS)

     

  5. Verificar la cantidad de registros actual (script adjunto al final)
DECLARE @Tabla VARCHAR(250)
DECLARE @SQL VARCHAR(2000)
CREATE TABLE #TablaTemp(ID INT IDENTITY(1,1),Tabla_Nombre VARCHAR(200),Cant_Registros INT)

DECLARE TINFO_CUR CURSOR FOR 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE'

OPEN TINFO_CUR
FETCH NEXT FROM TINFO_CUR INTO @Tabla
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL='INSERT INTO #TablaTemp(Tabla_Nombre,Cant_Registros) SELECT '''+@Tabla+''',COUNT(*) FROM '+@Tabla+''
EXECUTE (@SQL)
FETCH NEXT FROM TINFO_CUR INTO @Tabla
END
CLOSE TINFO_CUR
DEALLOCATE TINFO_CUR


SELECT * FROM #TablaTemp ORDER BY Tabla_Nombre

DROP TABLE #TablaTemp

 

Si la base está muy dañada posiblemente no se repara, o se pierde información. En ese caso se puede recurrir a un software de 3ro para intentar reparar el .MDF.