Jak cofnąć tabelę DROP?

11

Przypadkowo upuściłem wszystkie stoły. Czy mogę przywrócić z powrotem? Nie mam kopii zapasowej.

Mark Henderson
źródło

Odpowiedzi:

12

Jeśli dosłownie nie masz kopii zapasowej, jestem w 99% pewien, że nie masz szczęścia.

Jeśli masz jakąkolwiek formę tworzenia kopii zapasowej, bez względu na to, jak stara, to czy włączono rejestrowanie binarne za pomocą opcji log-bin w pliku konfiguracyjnym MySQL (my.ini)? Jeśli tak, możesz je odzyskać od czasu ostatniej kopii zapasowej.

Przykro mi, nie udało mi się zacząć tygodnia, stary.

Siekacz 3
źródło
2
Przypuszczalnie dlatego, że nie masz doświadczenia, wszyscy robiliśmy takie rzeczy, wciąż coś robimy (w rzeczywistości nie zamknąłem się w moim własnym VCenter jeszcze tydzień temu) - liczy się tylko to, że uczysz się z niego, więc jesteś mniej prawdopodobnie się powtórzy.
Chopper3
Co mogę teraz zrobić?? Nie mogę po prostu usiąść i czekać !!!!
8
Powiedz swojemu menedżerowi
Chopper3
4
Nie rozwiązuje problemu, ale może jeden z programistów ma kopię, która nie jest zbyt odległa od ostatniej dobrej kopii?
Tom O'Connor,
3
Tom podnosi bardzo dobry punkt: jeśli Twoi programiści mają zwyczaj regularnego robienia migawek danych na żywo w celach testowych / programistycznych, możesz mieć szczęście i jedna z nich ma dość nieskażoną kopię, aby obniżyć swoją sytuację z „ całkowita katastrofa ”, a jedynie„ poważne niedogodności ”.
David Spillett,
7

Pytanie jest dość stare, ale nie ma jednej pozytywnej odpowiedzi, więc dodam jedną.

Po tym, jak MySQL upuści tabelę, dane są jeszcze przez jakiś czas na nośniku. Możesz więc pobrać rekordy i odbudować tabelę. Później napiszę o tym na blogu, ale na razie szybki szkic.

Potrzebujesz struktury tabeli (instrukcja CREATE TABLE).

Jeśli parametr innodb_file_per_table jest włączony, upuszczona tabela znajduje się na partycji dysku. Zatrzymaj MySQL i zamontuj go jak najszybciej jak tylko do odczytu. Jeśli MySQL był na partycji głównej (co nie jest dobrym pomysłem przy okazji), zrób zdjęcie lub wyjmij dysk i podłącz do innego serwera. Innymi słowy, zatrzymaj wszystkie zapisy.

Jeśli INnodb_file_per_table OFF, to po prostu zatrzymaj MySQL.

Następnie pobierz i skompiluj narzędzie Un-Drop dla InnoDB z https://github.com/twindb/undrop-for-innodb/ . Szczegółowe informacje można znaleźć w poście „ Kompilowanie zestawu narzędzi do odzyskiwania TwinDB ”.

Następnie przeanalizuj partycję dyskową lub ibdata1 (w zależności od ustawienia pliku_nodb_plik_per_table) za pomocą parametru stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Następnie odzyskaj słownik InnoDB, aby dowiedzieć się, w którym indeksie znajdowała się usunięta tabela.

Następnie weź strukturę tabeli i pobierz rekordy

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

Wypisze rekordy na stdout, a komendę LOAD DATA na stderr.

akuzminsky
źródło
panie, uratowałeś mi życie
Buddhi741
2

Oto co zrobiłem. W katalogu mysql (dla Ubuntu jest to / var / lib / mysql, dla Maca korzystającego z Homebrew jest to / usr / local / var / mysql), znalazłem kilka plików. Najpierw skopiowałem katalog myapp_development / zawierający określony schemat do mojego lokalnego katalogu mysql. Następnie utworzyłem kopię zapasową mojego lokalnego ibdata1 i skopiowałem ibdata1 serwera do katalogu mysql. Zabity mysqld. ( ps auxaby znaleźć PID, to kill PID). Zrestartowałem mysql, zaczął działać w trybie odzyskiwania po awarii. Następnie uruchomiłem lokalnego klienta mysql i wygenerowałem pełny zrzut potrzebnych tabel.

I 15 000 wierszy reprezentujących tygodnie pracy nad wprowadzaniem metadanych, które naszym zdaniem zniknęły na zawsze, są zapisywane !!

Mam nadzieję, że to komuś pomoże.

