Odzyskiwanie baz danych MySQL z plików *.frm (Debian)

Konrad Kowalski
  • Konrad Kowalski
  • 03/05/2013
  • Debian
  • 0 komentarzy
MySQL

W ostatnim czasie musiałem przeprowadzić operację przywracania baz danych MySQL z serwera, który uległ awarii. W moim przypadku była to maszyna wirtualna znajdująca się na Citrix XenServer. Maszyna wirtualna ze względu na poważne błędy w systemie plików nie była wstanie wystartować ani na hoście z XenSerwerem ani po eksporcie maszyny z Citrixa do innych formatów. Jedyną opcją było uruchomienie maszyny wirtualnej w Citrixowym trybie recovery, który umożliwia uruchomienie maszyny np. z LiveCD. Po uruchomieniu LiveCD okazało się, że najważniejsze dla mnie pliki przetrwały. Dzięki czemu nie musiałem przywracać baz MySQL ze starego backupu (miał on 3 dni, więc jego przywrócenie wiązało się z utratą danych).

Po uruchomieniu LiveCD musiałem zamontować istniejący dysk twardy maszyny wirtualnej (w przypadku maszyn fizycznych, wyjęty dysk serwera podłączylibyśmy po prostu do innego komputera, postępowanie jest analogiczne):

mkdir /mnt/mojerecovery
mount /dev/sda1 /mnt/mojerecovery

Najważniejsze pliki związane z MySQL znajdują się w ścieżce (Debian):

/var/lib/mysql 

Po zamontowaniu:

/mnt/mojerecovery/var/lib/mysql

Jako, że przywracanie maszyny wirtualnej do życia byłoby dłuższe niż postawienie i skonfigurowanie nowej, postawiłem nową maszynę wirtualną z serwerem MySQL. Tutaj bardzo ważna uwaga, jeśli np. przewracamy bazy z systemu Debian to nasz nowy serwer też powinien pracować po jego kontrolą, wersje MySQL też powinny się zgadzać (zminimalizuje to nam liczbę potencjalnych problemów, które mogłyby się pojawić).

Na nowej maszynie zainstalowałem serwer MySQL oraz zatrzymałem jego działanie:

aptitude install mysql-server
/etc/init.d/mysql stop

Kolejnym krokiem na nowej maszynie było przeniesienie obecnych plików z /var/lib/mysql w bezpieczne miejsce:

mv /var/lib/mysql/ /var/lib/mysql-org

oraz utworzenie katalogu gdzie skopiujemy nasze bazy z serwera, który uległ awarii

mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysql

Kolejnym krokiem było przeniesienie danych na nową maszynę. Możemy zrobić to na kilka sposobów.
np. poprzez cp (ważna opcja -p):

cp -rp  /mnt/mojerecovery/var/lib/mysql /var/lib/mysql

rsync (po ssh) (ja korzystałem z tej opcji kopiując dane z LiveCD na nową VM)

rsync -e ssh -aHx /mnt/mojerecovery/var/lib/mysql [email protected]:/var/lib/mysql

rsync (lokalny)

rsync -aHx /mnt/mojerecovery/var/lib/mysql /var/lib/mysql

Po przeniesieniu danych na nowy serwer musimy jeszcze nadać odpowiednie lub sprawdzić uprawnienia plików w /var/lib/mysql (rsync i cp podczas kopiowania zachowają odpowiednie atrybuty, jednakże w nowym systemie użytkownik/grupa mysql może mieć inne oznaczenia numerycznie UID/GID).

cd /var/lib/mysql
chown -R mysql:mysql *
chown root:root mysql_upgrade_info
chown root:root debian-5.1.flag
chown mysql:root mysql

Wszystko powinno wyglądać mniej więcej tak:

ls -l /var/lib/mysql/
drwx------  5 mysql mysql     4096 05-02 14:45 .
drwxr-xr-x 29 root  root      4096 03-21 13:20 ..
-rw-r--r--  1 root  root         0 03-19 12:36 debian-5.1.flag
-rw-rw----  1 mysql mysql 10485760 05-02 14:28 ibdata1
-rw-rw----  1 mysql mysql  5242880 05-02 14:45 ib_logfile0
-rw-rw----  1 mysql mysql  5242880 03-19 12:36 ib_logfile1
drwx------  2 mysql root      4096 03-19 12:36 mysql
-rw-------  1 root  root         6 03-19 12:36 mysql_upgrade_info
drwx------  2 mysql mysql    12288 03-19 13:02 bazadanychX
drwx------  2 mysql mysql    16384 03-19 13:02 joomla
....

ls -ld /var/lib/mysql
drwx------ 5 mysql mysql 4096 05-02 14:45 /var/lib/mysql

ls -l /var/lib/mysql/joomla
-rw-rw---- 1 mysql mysql      65 03-19 13:01 db.opt
-rw-rw---- 1 mysql mysql    8842 03-19 13:02 jos_acl.frm
-rw-rw---- 1 mysql mysql    8604 03-19 13:02 jos_acl_multigroups.frm
-rw-rw---- 1 mysql mysql       0 03-19 13:02 jos_acl_multigroups.MYD
-rw-rw---- 1 mysql mysql    1024 03-19 13:02 jos_acl_multigroups.MYI
-rw-rw---- 1 mysql mysql      96 03-19 13:02 jos_acl.MYD
-rw-rw---- 1 mysql mysql    2048 03-19 13:02 jos_acl.MYI
-rw-rw---- 1 mysql mysql    8670 03-19 13:02 jos_assignments.frm
-rw-rw---- 1 mysql mysql       0 03-19 13:02 jos_assignments.MYD
-rw-rw---- 1 mysql mysql    4096 03-19 13:02 jos_assignments.MYI

Ostatnim bardzo ważnym elementem (w Debianie) jest przeniesienie pliku

/etc/mysql/debian.cnf

ze starej maszyny na nową. W przypadku gdy tego nie zrobimy spotka nas niemiła niespodzianka:

error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'

Po przeniesieniu pliku możemy wystartować maszynę:

/etc/init.d/mysql start

Sprawdzamy czy operacja przeniesienia danych się powiodła:

mysql -uroot -p -e "show databases;"
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bazadanychX        |
| joomla             |
| ......             |
| mysql              |
+--------------------+

Teraz możemy cieszyć się działającym MySQL lub możemy wykonać nowe pliki z aktualnym backupem za pomocą mysqladmin i przenieść je na inny serwer MySQL.

Dodaj komentarz