Przywracanie tabel MySQL z plików .ibd, .frm i mysqllogbin

10

Z jakiegoś powodu, gdy próbuję otworzyć moje tabele, które są przechowywane .frmi .ibdpliki (czy to na MySQL, czy phpmyadmin), pojawia się błąd składniowy lub mówi, że nie istnieje.

Przeczytałem inny post, który miał podobny problem, ale nie wiem, jak sprawdzić, czy innodb_file_per_tablejest włączony, i ogólnie jestem po prostu zdezorientowany. Przekształciłem również kopię mojego mysql-bin.000002pliku do pliku txt, więc widzę, że dane z mojej bazy danych nie zostały całkowicie utracone.

Baza danych została utworzona w zeszłym roku. Mam 6 takich mysql-bin.00000plików, ale z jakiegoś powodu .000002jest największy. W tej chwili mam pliki .ibdi .frmdla wszystkich moich baz danych, ale nie wiem, jak mogę je przywrócić z powrotem do MySQL, a przynajmniej do czegoś, co mogę przeczytać.

Używam WampServer 2.4 i MySQL 5.6.12 na Windows 2003 Server. Czy mam też pobrać wtyczkę do InnoDB?

pielęgnacja
źródło
Nie, powstał w zeszłym roku. Mam 6 takich plików mysql-bin.00000, ale z jakiegoś powodu .000002 jest największy. W tej chwili mam pliki .ibd i .frm dla wszystkich moich baz danych, ale nie wiem, jak przywrócić je z powrotem do MySQL, a przynajmniej do czegoś, co mogę przeczytać.
Carment

Odpowiedzi:

20

W końcu zorientowałem się i rozwiązałem swój problem poprzez wiele prób i błędów. Dla tych, którzy nie mają oryginalnego pliku ibdata1 i mają tylko swoje pliki .frm i .ibd, oto sposób, w jaki przywróciłem moje dane.

  1. Pobierz i zainstaluj narzędzia MySQL ze strony -> http://dev.mysql.com/downloads/utilities .
  2. Przejdź do swojego polecenia / terminala, aby otworzyć narzędzie MySQL, mysqlfrm, i użyj go do znalezienia struktury tabeli, którą chcesz przywrócić. Jak to zrobiłem, zostałem zapisany w lokalizacji mysqlfrm, a następnie wprowadziłem „mysqlfrm --server = użytkownik: pwd @ localhost --port = 3307„ ścieżka_do_pliku.frm ”> nazwa_tabeli.txt”. Plik .txt powinien zostać zapisany w tym samym folderze, w którym zapisywane są narzędzia, jeśli nie określono, gdzie ma się znaleźć.
  3. W pliku tekstowym zobaczysz instrukcje CREATE TABLE, które zawierają wszystkie kolumny i informacje (w zasadzie oryginalną strukturę) tabeli. Skopiuj instrukcję CREATE ze wszystkimi tymi informacjami.
  4. W poleceniu MySQL utwórz nową bazę danych (UTWÓRZ BAZĘ bazy danych nazwa_bazy danych). Nadaj mu taką samą nazwę jak oryginalna nazwa bazy danych.
  5. Utwórz nową tabelę w nowej bazie danych - nie musi ona mieć takiej samej nazwy jak folder. Możesz utworzyć nową tabelę w wierszu polecenia, ale ja utworzyłem swoją tabelę w PhpMyAdmin, darmowym narzędziu, które obsługuje administrację MySQL przez Internet. Po prostu kliknąłem bazę danych na PhpMyAdmin, a następnie tabelę SQL i wkleiłem strukturę tabeli z # 3. (Na marginesie, zawsze otrzymywałem błędy, gdy nazwałem tabelę „tabelą” w wierszu polecenia, więc staraj się unikać tej nazwy).
  6. W poleceniu MySQL przejdź do bazy danych i wpisz „ALTER TABLE nazwa_tabeli DISCARD TABLESPACE”, co spowoduje usunięcie pliku .ibd tej tabeli.
  7. Skopiuj plik .ibd oryginalnej tabeli (tabeli, którą chcesz przywrócić) do nowo utworzonej tabeli, aby zastąpić właśnie usunięty plik .ibd. Zmień początkowy plik .ibd na nazwę nowo utworzonej tabeli. To naśladuje stary plik .ibd, który właśnie usunąłeś. Możesz znaleźć ten folder w folderze danych MySQL, w nowo utworzonym folderze bazy danych na twoim komputerze.
  8. Wróć do komendy MySQL, przejdź do bazy danych i wpisz „ALTER TABLE table_Name IMPORT TABLESPACE”. Otrzymasz instrukcję typu „ostrzeżenie” (1), ale zignoruj ​​ją.
  9. I zrobione! jeśli spróbujesz uzyskać dostęp do nowej tabeli, powinna ona zawierać wszystkie dane ze starej tabeli.

