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 root@nowamaszyna:/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