Nedávno jsem se setkal s dotazem, jak přesunout celý MySQL server na nový fyzický stroj a přistupovat na něj odjinud (např. pomocí phpMyAdmin). Z poznámek jsem sepsal krok za krokem "jak na to" pěkně od začátku. A nebojte, není to nic složitýho... Ale pozor, jakmile se něco pokazí, můžete přijít o všechna data...
Úvodem ...
...si představme situaci, že jeden LAMP (Linux, Apache, MySQL, PHP) server už nestíhá a je potřeba nějak rozdělit jeho zátěž. Jednou z možností je přesunout DB na jiný fyzický stroj - na starém necháme pouze generované (PHP) webové stránky (Apache) a třeba nějakou jednodušší databázi s e-maily. Pokud byste chtěli stroji ještě více ulevit, pak by byl dobrý nový stroj třeba pro obrázky (grafiku), dokumenty nebo jaký sajrajt tam máte a nebo použít loadbalancer - ale to jen tak bokem. Servery propojíme nějakou vnitřní GE sítí a je to..
Protože webmasteři zvládají HTML levou zadní, PHP, JavaScript a MySQL pravou přední, ale přístup k databázi pomocí řádky řeší velice neradi (opravte mě, jestli se mýlím), rozjedeme jim přístup i pomocí phpMyAdmin.
Mějme dva servery. Stávající (označme jej A) s IP 10.0.0.1 a nový (B), připravený pro DB, s IP 10.0.0.2.
Nový MySQL server
Po instalaci vaší oblíbené ditribuce a MySQL serveru musíme zkopírovat naše stávající data a povolit uživatelům připojení k databázím ze vzdáleného stroje A - k tomu stačí pár kroků:
- řekneme serveru, aby naslouchal komunikaci, kde má. V
/etc/my.cnf(v debian-like distribucích je to myslím v/etc/mysql/my.cnf) nastavíme bind-adres na IP MySQL serveru a zakomentujeme "ignorování" síťování:bind-address=10.0.0.2 #skip-networking - nastartujeme MySQL server na stroji B a zkontrolujeme, zda běží jak má, pak ho zase zastavíme
/etc/init.d/mysql start /etc/init.d/mysql stop
- na serveru B pro jistotu zazálohujeme - přesunutím - složku s daty MySQL (koukněte do konfigurace, kde ji máte):
cp -a /var/lib/mysql /var/lib/mysql-backup
- na stávajícím serveru (A) zastavíme databázi (výpadku se zde nevyhneme) a to proto, abychom na novém serveru neměli nějaký nekompletní záznam nebo rozhozenou tabulku. Přesun databází můžeme zvolit dvojí:
- pomocí nástroje
mysqldump(vhodnější pro menší DB) - kdy na stroji A uděláme dump všech databází:mysqldump --all-databases > backup.sql - pomocí nástroje
rsync- např.rsync -avz -e ssh /var/lib/mysql root@10.0.0.2:/var/lib/mysql
a na stroji B je jednoduše importujeme:
mysql < backup.sql. Doporučuji přečíst dokumentaci.zkopíruje data na úrovni filesystému. Je to ryskantnější, ale v případě větší DB rychlejší.
- pomocí nástroje
- vlezeme do příkazové řádky MySQL a povolíme přihlašování ze vzdáleného stroje A s IP adresou 10.0.0.1 (ukázka je pro uživatele root, ale v rámci bezpečnosti...no jak chcete):
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.1' IDENTIFIED BY 'moje-heslo' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
- ještě je dobré upravit firewall (zvláště, pokud se nepohybujete po vnitřní síti). Předpokládám, že povolit port 3306 zvládnete
Nyní se pomocí mysql -u root -p -h 10.0.0.2 můžeme zkusit připojit ze starého stroje. Pokud to jde, je vše ok, pokud ne, přečtěte si postup ještě jednou.
Nastavení phpMyAdmin
Já mám hlavní phpMyAdmin adresář v /usr/share/phpMyAdmin, tak si do té složky vlezu a... Jediné co nás tu zajímá je config.inc.php, ve kterém se skrývá samotné nastavení.
Ke kterému serveru se připojujeme nám ukazuje $cfg['Servers'][$i]['host'] = "localhost". Díky prozíravosti vývojařů phpMyAdmina můžeme na konec souboru na nový řádek přidat $i++;, čímž navýšíme pole 'Serverů' o jedno a můžeme přidat dalšího hosta. Nejjednodušší bude zkopírovat vše co máte k předchozímu a změnit právě jen $cfg['Servers'][$i]['host'] = "localhost" na $cfg['Servers'][$i]['host'] = "10.0.0.2".
Uložit, zavřít a tadá!


1x23
/ 19. 3. 2010hm, konečně něco co se dá použit:)
Ondrej Simek
/ 24. 7. 2010-- "ale přístup k databázi pomocí řádky řeší velice neradi (opravte mě, jestli se mýlím)"
mylis :o) .. ok, dobra dobra - u vetsiny to asi plati :) - u me je to ale tak, ze kdyz gui, tak kvalitni - jinak radsi cli...
rsyncovani primo /var/lib/mysql je pekna myslenka - vubec me nenapadlo, ze to jde resit takle jednoduse :) .. vyuziju na migraci z produkcniho serveru na lokalni dev, takze diky za clanek! :)