Odzyskaj bazę danych MySQL z folderu danych bez ibdata1 z plików ibd

15

Mój katalog WAMP został przypadkowo usunięty przez innego użytkownika. Dostępny jest tylko folder danych w MySQL. I w tym dostępne są tylko foldery bazy danych (foldery w „\ bin \ mysql \ mysql5.6.12 \ data \” z nazwą baz danych). Wszystkie pliki, w tym „ ibdata1 ” w katalogu głównym „\ bin \ mysql \ mysql5.6.12 \ data \”, również są usuwane.

Foldery bazy danych zawierają tylko pliki z poniższymi rozszerzeniami.

* .frm, * .ibd

i plik „db.opt”.

Jak można odzyskać bazy danych?

Próbowałem już odzyskać bdata1. Ale nie mogę go odzyskać. Niektóre bazy danych zawierają również MYISAM.

cyberwani
źródło

Odpowiedzi:

16

MyISAM

W przypadku tabeli MyISAM mydb.mytable powinieneś mieć trzy pliki

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Powinny być już dostępne jako tabela, ponieważ każdy plik zawiera potrzebne dane, metadane i informacje o indeksie. Łącznie tworzą one stół. Brak dostępu do zewnętrznych mechanizmów silnika pamięci masowej.

InnoDB

Spójrz na to obrazowe przedstawienie InnoDB

Architektura InnoDB

Jedyną rzeczą, która dołącza ibdata1 do .ibdplików, jest słownik danych.

Twoim zadaniem, jeśli zdecydujesz się je zaakceptować, jest stworzenie każdego stołu i zamiana w .ibd

Zanim cokolwiek zrobisz, wykonaj pełną kopię „\ bin \ mysql \ mysql5.6.12 \ data” na inną

Oto próbka

Załóżmy, że masz bazę danych mydbz tabelą mytable. To znaczy

  • Masz folder \bin\mysql\mysql5.6.12\data\mydb
  • Wewnątrz tego folderu masz
    • mytable.frm
    • mytable.ibd

Potrzebujesz .frm. Jeśli spojrzysz na mój post Jak wyodrębnić schemat tabeli tylko z pliku .frm? , możesz pobrać narzędzie MySQL, które może wygenerować kod SQL wymagany do utworzenia tabeli.

Powinieneś teraz wykonać następujące czynności

  • Przenieś mytable.ibddo\bin\mysql\mysql5.6.12\data
  • Uruchom SQL, aby utworzyć tabelę InnoDB
  • Zaloguj się do mysql i uruchom ALTER TABLE mydb.mytable DISCARD TABLESPACE;(spowoduje to usunięcie \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Skopiuj \bin\mysql\mysql5.6.12\data\mytable.ibddo\bin\mysql\mysql5.6.12\data\mydb
  • Zaloguj się do mysql i uruchom ALTER TABLE mydb.mytable IMPORT TABLESPACE;(spowoduje to zarejestrowanie \bin\mysql\mysql5.6.12\data\mydb\mytable.ibdw słowniku danych)

Następnie stół mydb.mytablepowinien być w pełni dostępny. Możesz przetestować tę dostępność, po prostu uruchamiając:

SELECT * FROM mydb.mytable LIMIT 10;

Spróbuj !!!

NAPÓJ (Odzyskiwanie danych obejmuje niezbędną wiedzę) Odpowiedzialnie

RolandoMySQLDBA
źródło
Aby wypełnić tę świetną odpowiedź, w przypadku innodb musisz usunąć wszelkie ograniczenia FK odnoszące się do tabeli przed odrzuceniem jej obszaru tabel. Po zaimportowaniu należy ponownie utworzyć FK.
SebaGra,
po zaimportowaniu obszaru information_schema.key_column_usagetabel (prawdopodobnie również inne tabele) nie zwrócą danych przy pierwszym, selectwięc musisz wykonać co najmniej jedno zapytanie i odczekać kilka sekund, zanim następne zapytanie będzie mogło działać. (mysql Ver 14.14 Distrib 5.7.19, dla linux-glibc2.12 (x86_64) przy użyciu otoki EditLine)
user3338098 10.09 19.09