2009-04-21 13 views
15

Possiedo un file MDF e nessun file LDF per un database creato in MS SQL Server 2005. Quando si tenta di collegare il file MDF a un altro SQL Server, viene visualizzato il seguente messaggio di errore.Come ripristinare il database da MDF in 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.

Vorrei realizzare una delle seguenti opzioni:

  1. collegare il database senza perdita di dati (improbabile, ma mi farebbe risparmiare un po 'di tempo).
  2. Allegare il database con perdita di dati (qualsiasi transazione aperta è persa).
  3. Recupera solo lo schema (nessun dato) dal file MDF.

Quali comandi SQL posso provare a riavviare il database?

risposta

21

ho trovato il seguente documento sul Experts Exchange.

patrikt: Si avrà una perdita di dati, ma può essere fatto.

 
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 qualità di questo consiglio è ** increadibly ** bad. Chiunque si imbattesse in questa * soluzione *, deve solo allontanarsi. Finirai come http://serverfault.com/questions/171145/sql-server-2005-attach-without-transaction-log-urgent –

+7

Potresti definire esattamente cosa c'è di male in questo consiglio? La domanda afferma chiaramente che la perdita di dati è accettabile. – Martin

+3

Salvato la mia pelle ... – tbikeev

9

da un post al forum di SQL Server Attaching MDF without LDF:

Se si desidera collegare un MDF senza LDF è possibile seguire i passi di seguito E 'testato e funziona bene

  1. Creare un nuovo database con lo stesso nome e stessi file MDF e LDF

  2. Arresta il server sql e rinomina l'MDF esistente in uno nuovo e copia l'MDF originale in questa posizione ed elimina i file LDF.

  3. avviare SQL Server

  4. Ora il database verrà contrassegnato come sospetto 5. Aggiornare lo sysdatabases per aggiornare in modalità di emergenza. Questo non utilizzare i file di registro in start up

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 
    Riavviare il server sql
  1. . ora il database sarà in modalità di emergenza

  2. Ora eseguire il DBCC non documentato per creare un file di log

DBCC REBUILD_LOG (dbname, 'c: \ dbname.ldf') - passo Undocumented a crea un nuovo file di registro.

(sostituire il dbname e il registro il nome del file in base a ur requisito)

  1. Esegui sp_resetstatus

  2. Riavviare il server SQL e vedere il database è in linea.

UPDATE: DBCC REBUILD_LOG non fa SQL2005 e sopra esistente.Questo dovrebbe funzionare:

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

mi sono imbattuto in questo articolo pure. DBCC REBUILD_LOG non esiste in SQL Server 2005. – Martin

+1

L'utilizzo del flag ATTACH_REBUILD_LOG restituisce lo stesso messaggio di errore del post originale. – Martin

+0

Il DB non viene sempre visualizzato come stato SUSPECT. È possibile ottenere l'errore in questa domanda, eseguire questi passaggi e finire con un DB che va bene (stato ONLINE). Dipende da cosa stava succedendo quando il DB si è staccato in modo imprevisto. –

5

hai provato a ignorare la LDF e basta collegare il mdf:

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

Non so esattamente cosa accadrà alle transazioni aperte (probabilmente appena perso), ma potrebbe riportare i dati online.

-don

+0

Questo ha funzionato come un fascino per me - tutto il resto ha creato errori. – dmb

+0

amico, ti piace tanto –

1

Trovato un altro modo che funziona in modo completamente:

  1. Creare nuovo database con lo stesso nome di percorso del database predefinito.
  2. Arresta server SQL.
  3. Copia vecchio file mdf per sovrascrivere file MDF appena creato e cancellare nuovo file ldf
  4. Avviare SQL Server, database sarà in modalità di emergenza
  5. Staccare la modalità di emergenza banca dati
  6. Copiare file LDF originale percorso predefinito del database (dove nuovo file LDF come creato ed eliminato di cui al precedente punto 3.
  7. Collegare il file di database MDF.

ho ottenuto un database di lavoro dopo aver provato tutto quanto sopra che non è riuscito per me.

11

Ecco i dettagli che riguardano le parti 2) e 3) nel caso in cui ri -creare il registro non funziona che può accadere se il file MDF è corrotto.

È possibile ripristinare i dati e la struttura solo leggendo il file MDF con alcuni strumenti di terze parti che possono decodificare ciò che viene scritto come dati binari ma anche con tali strumenti non è sempre possibile eseguire il lavoro completamente.

In questi casi è possibile provare ApexSQL Recover. Da quello che so questo è l'unico strumento che può fare questo tipo di lavoro ma è piuttosto costoso.

Un'idea molto migliore è provare a recuperarli da eventuali vecchi backup, se ne avete.

0

Spero che sia facile farlo,

  1. Aprire SQL Server
  2. clic su Nuova query
  3. eseguire la query seguente

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

Dove dbname si desidera visualizzare in Esplora oggetti, dove @physname è il percorso del percorso file locale del file mdf.

Spero che possa aiutare qualcuno, ho fatto da sopra, ottenuto sia la struttura che i dati.

testato in SQL Server 2000 e il 2008. In SQL Server 2000 non funziona, ma funziona perfettamente nel 2008.

Problemi correlati