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.

Před kopírováním dat se musí vypnout MySQL server!

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.