Jak odzyskać bazę danych MySQL z plików .myd, .myi, .frm

183

Jak przywrócić jedną z moich baz danych MySQL z .myd, .myi, .frmplików?

chandrajeet
źródło
10
Chociaż odpowiedziałem na to, to naprawdę należy do Serverfault.
derobert
31
@chandrajeet powinieneś naprawdę zaakceptować najczęściej głosowaną odpowiedź.
Wieża
2
Hej, Chandrajeet, dlaczego nie akceptujesz odpowiedzi Deroberta? Potwierdzam, że to też działa dla mnie. Czy to nie dla ciebie? stackoverflow.com/help/someone-answers
Taz

Odpowiedzi:

173

Jeśli są to tabele MyISAM, umieszczenie plików .FRM, .MYD i .MYI w katalogu bazy danych (np. /var/lib/mysql/dbname) Spowoduje udostępnienie tej tabeli. Nie musi to być ta sama baza danych, z której pochodzą, ten sam serwer, ta sama wersja MySQL lub ta sama architektura. Może być również konieczna zmiana właściciela folderu (np. chown -R mysql:mysql /var/lib/mysql/dbname)

Pamiętaj, że uprawnienia ( GRANTitp.) Są częścią mysqlbazy danych. Więc nie zostaną przywrócone wraz ze stołami; może być konieczne uruchomienie odpowiednich GRANTinstrukcji w celu utworzenia użytkowników, udzielenia dostępu itp. (Przywracanie mysqlbazy danych jest możliwe, ale należy zachować ostrożność w przypadku wersji MySQL i wszelkich potrzebnych uruchomień mysql_upgradenarzędzia).

W rzeczywistości prawdopodobnie potrzebujesz tylko .FRM (struktura tabeli) i .MYD (dane tabeli), ale będziesz musiał naprawić tabelę, aby odbudować .MYI (indeksy).

Jedynym ograniczeniem jest to, że w przypadku obniżenia wersji najlepiej sprawdzić informacje o wersji (i prawdopodobnie uruchomić tabelę napraw). Nowsze wersje MySQL oczywiście dodają funkcje.

[Chociaż powinno być oczywiste, że mieszając i dopasowując tabele, problemem jest integralność relacji między tymi tabelami; MySQL nie będzie się tym przejmować, ale Twoja aplikacja i użytkownicy mogą. Ponadto ta metoda w ogóle nie działa w przypadku tabel InnoDB. Tylko MyISAM, ale biorąc pod uwagę posiadane pliki, masz MyISAM]

derobert
źródło
Czy to naprawdę zadziałałoby bez dodania odpowiednich wpisów do tabeli information_schema? Mam na myśli, że MySQL musi wiedzieć, aby szukać tych plików, prawda?
Zenshai
4
Tabele schematu informacyjnego w rzeczywistości nie istnieją, są tylko widokami na wewnętrzny stan bazy danych. Zobacz dev.mysql.com/doc/refman/5.0/en/information-schema.html
brian-brazil
4
Wow, czułem się brudny, ale upuszczenie całego katalogu z instalacji MySQL4 na MySQL5.1 po prostu magicznie odtworzyło tabele. Bez restartu lub czegokolwiek (w systemie Windows).
Dave
4
Działa, musisz tylko pamiętać, aby uruchomić (dla każdej tabeli): check table sometable; a następnie uruchomić naprawę (tylko w razie potrzeby): repair table sometable;
Nux
3
To działało świetnie! Umieściłem pliki na miejscu, ale mysql ich nie „widział”, dopóki nie zmieniłem właściciela na „mysql: mysql”.
sean.boyer
26

Pamiętaj, że jeśli chcesz odbudować plik MYI, prawidłowe użycie TABELI NAPRAW jest następujące:

NAPRAWA TABELI czasem USE_FRM;

W przeciwnym razie prawdopodobnie pojawi się kolejny błąd.

mcardellg
źródło
24

Właśnie odkryłem rozwiązanie tego problemu. Używam MySQL 5.1 lub 5.6 w systemie Windows 7.

  1. Skopiuj .frm plik i ibdata1 ze starego pliku, który znajduje się na "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  2. Zatrzymaj instancję serwera SQL w bieżącej instancji SQL
  3. Przejdź do folderu danych znajdującego się w folderze „C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data”
  4. Wklej ibdata1 i folder bazy danych, który zawiera plik .frm z pliku, który chcesz odzyskać.
  5. Uruchom instancję MySQL.

Nie ma potrzeby lokalizowania plików .MYI i .MYD dla tego odzyskiwania.

alnel
źródło
Wykonał te kroki (po tym, jak wszystko inne zawiodło) i użył innodb_force_recovery = 4poziomu (nie jestem pewien, czy w tym przypadku był potrzebny). Dzięki Bogu!
Joshua Stewardson,
6
FYI: ibdata1to InnoDB, nie MyISAM.
derobert
14

Jedną rzecz do zapamiętania:

Plik .FRM ma strukturę tabeli i jest specyficzny dla twojej wersji MySQL.

