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.

Komentáře

Obrázek uživatele Straiki

Najs!

Ahoj, jojo, tenhle postup jsem vyuzil snad pri kazde reinstalaci win, kde jsem mel nainstalovany mysql server :) jednoduchy, rychly a hlavne ucinny.. :) => co vic si prat?