Mam nadzieję, że to pomogło i daj mi znać, jeśli masz jakieś pytania lub komentarze! Sprawdź także http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file, aby uzyskać więcej informacji.

pielęgnacja
źródło
Świetne instrukcje, ale działa tylko z MySQL 5.6 ! W wersji 5.5 pojawi się błąd Got error -1 from storage enginepodczas uruchamiania IMPORT TABLESPACE. Ale dla mnie MySQL 5.6 działał dla tabel utworzonych przy pomocy MySQL 5.5, więc wszystko jest dobrze;). Jeśli utkniesz z 5.5, musisz postępować zgodnie z instrukcjami w linku chriscender, który podałeś.
ostrokach
@carment Postępowałem zgodnie z instrukcjami, ale napotykam ERRPR: próbuję uzyskać dostęp do strony o numerze 1767006713 w przestrzeni 13635, nazwie miejsca <nazwa_db> / <nazwa_tabeli>, która jest poza obszarem tabel. Czy możesz mi pokierować, co mogłem zrobić?
Mohit Mehta
To tylko zaoszczędziło mi czasu na odtworzenie stołu. Metoda nadal działa w 2016 roku na MySQL 5.7.17
Andy Mercer
@ostrokach wygląda na to, że nie masz innodb_file_per_tablewłączonej.
Yvan
Po prostu… uratowałeś mnie po bardzo długiej podróży, dziękuję!
Amr SubZero,
4

Główny plik danych InnoDB - zwykle nazywany ibdata- jest niezbędny, aby MySQL mógł zrozumieć twoje pliki .ibd.

Jeśli chcesz przenosić dane między serwerami za pomocą plików binarnych, powinieneś zatrzymać MySQL w czystym porządku, a następnie przenieść wszystkie pliki danych, w tym pliki ibdata , między katalogami.

Bardziej niezawodnym mechanizmem przenoszenia danych między serwerami w systemie Windows byłoby użycie ( mysqldump) lub eksportu bazy danych z PHPMyAdmin (lub podobnego narzędzia).

Jeśli rejestrowanie binarne jest włączone przez cały czas działania serwera (na podstawie komentarzy, może nie być tak), można również użyć mysqlbinlogdo odzyskania każdej instrukcji SQL uruchomionej na serwerze z plików mysql-bin i w ten sposób utwórz ponownie bazę danych. W plikach mysql-bin powinny znajdować się znaczniki czasu unix, które pomogą ci określić, jak daleko się cofają.

Jeśli utraciłeś oryginalne pliki bazy danych i pozostały tylko pojedyncze pliki .ibd, być może będziesz musiał skorzystać z odzyskiwania danych zgodnie z sugestiami akuzminsky w komentarzach.

MySQL 5.6 ma kilka nowych funkcji do przenoszenia plików danych InnoDB .ibd ( przenośne przestrzenie tabel ), ale wymagają one trochę wysiłku, a dla wystarczająco małej bazy danych przesyłanie danych będzie znacznie łatwiejsze mysqldump.

Nathan Jolly
źródło
0

Odpowiedź Wiki wygenerowana z komentarzy do pytania autorstwa akuzminsky


Jeśli widzisz *.ibdpliki, innodb_file_per_tableoznacza to ON, że w przeciwnym razie wszystkie tabele byłyby w nim ibdata1.

Jeśli powie, że tabela nie istnieje, tabeli brakuje w słowniku InnoDB. Spróbuj zrzucić wszystkie tabele na osobne zrzuty sql (jedna tabela - jeden plik). Tabele, których nie można zrzucić, można przywrócić za pomocą zestawu narzędzi odzyskiwania TwinDB .

Nie ma jeszcze pakietów binarnych. Musisz pobrać kod źródłowy z GitHub i skompilować go. Zobacz instrukcje w słowniku Odzyskaj InnoDB . To całkiem proste:

git clone [email protected]:twindb/undrop-for-innodb.git

i wtedy

make all
Paul White
źródło