Plik .MYD NIE jest specyficzny dla wersji, a przynajmniej nie dla mniejszych wersji.

Plik .MYI jest specyficzny, ale można go pominąć i zregenerować, REPAIR TABLEtak jak mówią inne odpowiedzi.

Celem tej odpowiedzi jest poinformowanie, że jeśli masz zrzut schematu swoich tabel, możesz go użyć do wygenerowania struktury tabeli, a następnie zastąpić te pliki .MYD kopiami zapasowymi, usunąć pliki MYI i naprawić je wszystko. W ten sposób możesz przywrócić kopie zapasowe do innej wersji MySQL lub całkowicie przenieść bazę danych bez użycia mysqldump. Uważam to za bardzo pomocne przy przenoszeniu dużych baz danych.

Brent
źródło
14

Prosty! Utwórz obojętną bazę danych (powiedz abc)

Skopiuj wszystkie pliki .myd, .myi, .frm do mysql \ data \ abc, gdzie mysql \ data \ to miejsce, w którym przechowywane są pliki .myd, .myi, .frm dla wszystkich baz danych.

Następnie przejdź do phpMyadmin, przejdź do db abc i znajdziesz swoją bazę danych.

Vishal
źródło
najkrótsza i precyzyjna odpowiedź
Serak Shiferaw
Najlepszy sposób na odzyskanie danych ... Zainstalowałem WAMP, a następnie utworzyłem nową bazę danych, skopiowałem pliki do nowego katalogu bazy danych C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase otwórz phpmyadmin i twoja nowa baza danych, będziesz zobacz dane
Alexandre George
7

Myślę, że .myi można naprawić od wewnątrz mysql.

Jeśli widzisz tego rodzaju komunikaty o błędach z MySQL: Baza danych nie wykonała zapytania (zapytania) 1016: Nie można otworzyć pliku: „ableable.MYI ”. (errno: 145) Błąd Msg: 1034: Niepoprawny plik klucza dla tabeli: „able ”. Spróbuj to naprawić, a prawdopodobnie masz uszkodzony lub uszkodzony stół.

Możesz sprawdzić i naprawić tabelę za pomocą monitu mysql w następujący sposób:

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

a teraz twój stół powinien być w porządku:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+
Elzo Valugi
źródło
6

Znalazłem rozwiązanie do konwersji plików do .sqlpliku (możesz następnie zaimportować .sqlplik na serwer i odzyskać bazę danych), bez potrzeby dostępu do /varkatalogu, dlatego nie musisz być administratorem serwera, aby to zrobić.

Wymaga XAMPP lub MAMP zainstalowanych na twoim komputerze.

  • Po zainstalowaniu XAMPP przejdź do katalogu instalacyjnego (zwykle C:\XAMPP) i do podkatalogu mysql\data. Pełna ścieżka powinna byćC:\XAMPP\mysql\data
  • Wewnątrz zobaczysz foldery innych utworzonych przez ciebie baz danych. Kopiuj i Wklej folder pełen .myd, .myii .frmpliki do tam. Ścieżka do tego folderu powinna być

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • Następnie odwiedź localhost/phpmyadminw przeglądarce. Wybierz bazę danych, którą właśnie wkleiłeś do mysql\datafolderu, i kliknij Eksportuj na pasku nawigacyjnym. Wybiera eksport jako .sqlplik. Następnie pojawi się pytanie, gdzie zapisać plik

I to jest to! Powinieneś (aś) teraz mieć .sqlplik zawierający bazę danych, która była pierwotnie .myd, .myii .frmpliki. Następnie możesz zaimportować go na inny serwer przez phpMyAdmin, tworząc nową bazę danych i naciskając „Importuj” na pasku nawigacyjnym, a następnie postępując zgodnie z instrukcjami, aby go zaimportować

Kaspar Lee
źródło
5

Możesz skopiować pliki do odpowiednio nazwanego katalogu podkatalogowego folderu danych, o ile jest to DOKŁADNA ta sama wersja mySQL i zachowałeś wszystkie powiązane pliki w tym katalogu. Jeśli nie masz wszystkich plików, jestem pewien, że będziesz mieć problemy.

cgp
źródło
Jeśli nie mam DOKŁADNEJ tej samej wersji MySQL, co mam zrobić?
Jo Sprague,
2

Powyższy opis nie był wystarczający, aby wszystko działało dla mnie (prawdopodobnie gęste lub leniwe), więc stworzyłem ten skrypt, gdy znalazłem odpowiedź, która pomoże mi w przyszłości. Mam nadzieję, że pomaga innym

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
dny238
źródło
-2

Dla tych, którzy mają Windows XP i zainstalowany serwer MySQL 5.5 - bazą danych jest C: \ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data, chyba że zmieniłeś lokalizację w instalacji MySql Workbench GUI.

Demon
źródło
3
Pytanie dotyczy odzyskiwania z określonych typów plików, a nie miejsc, w których można je znaleźć w systemie Windows XP MySQL 5.5.
Danpe,