Zgodnie z MySQL 5.0 Certification Study Guide , rozdział 32 sekcja 32.3.4, strony 456,457 opisują warunki przenoszenia danych binarnych, które przedstawiają:
Przenośność binarna jest ważna, jeśli chcesz wykonać kopię binarną utworzoną na jednym komputerze i użyć jej na innym komputerze o innej architekturze. Na przykład użycie binarnej kopii zapasowej jest jednym ze sposobów kopiowania baz danych z jednego serwera MySQL na inny.
W przypadku MyISAM przenośność binarna oznacza, że możesz bezpośrednio skopiować pliki tabeli MyISAM z jednego serwera MySQL na inny na innym komputerze, a drugi serwer będzie mógł uzyskać dostęp do tabeli.
W przypadku InnoDB przenośność binarna oznacza, że możesz bezpośrednio skopiować pliki obszaru tabel z serwera MySQL na jednym komputerze na inny serwer na innym komputerze, a drugi serwer będzie mógł uzyskać dostęp do obszaru tabel. Domyślnie wszystkie tabele InnoDB zarządzane przez serwer są przechowywane razem w obszarze tabel, więc przenośność obszaru tabel jest funkcją tego, czy wszystkie poszczególne tabele InnoDB są przenośne. Jeśli choć jedna tabela nie jest przenośna, nie ma też obszaru tabel.
Tabele MyISAM i obszary tabel InnoDB są binarnie przenośne z jednego hosta na inny, jeśli spełnione są dwa warunki:
- Obie maszyny muszą używać arytmetyki liczb całkowitych z dopełnianiem dwóch liczb całkowitych
- Oba komputery muszą używać formatu zmiennoprzecinkowego IEEE, w przeciwnym razie tabele nie mogą zawierać kolumn zmiennoprzecinkowych (FLOAT lub DOUBLE)
W praktyce te dwa warunki stanowią niewielkie ograniczenie. Arytmetyka liczb całkowitych z uzupełnieniem do dwóch i format zmiennoprzecinkowy IEEE są normą na nowoczesnym sprzęcie. Trzecim warunkiem przenośności binarnej InnoDB jest użycie małych liter w tabelach i bazach danych. Wynika to z faktu, że InnoDB przechowuje te nazwy wewnętrznie (w słowniku danych) małymi literami w systemie Windows. Używanie małych liter umożliwia przenośność binarną między Windows a Unixem, aby wymusić użycie małych liter, możesz umieścić następujące linie w pliku opcji:
[mysqld]
lower_case_table_names=1
Jeśli skonfigurujesz InnoDB do korzystania z przestrzeni tabel dla tabeli, warunki przenośności binarnej zostaną rozszerzone o pliki .ibd dla tabel InnoDB. (Warunki współdzielonych obszarów tabel nadal obowiązują, ponieważ zawiera słownik danych, który przechowuje informacje o wszystkich tabelach InnoDB.)
Jeśli warunki przenośności binarnej nie są spełnione, możesz skopiować tabele MyISAM lub InnoDB z jednego serwera na inny, zrzucając je przy użyciu jakiegoś formatu tekstowego (na przykład z mysqldump) i ponownie ładując je na serwer docelowy.
Istnieją dwa główne sposoby przenoszenia poszczególnych tabel w oparciu o silnik pamięci masowej.
W podanym przykładzie założymy, że:
- datadir to / var / lib / mysql
- baza danych o nazwie mydb
- tabela w bazie danych mydb o nazwie mytable .
Stoły MyISAM
Jeśli mydb.mytable korzysta z silnika pamięci MyISAM, tabela będzie fizycznie zamanifestowana jako trzy osobne pliki
- /var/lib/mysql/mydb/mytable.frm (plik .frm)
- /var/lib/mysql/mydb/mytable.MYD (plik .MYD)
- /var/lib/mysql/mydb/mytable.MYI (plik .MYI)
Plik
.frm zawiera strukturę tabeli .MYD zawiera dane tabeli
.MYI zawiera stronę indeksu tabeli
Pliki te są używane niezależnie do reprezentowania tabeli z logicznego punktu widzenia w mysql. Ponieważ do tych plików nie są dołączone żadne dalsze logiczne powiązania, migracja tabeli z jednego serwera DB na inny. Możesz to zrobić nawet z serwera Windows na Linux Server lub MacOS. Oczywiście możesz zamknąć mysql i skopiować 3 pliki tabel. Możesz uruchomić następujące czynności:
LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
w jednej sesji ssh, aby utrzymać tabelę jako tylko do odczytu i przytrzymać zamek przez 24 godziny. Sekundę później wykonaj kopię w innej sesji ssh. Następnie zabij sesję mysql z 24-godzinną blokadą. Nie musisz czekać 24 godziny.
Tabele InnoDB
Na podstawie wyżej wymienionego cytatu z książki certyfikacji istnieje wiele czynników, które określają sposób tworzenia kopii zapasowej określonej tabeli InnoDB. Ze względu na prostotę, przejrzystość i zwięzłość, po prostu wykonaj mysqldump żądanej tabeli, używając parametrów --single-transaction, aby uzyskać idealny zrzut tabeli w czasie. Nie musisz cncernować się semantyką InnoDB, jeśli chcesz tylko jedną tabelę. Możesz ponownie załadować ten plik zrzutu na dowolny wybrany serwer MySQL.
Ponieważ łączono tutaj dwa pytania (jcolebrand): EDYCJA
Jeśli jesteś bardziej niż chętny do życia z małą wydajnością DB, możesz wykonać serię rsyncs ze starego serwera (ServerA) na nowy serwer (ServerB), nawet gdy mysql nadal działa na ServerA.
Krok 01) zainstaluj tę samą wersję mysql na ServerB, którą ma ServerA
Krok 02) Na serwerze A uruchom SET GLOBAL innodb_max_dirty_pages_pct = 0;
z mysql i około 10 minut (Spowoduje to usunięcie brudnych stron z puli buforów InnoDB. Pomaga to także szybciej wykonać zamknięcie mysql) Jeśli cała baza danych to MyISAM, możesz pominąć ten krok.
Krok 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
Krok 04) Powtarzaj krok 03, aż rsync zajmie mniej niż 1 minutę
Krok 05) service mysql stop
na serwerze A
Krok 06) Wykonaj jeszcze jedną synchronizację
Krok 07) scp ServerA:/etc/my.cnf ServerB:/etc/
Krok 08) service mysql start
na serwerze B
Krok 08) service mysql start
na serwerze A (opcjonalnie)
Spróbuj !!!
CAVEAT
Możesz utworzyć taki slave replikacji w ten sposób. Pamiętaj tylko, aby mieć identyfikator serwera w sposób jawny ustawiony w master /etc/my.cnf i inny numer identyfikatora serwera w slave /etc/my.cnf