Architektura InnoDB wymaga użycia czterech podstawowych rodzajów stron informacyjnych
- Strony danych tabeli
- Tabele indeksu stron
- Tabela Metadane
- Dane MVCC (w celu wsparcia izolacji transakcji i zgodności z ACID )
- Wycofywanie segmentów
- Cofnij spację
- Podwójny bufor zapisu (zapisywanie w tle, aby uniknąć polegania na buforowaniu systemu operacyjnego)
- Wstaw bufor (zarządzanie zmianami w nieunikalnych indeksach wtórnych)
Zobacz obrazowe przedstawienie ibdata1
Domyślnie innodb_file_per_table jest wyłączony. Powoduje to, że wszystkie cztery typy stron informacyjnych trafiają do jednego pliku o nazwie ibdata1. Wiele osób próbuje rozpowszechniać dane, tworząc wiele plików ibdata. Może to prowadzić do fragmentacji danych i stron indeksu.
Dlatego często zalecam oczyszczenie infrastruktury InnoDB, używając domyślnego pliku ibdata1 i nic więcej .
Kopiowanie jest bardzo niebezpieczne ze względu na infrastrukturę, w której działa InnoDB. Istnieją dwie podstawowe infrastruktury
- tablica_pliku_internatywnego wyłączona
- włączony plik innodb_file_per_table
Po wyłączeniu 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 zrzut MySQL, 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:
/var/lib/mysql/db1/mytable.frm
/var/lib/mysql/db1/mytable.ibd
Systemowa przestrzeń tabel ibdata1
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 chodzi o fragmentację tabeli, oto co dzieje się z ibdata1:
- innodb_file_per_table włączony : możesz zmniejszyć plik db1.mytables za pomocą
ALTER TABLE db1.mytable ENGINE=InnoDB;
lubOPTIMIZE TABLE db1.mytable;
. Powoduje to, że /var/lib/mysql/db1/mytable.ibd jest fizycznie mniejszy bez fragmentacji.
- innodb_file_per_table wyłączony : nie można zmniejszyć pliku db1.mytables za pomocą
ALTER TABLE db1.mytable ENGINE=InnoDB;
lubOPTIMIZE TABLE db1.mytable;
ponieważ znajduje się on w ibdata1. Właściwie uruchamiając dowolne polecenie, spraw, aby tabela była ciągła i szybsza do odczytu i zapisu. Niestety dzieje się to na końcu ibdata1. To sprawia, że ibdata1 szybko rośnie. Zostało to w pełni rozwiązane w moim poście do czyszczenia InnoDB .
Jeśli zastanawiasz się nad skopiowaniem pliku .frm i .ibd, czeka Cię świat cierpienia. Kopiowanie plików .frm i .ibd tabeli InnoDB jest dobre tylko wtedy i tylko wtedy, gdy możesz zagwarantować, że identyfikator obszaru tabel pliku .ibd jest dokładnie zgodny z wpisem id obszaru tabel w metadanych pliku ibdata1 .
Napisałem dwa posty w DBA StackExchange na temat tej koncepcji identyfikatora obszaru tabel
Oto doskonały link, jak ponownie podłączyć dowolny 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ś natychmiast uświadomić sobie, że kopiowanie plików .ibd jest po prostu szalone.
W przypadku InnoDB wystarczy tylko coś takiego przenieść
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.
Jeśli chodzi o mieszanie wszystkich tabel InnoDB ze wszystkich baz danych, widzę mądrość. W firmie DB / Web hostingowej mojego pracodawcy mam jednego klienta MySQL, który ma tabelę w jednej bazie danych, której ograniczenia są mapowane na inną tabelę w innej bazie danych w tej samej instancji MySQL. Dzięki jednemu wspólnemu repozytorium metadanych umożliwia obsługę transakcji i obsługę MVCC w wielu bazach danych.