2009-04-21 22 views
15

Mam plik MDF i brak plików LDF dla bazy danych utworzonej w MS SQL Server 2005. Kiedy próbuję dołączyć plik MDF do innego serwera SQL, pojawia się następujący komunikat o błędzie.Jak odzyskać bazę danych z MDF w 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.

chciałbym wykonać dowolną z następujących opcji:

  1. Dołączanie bazy danych bez utraty danych (mało prawdopodobne, ale uratuje mi trochę czasu).
  2. Dołącz bazę danych z utratą danych (bez względu na to, jakie transakcje zostały otwarte).
  3. Odzyskaj tylko schemat (brak danych) z pliku MDF.

Jakie polecenia SQL mogę spróbować ponownie uruchomić moją bazę danych?

Odpowiedz

21

Znalazłem następujący dokument na Experts Exchange.

patriunkt: Będziesz mieć utratę danych, ale można to zrobić.

 
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

Jakość tej porady jest ** niepoprawnie ** zła. Kto korzysta z tego * rozwiązania *, po prostu odejdź. Kończysz jak http://serverfault.com/questions/171145/sql-server-2005-attach-without-transaction-log-urgent –

+7

Czy możesz dokładnie określić, co jest złego w tej opinii? Pytanie wyraźnie stwierdza, że ​​utrata danych jest akceptowalna. – Martin

+3

Uratowałem moją skórę ... – tbikeev

9

z postu na SQL Server Forum Attaching MDF without LDF:

Jeśli chcesz dołączyć MDF bez LDF można wykonać następujące kroki jest przetestowany i działa poprawnie

  1. Utwórz nową bazę danych z tą samą nazwą i tymi samymi plikami MDF i LDF

  2. Zatrzymaj serwer sql i zmień nazwę istniejącego pliku MDF na nowy i skopiuj oryginalny plik MDF do tej lokalizacji i usuń pliki LDF.

  3. Uruchom SQL Server

  4. Teraz baza danych zostanie oznaczony podejrzany 5. zaktualizować sysdatabases zaktualizować do trybu awaryjnego. To nie będzie wykorzystywać pliki dziennika w rozruchu

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. serwera SQL Restart. obecnie baza danych będzie w trybie awaryjnym

  2. teraz wykonać nieudokumentowane DBCC utworzyć plik dziennika

DBCC REBUILD_LOG (dbname 'c: \ dbname.ldf') - Undocumented krok do utwórz nowy plik dziennika.

(wymienić dbname i zalogować nazwę pliku na podstawie ur wymogu)

  1. Execute sp_resetstatus

  2. Zrestartuj serwer SQL i zobaczyć baza danych jest w trybie online.

UPDATE: DBCC REBUILD_LOG nie istniejący SQL2005 i powyżej.Powinno to zadziałać:

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

natknąłem tego artykułu, jak również. DBCC REBUILD_LOG nie istnieje w SQL Server 2005. – Martin

+1

Używanie flagi ATTACH_REBUILD_LOG powoduje wyświetlenie tego samego komunikatu o błędzie co oryginalny wpis. – Martin

+0

DB nie zawsze pojawia się jako status SUSPECT. Możliwe jest uzyskanie błędu w tym pytaniu, wykonanie tych kroków, a skończy się na DB, który jest w porządku (status ONLINE). To zależy od tego, co się dzieje, gdy DB odłączy się niespodziewanie. –

5

Czy próbował ignorować LDF i po prostu dołączyć MDF:

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

Nie wiem dokładnie, co stanie się z twoimi otwartymi transakcjami (prawdopodobnie po prostu zgubiłeś), ale może przywrócić dane z powrotem do trybu online.

-Don

+0

To zadziałało jak urok dla mnie - wszystko inne stworzyło błędy. – dmb

+0

koleś, świetnie się bawisz –

1

Znaleziono inny sposób, który działa całkowicie:

  1. Utwórz nową bazę danych o tej samej nazwie na domyślną lokalizację bazy danych.
  2. Zatrzymaj serwer SQL.
  3. skopiować stary plik mdf nadpisać nowo utworzony plik mdf i usuń nowy plik LDF
  4. Uruchom SQL Server, baza danych będzie w trybie awaryjnym
  5. Odłączyć tryb awaryjny bazie
  6. skopiować plik oryginalny LDF do domyślnej lokalizacji bazy (gdzie nowy plik LDF jak tworzone i usuwane w etapie 3 powyżej.
  7. Dołącz plik MDF bazy danych.

mam bazę danych, po wypróbowaniu wszystkich powyższych że nie powiodło się dla mnie.

11

Oto szczegóły, które obejmuje części 2) i 3) w przypadku ponownego - tworzenie dziennika nie działa, co może się zdarzyć, jeśli plik MDF jest uszkodzony.

Dane i strukturę można odzyskać tylko po odczytaniu pliku MDF za pomocą narzędzia innej firmy, które może odkodować to, co jest zapisane jako dane binarne, ale nawet przy takich narzędziach nie zawsze można wykonać to zadanie całkowicie. W takich przypadkach można wypróbować ApexSQL Recover. Z tego, co wiem, jest to jedyne narzędzie, które może wykonywać tę pracę, ale jest dość drogie.

Znacznie lepiej jest spróbować odzyskać te dane ze starych kopii zapasowych, jeśli je posiadasz.

0

Mam nadzieję, że nie jest łatwo zrobić,

  1. Otwórz SQL Server
  2. Kliknij New Query
  3. wykonać następujące zapytanie

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

Gdzie chcesz dbname chcesz pokazać w Eksploratorze obiektów, gdzie @physname jest lokalną lokalizacją ścieżki twojego pliku mdf.

Mam nadzieję, że pomoże komuś, zrobiłem to wyżej, dostałem zarówno strukturę, jak i dane.

Testowany w SQL Server 2000 i 2008. W SQL Server 2000 nie działa, ale działa doskonale w 2008.

Powiązane problemy