En el post anterior veíamos como reparar una bbdd. Si el estado es cualquiera de los otro dos (REPAIR MODE o EMERGENCY), entonces tendremos que recurrir a otro tipo de apaños. En mi caso he experimentado el problema tras tratar de recrear un nuevo transaction log para una bbdd, pero también puede servir en casos en el que el archivo de datos este dañado.
Voy a indicar lo que hice para reproducir el problema. Separé una bbdd y borré su .LDF, luego al adjuntarla obtenía este 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 programa\SWsoft\Plesk\Databases\MSDE\MSSQL\Data\sergiodb_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 bbdd 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 programa\SWsoft\Plesk\Databases\MSDE\MSSQL\Data\sergiodb.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’;
SOLUCION
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.
Entradas (RSS)
Hola Sergio. Espero que seas tu. Manolo, extutor
En mi caso la BD estaba en modo “suspect” despues de una caida del server y con tu solucion he podido recuperar la BD por completo. Gracias.
Hola mi Bd est en “suspect” pero no entiendo como hcer esos paso donde los doy o como le hago, si alguien me puede apoyar…
saludos.
@jlopez desde el SQL Management Studio > Nueva consulta. O desde una consola con el comando sqlcmd.
Saludos Sergio Sainz
De verdad excelente tu solucion, la ejecute y pude recuperar la BD, tenia dias buscando una solucion.
Gracias por tu aporte
Después de que la compañía eléctrica decidiera tener una caida lo suficientemente larga como para agotar los SAIS y encima por la noche (con nocturnidad y alevosía), diferentes bases de datos no se volvieron a levantar, pero gracias a tu solución, hace 10 minutos que no me suena el teléfono con 50 usuarios echando fuego (llego a tardar un poco más en solucionarlo y tendría que encerrarme en el CPD para salvarme de la turba).
Saludos Sergio.
Dejame decirte maestro usted si que sabe, muchas gracias por ayudarme a solucionar un dolor de cabeza.
Tengo una de base de datos en sql server 2005, le saque la copia de seguridad full, y las copias de seguridad del log de transaciones, al recuperarla, em informa que no tengo el primer log de transaciones, como puedo saltarme ese requerimiento y recuperar la informacion que esta en los demas log de transaciones
estiamado Alcides no mames buey, ya fuiste quien te manda hacer eso, es q si no tienes el primer log como va ha saber lo qe continua no LEEESSSS !!! bien claro esta, pero si hay una forma de saltarse ese requerimiento, NO LO TOMES EN CUENTA!!!!
No se como agrdecerle por esta información, la puse en práctica y fue muy efectiva.
en la base de datos de prueba si me funciona pero en la real no me cambia el estado de RECOVERY_PENDING no se de que otra forma pueda recuperar la informacion, gracias de antemano
Buenas !
Gran solución a un gran problema !
Buenas: a mi me da un error cuando realizo el tercer paso del Check. Me dice:
Mens. 3908, Nivel 16, Estado 1, Línea 1
No se puede ejecutar BEGIN TRANSACTION en la base de datos ‘stnt_MSCRM’. La base de datos está en modo omitir recuperación.
Advertencia: se ha vuelto a generar el registro de la base de datos ‘stnt_MSCRM’. Se perdió la coherencia transaccional. La cadena RESTORE se rompió y el servidor ya no tiene contexto en los archivos de registro anteriores, por lo que tendrá que saber qué son. Debe ejecutar DBCC CHECKDB para validar la coherencia física. Se ha establecido la base de datos en modo dbo-only. Cuando esté preparado para hacer la base de datos disponible para su uso, tendrá que restablecer las opciones de base de datos y eliminar los archivos de registro adicionales.
Mens. 211, Nivel 23, Estado 51, Línea 1
Puede que el esquema esté dañado. Ejecute DBCC CHECKCATALOG.
Mens. 0, Nivel 20, Estado 0, Línea 0
Error grave en el comando actual. Los resultados, si los hay, se deben descartar.
Luego ejecute los DBCC CHECK y no me tiró error…
AYUDA URGENTEEEEEEEEEEEEE
Sergio Sainz, que barbaro sos una “bestia” (en el buen sentido), maestro me ayudo tremendamente.
Gracias por la Solucion, Eres grande mi hermano!!!
Sergio eres DIOS!
me ayudaste a recuperar la db de mi proyecto!
Un millon de gracias!
Que escandalosos, el asunto es correr el Server Management como Administrador y punto.
Buenas noches sergio, como puedo reparar una base de datos tengo los archivos fisicos, pero no los puedo adjuntar a la lista de bases de datos, sale error en el archivo fisico, error del sistema operativo al querer enlazar el archivo, lo que sucece es qe formateamos el servidor y yo guarde los mdf y los ldf. he estado buscando programas pero todos son demos abre pero no me deja repararla, si me puedes colaborar te agradeceria un monto saludos, es un programa contable que se llama SIIGO, e guarda las bases de datos de cada año con un nombre distinto y me falta la de 2010
gracias
Mil gracias, ejecute sin problemas y solucionaste mi problema.
Estimado sergio muy grande tu ayuda, me soluciono el problema, ya que se me pincho el server sql2008, no levantaba ni el servicio, en la desesperacion copie la bd a otra pc con sql server2008 tamien y no la pude levantar pero siguiendo estos pasos la recupere sin problemas. encima era un proyecto que recien estaba comenzando y no tenia backup ni nada.
nuevamente mil gracias!!!!
Me alegro de que os haya sido de ayuda este pequeño tip. Gracias por vuestros comentarios
Gracias por el tip. En efecto, logré recuperar la base de datos sin ningún otro inconveniente, y anda de maravilla de nuevo. Valiosísimo aporte. Felicitaciones.
Sergio: mi base estaba “suspect” y seguí los pasos arriba indicados. Mi duda es que el query lleva más de 10 horas y aun no finaliza
Sergio: mi base estaba “suspect” y seguí los pasos arriba indicados. Mi duda es que el query lleva más de 10 horas y aun no finaliza. ¿Estó es normal?
Sergio: Agradezco la solución planteada. Me fué de mucha ayuda.
Excelente!. Muchas Gracias por la Solución.
Excelente solución, rápida y efectiva…