Necesitamos restaurar un archivo .mdf en una instancia diferente desde la que viene, debido a que esa instancia tiene algún problema y no la podemos iniciar.
Al cerrarse mal la instancia por un error en el disco o en el servidor , al adjuntar el archivo .mdf nos dice que el .ldf está corrupto.
Para poder adjuntar el archivo .mdf sin el .ldf hay que seguir los pasos siguientes:
Crear la base de datos con el mismo nombre que la que vamos a adjuntar.
En este ejemplo la base de datos la he llamado BBDD.
Dejar la base de datos en estado de EMERGENCIA.
ALTER DATABASE BBDD SET EMERGENCY
Para los servicios de la instancia de SQL, y renombrar o eliminar el .mdf y .ldf.
Restaurar o copiar el .mdf que traemos de otro sitio en el lugar que el anterior.
Iniciar los servicios de SQL Server.
Ponemos la base de datos en estado de usuario único.
ALTER DATABASE BBDD set single_user
Pasar un checkdb para comprobar y reparar la base de datos.
DBCC CHECKDB (BBDD , REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS
La anterior, hay que ejecutarla 2 veces, ya que la primera vez que la pasamos sale el mensaje diciendo que no está el .ldf que lo generará de nuevo, y la segunda vez es cuando la ejecuta.
Dejamos la base de datos en MULTIUSUARIO y lista para funcionar.
ALTER DATABASE BBDD SET MULTI_USER
Este es el script completo para ejecutarlo línea por línea.
–******************************************************************
— RECUPERAR BASE DE DATOS SIN LDF *
–******************************************************************
— 1.- Crear base de datos desde Management Studio
— 2.- Dejar base de datos en estado de emergencia
ALTER DATABASE BBDD SET EMERGENCY
— 3.- Parar servicios de SQL, renombrar .mdf y .ldf
— 4.- Poner .mdf de la bbdd a recuperar
— 5.- Iniciar los servicios de SQL
–Vemos el estado en el que está la base de datos
SELECT state_desc FROM sys.databases WHERE name=‘BBDD’
–Ponemos la base de datos como sigle user
ALTER DATABASE BBDD set single_user
–Pasamos un checkdb sobre la base de datos
DBCC CHECKDB (BBDD , REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS
–Dejamos la base de datos BBDD como multiusuario y accesible
ALTER DATABASE BBDD SET MULTI_USER