944 063 154 carrito-compra-linube

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

Publicado enSistemas TI

Anteriormente veíamos la primera parte del post de «cómo reparar base de datos corrupta en SQL Server«. Pero si el estado de tu base de datos es cualquiera de los otro dos (REPAIR MODE o EMERGENCY), entonces será necesario recurrir a otro tipo de solución. Generalmente este problema puede experimentarse tras tratar de recrear un nuevo transaction log para una base de datos. En cualquier caso la solución que te proponemos también puede servir si el archivo de datos está dañado.

Para comenzar con esto de reparar una base de datos corrupta, vamos a indicar qué hicimos para reproducir el problema. Después, paso a paso iremos viendo 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 base de datos, 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 base de datos:

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 base de datos era RECOVERY_PENDING, devolviendo un error 945.

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

Cómo solucionarlo

ALTER DATABASE sergiodb SET EMERGENCY ;– lo primero que haremos es pasar la base de datos 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 base de datos 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 y ponemos solución al error 945 que devolvía nuestra base de datos SQL.