944 063 154

Blog

Reparar base de datos corrupta en SQL Server (Parte II)

Publicado enSistemas TI

Anteriormente veíamos el post de “cómo reparar base de datos corrupta en SQL Server“. Si el estado es cualquiera de los otro dos (REPAIR MODE o EMERGENCY), entonces tendremos que recurrir a otro tipo de apaños. Este problema puede experimentarse tras tratar de recrear un nuevo transaction log para una base de datos; pero también puede servir en casos en el que el archivo de datos esté dañado.

Vamos a indicar qué hicimos para reproducir el problema y cómo lo solucionamos.

Reparar base de datos corrupta en SQL Server

Al separar una base de datos y borrar su .LDF, al adjuntarla después aparecía el siguiente error:

Error al adjuntar las bases de datos. Haga clic en el hipervínculo de la columna de mensajes para obtener más información.

Crearlo a mano no es muy buena idea según nos muestra el siguiente error:

The operating system returned error 38(Se ha alcanzado el final del archivo.) to SQL Server during a read at offset 0000000000000000 in file ‘C:Archivos de programaSWsoftPleskDatabasesMSDEMSSQLDatasergiodb_log.ldf’. Additional messages in the SQL Server error log and system event log may provide more detail. This is a severe system-level 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. (Microsoft SQL Server, Error: 823)

Dado que no era posible adjuntar la bbdd, el siguiente paso fue renombrar el archivo de datos sergiodb.mdf por sergiodb_bak.mdf y crear una nueva base de datos con el nombre sergiodb. Con esto obtenemos un nuevo mdf y un ldf limpio.

El siguiente paso fue detener SQL Server y sobrescribir sergiodb.mdf por el bueno e iniciar de nuevo SQL. Con esto se produce el siguiente error al intentar por ejemplo ver las propiedades de la bbdd:

Unable to open the physical file “C:Archivos de programaSWsoftPleskDatabasesMSDEMSSQLDatasergiodb.mdf”. Operating system error 5: “5(Acceso denegado.)”. (Microsoft SQL Server, Error: 5120)

Tras dar permisos NTFS al archivo de datos, el error cambiaba a:

Database ‘sergiodb’ cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details. (Microsoft SQL Server, Error: 945)

Con todo esto el estado de mi BD era RECOVERY_PENDING

SELECT state_desc FROM sys.databases WHERE name =’sergiodb’;

Cómo solucionarlo

ALTER DATABASE sergiodb SET EMERGENCY ;– lo primero que haremos es pasar la bbdd del modo “RECOVERY_PENDING” al modo “EMERGENCY” (es necesario tener privilegio de sysadmin)

ALTER DATABASE sergiodb SET SINGLE_USER ;– La ponemos en modo de usuario único.

DBCC CHECKDB (sergiodb, REPAIR_ALLOW_DATA_LOSS )WITH NO_INFOMSGS ;– Chequeamos la bd con la opción REPAIR_ALLOW_DATA_LOSS

ALTER DATABASE sergiodb SET MULTI_USER ;– Por ultimo la ponemos en modo multiusuario

Ahora debería estar en modo ONLINE y funcionando.

 

Con este último paso concluimos la explicación de cómo reparar base de datos corrupta en SQL Server. No dudes en escribirnos si te surge cualquier duda.