Přesun MySQL databáze přímo pomocí souborů na disku
Po několika letech používání Debianu jsem se rozhodl zkusit jinou distribuci. Nešel jsem nijak daleko a zvolil Ubuntu. Nastavení domovské složky se přeneslo automaticky a konfigurační soubory stačilo jednoduše nakopírovat na patřičné místo, ale jak přenést databáze z MySQL serveru, které používám ke svým webovým aplikacím?
Hned mě napadly dvě možnosti, jak databáze přenést. První možnost je restartovat zpět to Debianu a pomocí mysqldump vytvořit sql zálohy i s daty a pak je importovat do MySQL serveru v Ubuntu. Celé se mi to ale zdá nějaké složité, hlavně ten restart. Proto jsem zvolil druhou možnost přenosu databází a to zkopírovat přímo datové soubory MySQL serveru.
Postup není těžký, ale člověk musí pamatovat na pár důležitých věcí, jako například nastavení příslušných práv nebo vypnutí MySQL serveru v průběhu kopírování dat.
Vypnutí MySQL serveru provedeme v Ubuntu následujícím příkazem:
shell> sudo /etc/init.d/mysql stop
Datové soubory databází se obvykle nacházejí ve složce /var/lib/mysql. Ale pokud si nejste jistí nebo taková složka neexistuje, podívejte se do souboru /etc/mysql/my.cnf, jakou hodnotu nabývá vlastnost datadir.
Můj MySQL server má datadir opravdu nastaveno na /var/lib/mysql. Každá podsložka této složky představuje jednu databázi.
Uvažujme teoretickou databázi my_database a v ní tabulky table1 a table2. Ve složce /var/lib/mysql/my_database budou následující soubory.
shell> sudo ls -l /var/lib/mysql/my_database -rw-rw---- 1 mysql mysql 65 Jul 21 20:52 db.opt -rw-rw---- 1 mysql mysql 8612 Jul 21 21:15 table1.frm -rw-rw---- 1 mysql mysql 20 Jul 21 21:17 table1.MYD -rw-rw---- 1 mysql mysql 2048 Jul 21 21:20 table1.MYI -rw-rw---- 1 mysql mysql 8612 Jul 21 21:15 table2.frm -rw-rw---- 1 mysql mysql 20 Jul 21 21:17 table2.MYD -rw-rw---- 1 mysql mysql 2048 Jul 21 21:20 table2.MYI
Jde vidět, že každá tabulka má soubory typu frm, MYD a MYI. Důležitější ovšem je, že jejich vlastníkem je uživatel mysql patřící do stejnojmené skupiny. Na to musím při kopírování pamatovat.
Teď už můžu jít kopírovat kopírovat. Disk s Debianem mám mountlý v /media/disk, takže skutečné datové soubory se nachází v /media/disk/var/lib/mysql. Následujícím příkazem zkopíruju soubory databáze z Debianu do Ubuntu.
shell> sudo cp -R /media/disk/var/lib/mysql/my_database /var/lib/mysql
Ovšem kopíroval jsem jako root a složka i všechny její soubory jsou rootem vlastněny. Následující dva příkazy nastaví správného vlastníka i skupinu. Jsou dva, protože složka my_database má jinou skupinu než soubory v ní..
shell> sudo chown -R mysql:mysql /var/lib/mysql/my_database shell> sudo chown mysql:root /var/lib/mysql/my_database
Tím jsem skoro hotov. Stačí jen nastartovat MySQL server.
shell> sudo /etc/init.d/mysql start
A dále nějakým MySQL klientem zkontrolovat, jestli mám k databázím přístup. Já používám obyčejný klient mysql.
shell> mysql -u root -p mysql> use my_database; mysql> select * from table1; ...
Pokud někde nastane chyba, zkontrolujte ještě jednou všechna přístupová práva souborů. Tato metoda přesunu dat je ovšem tak jednoduchá, že by žádný problém nastat neměl.