Oto dlaczego MySQL nie widzi tych plików: Systemowa przestrzeń tabel (ibdata1) posiada specyficzny dla Storage-Engine słownik danych, który pozwala InnoDB mapować potencjalne użycie tabel:
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Przeniesienie tabel InnoDB z jednego miejsca w inne wymaga poleceń takich jak
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Oto fragment Dokumentacja MySQL 5.5 wyjaśniający, co należy wziąć pod uwagę
Portability Considerations for .ibd Files
Nie można swobodnie przenosić plików .ibd między katalogami bazy danych, tak jak można to robić z plikami tabel MyISAM. Definicja tabeli przechowywana we współdzielonej przestrzeni tabel InnoDB zawiera nazwę bazy danych. Identyfikatory transakcji i numery sekwencji dziennika przechowywane w plikach przestrzeni tabel również różnią się między bazami danych.
Aby przenieść plik .ibd i powiązaną z nim tabelę z jednej bazy danych do drugiej, użyj polecenia RENAME TABLE:
RENAME TABLE db1.tblname TO db2.tblname; Jeśli posiadasz “czystą” kopię zapasową pliku .ibd, możesz przywrócić go do instalacji MySQL, z której pochodzi, w następujący sposób:
Tabela nie może być upuszczona lub obcięta od czasu skopiowania pliku .ibd, ponieważ robienie tego zmienia identyfikator tabeli przechowywany wewnątrz przestrzeni tabel.
Wydaj to polecenie ALTER TABLE, aby usunąć bieżący plik .ibd:
ALTER TABLE tbl_name DISCARD TABLESPACE; Skopiuj zapasowy plik .ibd do właściwego katalogu bazy danych.
Wydaj to polecenie ALTER TABLE, aby powiedzieć InnoDB, aby użył nowego pliku .ibd dla tabeli:
ALTER TABLE tbl\name IMPORT TABLESPACE; W tym kontekście “czysta” kopia zapasowa pliku .ibd to taka, dla której spełnione są następujące wymagania:
W pliku .ibd nie ma niezaangażowanych modyfikacji przez transakcje.
W pliku .ibd nie ma żadnych niezamkniętych wpisów bufora insertów.
Oczyszczanie usunęło wszystkie oznaczone do usunięcia rekordy indeksu z pliku .ibd.
mysqld przepłukał wszystkie zmodyfikowane strony pliku .ibd z puli buforów do pliku.
Biorąc pod uwagę te zastrzeżenia i protokoły, oto sugerowany sposób postępowania
Dla tego przykładu spróbujmy przywrócić tabelę tags
do bazy danych mydb
KROK #1
Upewnij się, że masz kopie zapasowe tych plików .frm
i .ibd
w /tmp/innodb_data
KROK #2
Pobierz instrukcję CREATE TABLE tags
i wykonaj ją jako CREATE TABLE mydb.tags ...
. Upewnij się, że jest to dokładnie ta sama struktura, co oryginalna tags.frm
KROK #3
Usuń puste tags.ibd
używając MySQL
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
KROK #4
Wprowadź kopię zapasową tags.ibd
.
ALTER TABLE mydb.tags IMPORT TABLESPACE;
KROK #5
Dodaj tabelę tags
do słownika danych InnoDB
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
KROK 6
Przetestuj dostępność tabeli
Jeśli uzyskasz normalne wyniki, gratuluję, że importujesz tabelę InnoDB.
KROK 7
W przyszłości nie usuwaj ibdata1 i jego logów
Spróbuj !!!
Omawiałem już takie rzeczy wcześniej
CAVEAT
Co zrobić, jeśli nie znasz struktury tabeli tags
?
Istnieją narzędzia do uzyskania instrukcji CREATE TABLE po prostu używając pliku .frm
. Napisałem również post na ten temat : Jak wyodrębnić schemat tabeli tylko z pliku .frm? . W tym poście skopiowałem plik .frm na maszynę Windows z pudełka Linux, uruchomiłem narzędzie Windows i uzyskałem oświadczenie CREATE TABLE
.