Odpowiedzi:
Kopiowanie jest bardzo proste dla MyISAM i całkowicie ryzykowne (prawie samobójcze) z InnoDB.
Z twojego pytania, które wychowałeś
cp /db1/mytable.frm /db2/mytable.frm
To jest OK do zrobienia. Nie można jednak po prostu przenieść pliku .frm. Musisz przenieść wszystkie elementy. Z twojego pytania weźmy tabelę o nazwie db1.mytable. W normalnej instalacji tabela znajduje się w / var / lib / mysql / db1. Tabela składałaby się z trzech plików.
Musisz przenieść wszystkie trzy pliki, aby przenieść jedną tabelę. Jeśli wszystkie tabele używają silnika pamięci MyISAM, możesz zamknąć mysql i skopiować. Jeśli po prostu tworzysz kopię tabeli i umieszczasz ją w innej bazie danych, powinieneś to zrobić za pomocą SQL.
Na przykład, jeśli chcesz skopiować plik db1.mytable do bazy danych db2, wykonaj następujące czynności:
CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;
Teraz, jeśli po prostu przenosisz tabelę z db1 na db2, możesz to zrobić:
ALTER TABLE db1.mytable RENAME db2.mytable;
Kopiowanie jest bardzo niebezpieczne ze względu na infrastrukturę, na której działa InnoDB. Istnieją dwie podstawowe infrastruktury: 1) wyłączona tabela_plików_pliku_internatywnego i 2) włączona tabela plików_plików_nodb_pliku
Piętą achillesową InnoDB jest systemowy plik obszaru tabel znany jako ibdata1 (zwykle znajduje się w / var / lib / mysql). Co zawiera ten plik ?
Przy wyłączonej innodb_file_per_table wszystkie te typy informacji InnoDB są dostępne w ibdata1. Jedynym przejawem dowolnej tabeli InnoDB poza ibdata1 jest plik .frm tabeli InnoDB. Kopiowanie wszystkich danych InnoDB jednocześnie wymaga skopiowania wszystkich plików / var / lib / mysql.
Kopiowanie pojedynczej tabeli InnoDB jest całkowicie niemożliwe. Musisz mysqldump, aby wyodrębnić zrzut tabeli jako logiczną reprezentację danych i odpowiadających im definicji indeksu. Następnie załadujesz ten zrzut do innej bazy danych na tym samym serwerze lub innym serwerze.
Przy włączonej opcji innodb_file_per_table dane tabeli i jej indeksy znajdują się w folderze bazy danych obok pliku .frm. Na przykład dla tabeli db1.mytable przejawem tej tabeli InnoDB poza ibdata1 byłoby:
Wszystkie metadane dla db1.mytable nadal znajdują się w ibdata1 i nie ma absolutnie żadnej możliwości uniknięcia tego . Ponów dzienniki i dane MVCC również nadal działają z ibdata1.
Jeśli zastanawiasz się nad skopiowaniem pliku .frm i .ibd, czeka Cię świat cierpienia. Skopiowanie pliku .frm i .ibd tabeli InnoDB jest dobre tylko wtedy, gdy możesz zagwarantować, że identyfikator obszaru tabel pliku .ibd jest dokładnie zgodny z wpisem id obszaru tabel w metdanych pliku ibdata1.
Napisałem dwa posty w DBA StackExchange na temat tej koncepcji identyfikatora obszaru tabel
Oto doskonały link do tego, jak ponownie podłączyć plik .ibd do ibdata1 w przypadku niedopasowanych identyfikatorów obszaru tabel: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Po przeczytaniu tego powinieneś zobaczyć, dlaczego powiedziałem prawie samobójcze.
W przypadku InnoDB wystarczy to zrobić
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
zrobić kopię tabeli InnoDB. Jeśli migrujesz go na inny serwer DB, użyj mysqldump.
.frm
, .MYD
i .MYI
.
Kopiowanie całego katalogu danych MySQL jest praktyczną techniką, zakładając, że usługa MySQL jest zatrzymana i chcesz skopiować cały serwer bazy danych.
Jest to przydatna technika do przenoszenia baz danych z dużymi indeksami, a zrzut mysql nie będzie zawierał indeksów, które trzeba będzie zregenerować podczas importu. Uważam tę technikę za przydatną podczas konfigurowania slaveów MySQL.
Kopiowanie pojedynczego pliku zależy od używanego schematu tabeli, ale w większości przypadków nie jest odpowiednim rozwiązaniem.
Użyj xtrabackup w / ow bez innobackupex wrappera, a będziesz dobrze zarówno w bazach danych myisam, jak i innodb. Pamiętaj, że przywracanie baz danych innodb to nie tylko kopiowanie plików, nawet jeśli używasz xtrabackup. Powiedz, jeśli potrzebujesz więcej informacji
Nie, powinieneś wykonać kopię zapasową za pomocą mysqdump i przywrócić za pomocą narzędzia mysql cli, kopiując plik frm, kopiujesz tylko strukturę tabeli, a nie dane w środku, a jeśli jesteś na innodb, skopiuj plik bezpośrednio, to nie jest możliwe.
Najlepszym sposobem jest zrzut i przywrócenie tabeli.