Książę
źródło
To niezły wysiłek, ale na pewno nie pokładałbym zbyt wiele nadziei w to, że jest to niezawodna technika. Niemniej jednak +1 za kreatywne myślenie.
John Gardeniers
Tak, masz rację. Skończyło się to działaniem tylko dlatego, że przypadkowo usunęliśmy wszystkie uprawnienia użytkownika mysql, więc baza danych była dla tego użytkownika pusta.
Duke
2

Niestety niewiele można zrobić, oprócz zabrania bardzo cennej lekcji na temat potrzeby dobrego planu tworzenia kopii zapasowych.

W zależności od rodzaju tabeli możesz znaleźć eksperta, który może poskładać dane z powrotem z tego, co pozostało na dysku, ale taka analiza kryminalistyczna byłaby bardzo, bardzo droga (ponieważ wymagałaby stosunkowo rzadkich umiejętności) i wcale nie gwarantowana być naprawdę użytecznym.

David Spillett
źródło
Czy jest jakaś inna opcja?
1
Jak sugeruje FractalizeR, jeśli tabele były prostymi tabelami MyISAM, być może można cofnąć usunięcie plików z nimi powiązanych. Jeśli masz zamiar spróbować później to trzeba wyłączyć serwer teraz , bo już system jest aktywny tym większa szansa jest, że przestrzeń używana przez pliki zostaną ponownie wykorzystane dokonywania cofnąć niemożliwe (lub dokonującej nieusuniętych plików uszkodzony treści ). Sposób cofnięcia usunięcia zależy od używanego systemu plików. ntfsundelete.com to pierwszy przydatny link w wyszukiwarce Google dotyczącej cofnięcia usunięcia w NTFS.
David Spillett,
0

Jeśli była to tabela MyISAM, wystarczy cofnąć usunięcie plików tabeli w katalogu / var / log / mysql lub jakimkolwiek katalogu danych. Możesz na przykład użyć narzędzia ext3grep .

Vladislav Rastrusny
źródło
ext3grep jest przeznaczony dla systemów plików ext3. Jeśli używasz systemu Windows, prawdopodobnie nie używasz systemu plików ext3 (prawdopodobnie używasz systemu plików NTFS, chociaż może to być FAT32). Jeśli chcesz spróbować odzyskać usunięte pliki, musisz jak najszybciej zamknąć serwer, bez względu na to, jakie inne usługi są na nim uruchomione, ponieważ im dłużej serwer jest aktywny, tym większa szansa, że ​​cofnięcie usunięcia nie pomoże ty w ogóle.
David Spillett,
Jeśli masz włączoną funkcję kopiowania w tle na woluminie, w którym przechowywane są tabele MyISAM, możesz spróbować odzyskać je w ten sposób.
Catherine MacInnes,
Aby przywrócić usunięty plik bazy danych, możesz wyszukać w Google hasło „ntfs undelete”. Nie wiem, gdzie znajduje się katalog danych na twoim komputerze. W tym celu należy sprawdzić plik my.ini lub wyszukać pliki z rozszerzeniem MYD.
Vladislav Rastrusny
0

Nie można cofnąć DROP TABLE.

Możesz sprawdzić, czy w tym MySQL włączono rejestrowanie binarne , może stamtąd możesz wyodrębnić niektóre dane.

Poza tym możesz zapomnieć o MySQL i masz problemy z tą samą klasą, co „Przypadkowo usunąłem niektóre pliki z mojego systemu plików”. Istnieje kilka narzędzi, które próbują odzyskać pliki, a są też firmy, które robią to profesjonalnie.

Luke404
źródło
-1

Jeśli masz włączone rejestrowanie binarne, możesz po prostu ponownie utworzyć tabelę, jeśli masz schemat. Upewnij się, że tworzysz schemat, gdy masz wyłączone binlogs. Lub możesz po prostu pominąć sesję. Następnie możesz odtwarzać dzienniki bin do ostatniej instrukcji, która była samą tabelą upuszczania.

Jeśli nie, możesz przywrócić za pomocą zrzutu kopii zapasowej, jeśli taki masz. Jeśli masz pliki csv, możesz załadować metodę infiltracji danych w celu odzyskania danych. Jeśli odzyskujesz z mysqldump, możesz rozważyć przywrócenie pojedynczej tabeli z pliku zrzutu zamiast przywracania pełnej bazy danych. Jeśli rozmiar danych jest zbyt duży, możesz rozważyć wyłączenie kluczy przed załadowaniem, co znacznie zwiększy proces przywracania.

W przyszłości możesz chcieć mieć opóźnionego niewolnika o 10-24 godziny za sobą. Możesz utworzyć opóźnionego slave za pomocą zestawu narzędzi Percona (pt-slave-delay)

Roger Moore
źródło