2009-04-21 34 views
15

Tengo un archivo MDF y ningún archivo LDF para una base de datos creada en MS SQL Server 2005. Cuando intento adjuntar el archivo MDF a un servidor SQL diferente, aparece el siguiente mensaje de error.¿Cómo recuperar la base de datos de MDF en SQL Server 2005?

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

Me gustaría llevar a cabo cualquiera de las siguientes opciones:

  1. Coloque la base de datos sin pérdida de datos (poco probable, pero me ahorraría algo de tiempo).
  2. Adjunte la base de datos con pérdida de datos (se pierden las transacciones abiertas).
  3. Recupere el esquema solamente (sin datos) del archivo MDF.

¿Qué comandos SQL puedo intentar para que mi base de datos vuelva a funcionar?

Respuesta

21

Encontré el siguiente documento en Experts Exchange.

patrikt: Tendrá pérdida de datos, pero se puede hacer.

 
1. Detach database and move your mdf to save location. 
2. Create new databse of same name, same files, same file location and same file size. 
3. Stop SQL server. 
4. Swap mdf file of just created DB to your save one. 
5. Start SQL. DB will go suspect. 
6. ALTER DATABASE yourdb SET EMERGENCY 
7. ALTER DATABASE yourdb SET SINGLE_USER 
8. DBCC CHECKDB (yourdb, REPAIR_ALLOW_DATA_LOSS) 
9. ALTER DATABASE yourdb SET MULTI_USER 
10. ALTER DATABASE yourdb SET ONLINE 
+4

La calidad de este consejo es ** increíblemente mala. Quien se encuentre con esta * solución *, simplemente váyase. Usted terminará como http://serverfault.com/questions/171145/sql-server-2005-attach-without-transaction-log-urgent –

+7

¿Podría definir exactamente qué es lo malo de este consejo? La pregunta establece claramente que la pérdida de datos es aceptable. – Martin

+3

Me salvó la piel ... – tbikeev

9

de un poste en los foros de Desarrollo Attaching MDF without LDF:

Si desea adjuntar un MDF sin LDF puede seguir los siguientes pasos Se ha probado y funciona bien

  1. Crear una nueva base de datos con el mismo nombre y los mismos archivos MDF y LDF

  2. Detenga el servidor sql y cambie el nombre del MDF existente por uno nuevo y copie el MDF original a esta ubicación y elimine los archivos LDF.

  3. iniciar SQL Server

  4. Ahora su base de datos será marcada como sospechosa 5. Actualizar los sysdatabases para actualizar a modo de emergencia. Esto no va a utilizar archivos de registro en la puesta en marcha

Sp_configure "allow updates", 1 
go 
Reconfigure with override 
GO 
Update sysdatabases set status = 32768 where name = "BadDbName" 
go 
Sp_configure "allow updates", 0 
go 
Reconfigure with override 
GO 
  1. Reiniciar el servidor SQL. Ahora la base de datos estará en modo de emergencia

  2. Ahora ejecutar el DBCC no documentado para crear un archivo de registro

DBCC REBUILD_LOG (nombrebd, 'c: \ dbname.ldf') - paso sin documentar a crear un nuevo archivo de registro.

(reemplazar el nombredb y log nombre de archivo basado en el requisito del ur)

  1. Ejecutar sp_resetstatus

  2. Reiniciar el servidor SQL y ver la base de datos está en línea.

ACTUALIZACIÓN: DBCC REBUILD_LOG qué no SQL2005 y por encima existente.Esto debería funcionar:

USE [master] 
GO 
CREATE DATABASE [Test] ON 
    (FILENAME = N'C:\MSSQL\Data\Test.mdf') 
    FOR ATTACH_REBUILD_LOG 
GO 
+0

me encontré con este artículo también. DBCC REBUILD_LOG no existe en SQL Server 2005. – Martin

+1

El uso del indicador ATTACH_REBUILD_LOG genera el mismo mensaje de error que la publicación original. – Martin

+0

El DB no siempre aparecerá como estado SUSPECT. Es posible obtener el error en esta Pregunta, realice estos pasos y termine con una BD que esté bien (estado EN LÍNEA). Depende de lo que estaba sucediendo cuando el DB se separó inesperadamente. –

5

que han tratado de ignorar el LDF y simplemente conecte el mdf:

sp_attach_single_file_db [@dbname =] 'dbname', [@ physname =] 'physical_name'

No sé exactamente qué pasará con sus transacciones abiertas (probablemente solo se pierda), pero podría volver a poner sus datos en línea.

-don

+0

Esto funcionó como un amuleto para mí, todo lo demás creó errores. – dmb

+0

amigo, te gusta el tiempo –

1

Encontrado una otra forma en que funciona por completo:

  1. Crear nueva base de datos con el mismo nombre a la ubicación predeterminada de base de datos.
  2. Detener el servidor SQL.
  3. Copia de archivos mdf de edad para sobrescribir el archivo mdf de nueva creación y borrar nuevo archivo LDF
  4. de inicio de SQL Server, la base de datos estará en modo de emergencia
  5. Separar base de datos
  6. Copiar archivo LDF original, el modo de emergencia a la ubicación predeterminada de base de datos (donde el nuevo archivo LDF como creados y eliminados en el paso 3 anterior.
  7. una el archivo MDF base de datos.

que tiene una base de datos de trabajo después de probar todo lo anterior que fracasó para mí.

11

A continuación, detalles que cubren las partes 2) y 3) en caso de re el registro de creación no funciona, lo que puede suceder si el archivo MDF está dañado.

Puede recuperar datos y estructura solo leyendo archivos MDF con alguna herramienta de terceros que pueda descifrar lo que está escrito como datos binarios, pero incluso con tales herramientas no siempre puede realizar el trabajo por completo.

En tales casos, puede intentar ApexSQL Recover. Por lo que sé, esta es la única herramienta que puede hacer este tipo de trabajo pero es bastante costosa.

Mucho mejor idea es tratar de recuperarlos de cualquier copia de seguridad anterior, si la tiene.

0

espero que sea fácil de hacerlo,

  1. SQL Open Server
  2. clic en Nueva consulta
  3. Ejecutar la siguiente consulta

    sp_attach_single_file_db @ dbname = 'dbname', @ physname = 'C: \ Database \ dbname.MDF'

Dónde dbname es que desea mostrar en el Explorador de objetos, donde @physname es la ubicación ruta de archivo local de su archivo MDF.

Espero que ayude a alguien, hice lo anterior, obtuve tanto la estructura como los datos.

Probado en SQL Server 2000 y 2008. En SQL Server 2000 no está funcionando, pero funciona perfectamente en 2008.

Cuestiones relacionadas