2009-05-29 13 views
5

Mam żywą bazę danych, która usunęła z niej pewne dane i potrzebuję tych danych. Mam bardzo aktualną kopię tej bazy danych, która została już odtworzona na innym komputerze. Od czasu utworzenia kopii zapasowej wprowadzono niepowiązane zmiany w żywej bazie danych, więc nie chcę wymazywać bazy danych z pełnym przywróceniem.Jak mogę uratować małą część danych z kopii zapasowej bazy danych SQL Server?

Potrzebne mi dane są małe - tylko kilkanaście wierszy - ale te tuziny rzędów mają po kilka rzędów z innych tabel z obcymi klawiszami, a te kilka wierszy mają bóg wie, ile wierszy z obcymi klawiszami wskazuje na nie , więc odtworzenie ręczne byłoby skomplikowane.

Idealnie byłbym w stanie wskazać kopię zapasową bazy danych, aby wybrać kilkanaście rzędów, których potrzebuję, i przechodnie zamknięcie wszystkiego, od czego one zależą, i wszystko, co zależy od nich, i wyeksportować tylko te dane, które mogę następnie zaimportować do żywej bazy danych bez dotykania czegokolwiek innego.

Jakie jest najlepsze podejście do tego? Dzięki.

Wszyscy wymienili sp_generate_inserts. Podczas korzystania z tego, w jaki sposób blokujesz wszystkie kolumny tożsamości? Czy właśnie włączasz WSTAW TOŻSAMOŚCI?

+0

+1, powodzenia! –

Odpowiedz

1

Już wcześniej spotkałem się z podobnymi sytuacjami, ale okazało się, że robienie tego ręcznie działało najlepiej dla mnie.

Przywróciłem kopię zapasową na drugi serwer i wykonałem zapytanie, aby uzyskać potrzebne informacje, następnie utworzyłem skrypt, aby wstawić dane sp_generate_inserts, a następnie powtórzyć dla każdej z moich tabel, które zawierały relacyjne wiersze.

W sumie miałem tylko 10 rekordów głównych z danymi relacyjnymi w 2 innych tabelach. Zajęło mi to około godziny, aby wszystko wróciło tak, jak było.

UPDATE Aby odpowiedzieć na pytanie o sp_generate_inserts, tak długo, jak można określić @ właściciel = „dbo”, to ustawić wkładkę tożsamości na ON, a następnie ustawić go wyłączyć na końcu skryptu dla Ciebie.

+0

Udało mi się. sp_generate_inserts jest pomocny, ale nie powiedzie się (jak to się mówi) na tabelach z mnóstwem kolumn i tabel z nvarcharnymi kolumnami. Ograniczenie do 128 znaków w klauzuli WHERE. W rezultacie musiałem wykonać co najmniej jedną czynność ręcznie dla każdego stołu. –

1

musisz przywrócić ręcznie. sp_generate_inserts jest dobre dla nowych danych. ale aby zaktualizować dane zrobić to w ten sposób:

SELECT 'Update YourTable ' 
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL') 
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL') 
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable 

można utworzyć wstawia ten sposób zbyt, ale sp_generate_inserts jest lepsza. Obserwuj te wartości tożsamości i powodzenia (już wcześniej miałem ten problem i wiem, gdzie jesteś teraz).

użyteczne wyszukiwania:

--find out if there are missing rows, and which ones 
SELECT 
    b.key,c.key 
    from backupserver.databasename.owner.YourTable b 
     LEFT OUTER JOIN YourTable     c ON b.key=c.key 
    WHERE c.Key is NULL 

--find differences 
SELECT 
    b.key,c.key 
    from YourTable            c 
     LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key 
    WHERE b.Key is not null 
     AND ( ISNULL(c.column1,-9999)  != ISNULL(b.column1,-9999) 
      OR ISNULL(c.column2,'~')  != ISNULL(b.column2,'~') 
      OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE()) 
      ) 
Powiązane problemy