Oto dlaczego MySQL nie widzi tych plików: Systemowy obszar tabel (ibdata1) ma słownik danych specyficzny dla silnika pamięci, który pozwala InnoDB odwzorować potencjalne użycie tabeli:
Przenoszenie tabel InnoDB z jednego miejsca do drugiego wymaga poleceń takich jak
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Oto część dokumentacji MySQL 5.5 wyjaśniająca, co należy wziąć pod uwagę
Zagadnienia dotyczące przenośności plików .ibd
Nie można swobodnie przenosić plików .ibd między katalogami baz danych, jak w przypadku plików tabel MyISAM. Definicja tabeli przechowywana we współdzielonym obszarze tabel InnoDB obejmuje nazwę bazy danych. Identyfikatory transakcji i numery sekwencji dziennika przechowywane w plikach obszaru tabel również różnią się między bazami danych.
Aby przenieść plik .ibd i powiązaną tabelę z jednej bazy danych do innej, użyj instrukcji RENAME TABLE:
ZMIEŃ TABELĘ db1.tbl_name TO db2.tbl_name; Jeśli masz „czystą” kopię zapasową pliku .ibd, możesz przywrócić go do instalacji MySQL, z której pochodzi:
Tabela nie może zostać usunięta ani obcięta od czasu skopiowania pliku .ibd, ponieważ spowoduje to zmianę identyfikatora tabeli przechowywanego w obszarze tabel.
Wydaj tę instrukcję ALTER TABLE, aby usunąć bieżący plik .ibd:
ALTER TABLE tbl_name DISCARD TABLESPACE; Skopiuj plik kopii zapasowej .ibd do odpowiedniego katalogu bazy danych.
Wydaj tę instrukcję ALTER TABLE, aby poinformować InnoDB o użyciu nowego pliku .ibd dla tabeli:
ALTER TABLE nazwa_bloku tbl 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 żadnych niezatwierdzonych modyfikacji w wyniku transakcji.
W pliku .ibd nie ma nie połączonych wpisów bufora wstawiania.
Purge usunęło wszystkie zaznaczone do usunięcia rekordy indeksu z pliku .ibd.
mysqld opróżnił 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 działania
W tym przykładzie spróbujmy przywrócić tags
tabelę do mydb
bazy danych
KROK 1
Upewnij się, że masz kopie zapasowe tych .frm
i .ibd
plików/tmp/innodb_data
KROK 2
Pobierz CREATE TABLE tags
instrukcję i wykonaj ją jako CREATE TABLE mydb.tags ...
. Upewnij się, że ma dokładnie taką samą strukturę jak oryginałtags.frm
KROK 3
Usuń puste tags.ibd
za pomocą MySQL
ALTER TABLE mydb.tags DISCARD TABLESPACE;
KROK 4
Przynieś kopię zapasową tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
KROK 5
Dodaj tags
tabelę do słownika danych InnoDB
ALTER TABLE mydb.tags IMPORT TABLESPACE;
KROK 6
Przetestuj dostępność stołu
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Jeśli otrzymasz normalne wyniki, gratulacje importujesz tabelę InnoDB.
KROK 7
W przyszłości nie usuwaj ibdata1 i jego dzienników
Spróbuj !!!
Rozmawiałem już o takich sprawach
CAVEAT
Co jeśli nie znasz struktury tabeli tags
?
Istnieją narzędzia do uzyskania instrukcji CREATE TABLE przy użyciu samego .frm
pliku. Napisałem również o tym post: Jak wyodrębnić schemat tabeli tylko z pliku .frm? . W tym poście skopiowałem plik .frm na maszynę z systemem Windows z systemu Linux, uruchomiłem narzędzie Windows i otrzymałem CREATE TABLE
instrukcję.