Zadanie polegało na próbie odzyskania bazy danych, która uległa uszkodzeniu (z powodu awarii we / wy, która została naprawiona od tego czasu). Nie znam bazy danych ani jej zawartości.
Otrzymałem starą (~ 3 tygodnie) pełną kopię zapasową i serię dzienników transakcji ... jednak brakuje dzienników transakcji, więc mogę odzyskać dane tylko do określonej daty. Brakuje około 2,5 tygodnia danych (i do tej bazy danych ciągle dodaje się dużo danych).
Dostałem również kopię uszkodzonej bazy danych (która jest dostępna, ale z dużą ilością stron uszkodzonych / brakujących).
Próbowałem typowych DBCC CHECKDB
poleceń (nadal nie repair_allow_data_loss
, to będzie moja ostatnia deska ratunku, jeśli nic więcej nie zadziała).
Po wielu przychodzi i idzie do bazy danych (db jest 1,5 terabajtowym małym potworem i wszystko, co robię, jest powolne i zajmuje trochę czasu), próbowałem przywrócić stronę online z ostatniej znanej dobrej kopii zapasowej uszkodzonych stron.
Aby to zrobić, stworzyłem skrypt, który tworzy wiele RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
poleceń na podstawie danych DBCC CHECKDB
wyjściowych (zwykle wyrażenie regularne i odrębne) ... jak dotąd tak dobrze, że działało to do momentu, w którym powiedziałem, że osiągnąłem limit 1000 stron na plik (w tym pliku db znajduje się 8 plików) na polecenie przywracania.
Więc prosi mnie o „dokończenie przywracania online”, ale nie potrafię tego zrobić ... Nie mam dziennika ogona ani niczego bardziej kompletnego niż pełna kopia zapasowa, od której zaczynam, więc Zasadniczo nie wiem, jak dokończyć przywracanie, aby kontynuować próbowanie z resztą stron.
Próbowałem, RESTORE DATABASE <foo> WITH RECOVERY
ale to też nie działało, prosi mnie o dziennik, którego nie mam.
Czy ktoś ma jakieś wskazówki, jak mogę spróbować odzyskać coś z tego miejsca? Lub jak „ukończyć” przywracanie online, aby móc nadal próbować odzyskać więcej stron? Czy miałbym ten sam problem, jeśli spróbuję przywrócić offline (zasadniczo dodając WITH NORECOVERY
do wszystkiego, a następnie próbując przywrócić go na końcu?)
Ręczne opracowanie bazy danych jest w zasadzie niemożliwe do wykonania ... istnieją setki tabel z milionami wierszy i nie ma jasnego znaczenia, co to jest. Uszkodzona baza danych nie powiedzie się w przypadku SELECT
zapytań po kilku milionach wierszy, ale nie jestem pewien, czy uda mi się ustalić, gdzie. Próbowałem odbudować wszystkie indeksy nieklastrowane, ale istnieją uszkodzone strony z danymi wierszy, więc to też nie działało.
Pewna utrata danych byłaby akceptowalna, ale spójność w bazie danych powinna przynajmniej starać się osiągnąć.
Uszkodzona baza danych jest nadal w trybie online, a klienci nad nią pracują (więc wciąż otrzymuje nowe dane), więc każdy proces, który wykonuję na stole laboratoryjnym, powinien być później odtwarzalny w produkcyjnej bazie danych (przestoje będą trudne).
To jest SQL Server 2014 Enterprise
PS: Nie jestem DBA ... Jestem programistą, ale klient wypróbował niektóre „eksperckie” usługi odzyskiwania po awarii SQL i zrezygnowali, więc zostałem poproszony o obejrzenie i sprawdzenie, czy mógłbym Zrób cokolwiek.
Aktualizacja : po wielu testach przywracanie strona po stronie nie było możliwe, więc porzuciliśmy ten pomysł. Chcemy ręcznie odzyskać dane (ręcznie wybierając brakujące rekordy z uszkodzonych tabel i wstawić je do ostatniej znanej dobrej kopii zapasowej), wykonując do tego kilka zautomatyzowanych narzędzi (znowu są setki tabel).