Jak mogę przenieść tabele MySQL z jednego serwera fizycznego na inny?
Tak jak w tym dokładnie scenariuszu: Mam serwer MySQL, który używa tabeli innodb i ma rozmiar około 20 GB.
Chcę przenieść go na nowy serwer, jaki jest najbardziej efektywny sposób?
Odpowiedzi:
Mój ulubiony sposób to potokowanie polecenia sqldump do polecenia sql. Możesz zrobić wszystkie bazy danych lub określoną. Na przykład
Możesz zrobić wszystkie bazy danych za pomocą
Jedynym problemem jest to, że baza danych jest zbyt duża, a rura się zapada. W takim przypadku możesz wykonać tabelę po tabeli lub dowolną z innych metod wymienionych poniżej.
źródło
netcat
.Niedawno przeniosłem bazę danych o pojemności 30 GB z następującą strategią:
Stary serwer
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)Nowy serwer
tar -xzvf mysqldata.tar.gz
)źródło
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ą:
Istnieją dwa główne sposoby przenoszenia poszczególnych tabel w oparciu o silnik pamięci masowej.
W podanym przykładzie założymy, że:
Stoły MyISAM
Jeśli mydb.mytable korzysta z silnika pamięci MyISAM, tabela będzie fizycznie zamanifestowana jako trzy osobne pliki
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:
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 AKrok 06) Wykonaj jeszcze jedną synchronizację
Krok 07)
scp ServerA:/etc/my.cnf ServerB:/etc/
Krok 08)
service mysql start
na serwerze BKrok 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
źródło
Nie potrzebujesz nawet mysqldump, jeśli przenosisz cały schemat bazy danych, i chcesz zatrzymać pierwszą bazę danych (więc jest spójna podczas przenoszenia)
Nie pamiętam, czy mysqldump obsługuje użytkowników i uprawnienia, czy tylko dane ... ale nawet jeśli tak, jest to o wiele szybsze niż zrobienie zrzutu i uruchomienie go. Użyłbym tego tylko, gdybym musiał zrzucić bazę danych mysql, a następnie ponownie wstawić do innego RDBMS, gdybym musiał zmienić opcje przechowywania (innodb vs. myisam), a może gdybym zmieniał główne wersje mysql (ale Myślę jednak, że zrobiłem to między 4 a 5)
źródło
--all-databases
zrzuca schemat mysql. Uruchomienie mysql na następnym komputerze powoduje wyświetlenie uprawnień pod warunkiem, że folder danych został przeniesiony na inny komputer z tą samą wersją główną MySQL. (MySQL 5.5.x do MySQL 5.5.x, MySQL 5.1.x do MySQL 5.1.x, MySQL 5.0.x do MySQL 5.0.x)mysqldump
obsługuje użytkowników i uprawnienia, ponieważ są one przechowywane wmysql
schemacie.Jeśli chcesz tylko przenieść konkretny stół, spróbuj:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
Możesz podać więcej nazw tabel powyżej, w tym samym poleceniu. Po zakończeniu polecenia przenieś plik databasename.tablename.sql na inny serwer, a następnie przywróć za pomocą:
Zauważ, że tylny plik .sql jest tworzony za pomocą programu mysqldump , a przywracanie odbywa się bezpośrednio w mysql .
źródło
Może istnieć taka możliwość, gdy przenosisz rzeczywiste pliki bazy danych (dla mojej instalacji znajdują się one w katalogu / var / lib / mysql), ale nie jestem pewien, jak to będzie działać / działać.
źródło
Musisz przestać. Zajmie to trochę czasu, w zależności od prędkości sieci. Zakładam, że używasz MySQL na Linux / Unix. Oto proces, którego używam:
Następnie postępuj jak zwykle, konfigurując lokalny MySQL.
* Uwaga: możesz również użyć parametru -c z rsync, aby dodać sumę kontrolną do transferu, ale będzie to wolniejsze w zależności od szybkości procesora.
źródło
Mogę potwierdzić, że metoda DTest działa również w przypadku kopiowania między ubuntu i osx.
Aby skopiować wszystkie bazy danych bez konieczności zrzutu lub podobnego:
Upewnij się, że masz czysty mysql mysql (zainstalowany dmg pobrany z mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), który (BARDZO WAŻNE) nigdy nie był uruchamiany.
Skopiuj zawartość folderu / var / lib / mysql / z maszyny ubuntu na / usr / local / mysql / data / content na komputerze Mac. Aby uzyskać dostęp do folderu na maszynie ubuntu, musiałem użyć sudo tj .:
Skopiowałem folder za pomocą scp.
Zanim zaczniesz, weź kopię folderu mysql na komputerze Mac, aby upewnić się, że nic nie zepsujesz.
Po skopiowaniu folderu wykonaj następujące czynności na komputerze Mac:
Uruchom serwer mysql po raz pierwszy (z panelu preferencji w obszarze Preferencje systemowe-> mysql). Wszyscy użytkownicy i bazy danych powinny być teraz poprawnie skonfigurowane.
Działa to z mysql 5.1.61 na Ubuntu 64 bit 11.10 i mysql 5.1.63 na osx lion (Macbook pro).
źródło
Myślę, że wszystkie wcześniejsze odpowiedzi prawdopodobnie działają dobrze, ale tak naprawdę nie rozwiązują problemu ustawienia nazwy bazy danych podczas przesyłania.
Tak właśnie zrobiłem z bash:
Lepiej jest używać
rsync
niżscp
i nie kompresować pliku, jeśli robisz to często.Na moim serwerze źródłowym:
Na moim serwerze docelowym:
Na obu komputerach można zobaczyć postęp:
To wszystko zakłada, że masz plik konfiguracyjny MySQL w katalogu domowym na obu komputerach i ustaw uprawnienia:
źródło
przenosisz go na inną bazę danych serwera mysql? jeśli tak, zrób na nim eksport
źródło
Ogólna metoda linux:
edytuj datadir (i gniazdo) zarówno mysqld, jak i mysqld_safe (jeśli dotyczy), aby wskazywały nową lokalizację, a następnie
Wysłałem to, ponieważ nikt nie wydawał się po prostu wymieniać najmniejszej liczby kroków, aby to zrobić i uważam, że jest to najprostszy sposób osobiście.
źródło
Być może jest to lepszy sposób:
Wersja 1 : kopiowanie plików danych (tylko MYISAM)
Wersja 2 : mysqldump
Wersja 3 : master / slave + mysqldump / file-copy
scenariusz:
PS:
do skopiowania małych tabel użyj:
źródło
Sugerowałbym dwa proste kroki, aby przenieść całą bazę danych z jednego serwera na drugi.
Krok 1 : Wykonaj pełną kopię zapasową baz danych na serwerze źródłowym przy użyciu mysqldump .
Krok 2 : Możesz użyć polecenia rsync, aby przenieść całe bazy danych na serwer docelowy.
źródło