01 maj 2010
Wydrukuj tę stronę

Aktualizacja bazy danych MySQL do nowej wersji

Kategorie:  Server  RDBMS  Linux  Gentoo

Jak bezpiecznie zaktualizować bazę danych MySQL bez ryzyka utraty danych

Jako, że MySQL w wersji 5.1 nie jest już twardo zamaskowany przez deweloperów Gentoo, nadszedł czas abym zaktualizował serwer bazy danych na moich komputerach. Poprzednio używałem wersji MySQL 5.0, więc aktualizacja nie powinna stwarzać większych problemów. Niemniej problemy mogą się przytrafić. Aby ich uniknąć dobrze jest przeprowadzić aktualizację, krok po kroku. Na szczęście lista zadań nie jest tutaj specjalnie długa. Oto lista rzeczy, które muszą być zrobione:

Zabierzmy się do tego. Pierwsza rzecz to kopia bezpieczeństwa. Oczywiście, mógłbym ją wykonać ręcznie lub korzystając z jakiegoś klienta z graficznym interfejsem użytkownika, ale ja tak nie lubię. Jak zwykle lepiej jest napisać skrypt, który wykona robotę za mnie, i który zadziała na wszystkich moich komputerach biurkowych i serwerach, którymi się opiekuję. Poniżej znajdziesz mój skrypt do wykonania kopi baz danych na żądanie.

Wyświetl kod źródłowy skryptu
  1. MYUSER=${1}
  2. PASSWORD=${2}
  3. BCKPATH=${3}
  4. MYSQL="/usr/bin/mysql"
  5. MYSQLDUMP="/usr/bin/mysqldump"
  6.  
  7. if [ -d ${BCKPATH} ]; then
  8. echo "Path seems ok"
  9. echo
  10. else
  11. echo "Can not find the provided path check script parameters"
  12. echo
  13. exit 1
  14. fi
  15.  
  16. DATABASES="$(${MYSQL} -u ${MYUSER} -p${PASSWORD} -Bse 'show databases')"
  17. for name in ${DATABASES}
  18. do
  19. FILE=${BCKPATH}/mysql-${name}-$(date +"%d_%m_%y").sql
  20. echo "Creating backup of database ${name} to file ${FILE}"
  21. if (${MYSQLDUMP} -u ${MYUSER} -p${PASSWORD} ${name} > ${FILE}) then
  22. echo "Storing database ${name} in ${FILE} succesfull"
  23. echo
  24. else
  25. echo "Storing database ${name} in ${FILE} failed"
  26. echo
  27. fi
  28. done

Skrypt przeczyta nazwy wszystkich baz danych i wykona dla każdej z nich kopie bezpieczeństwa. Skrypt przyjmuje 3 argumenty:

  1. nazwę użytkownika bazy danych
  2. hasło dostępu do bazy danych
  3. ścieżkę, w której zapisać pliki z kopią bezpieczeństwa

Przykład użycia:

./mysql_backup.sh root bardzotajnehasło "/backups/mysql"
 

Skrypt jest także dostępny na moim serwerze svn, możesz uzyskać do niego dostęp podążając za tym linkiem.

Teraz powinniśmy mieć już kopie bezpieczeństwa, czas na aktualizację serwera. W Gentoo zrobilibyśmy to tak:

emerge -av dev-db/mysql

Kiedy kompilacja nowego serwera dobiegnie końca, dobrym pomysłem jest także przebudowanie pakietów używających bibliotek kliencjich mysql. Jeśli używasz portage 2.1* powinieneś wykonać:

revdep-rebuild --library="/usr/lib/libmysqlclient.so.*"
revdep-rebuild --library="/usr/lib/libmysqlclient_r.so.*"

Jeśli jesteś użytkownikiem portage 2.2*, po zakończeniu kompilacji powinieneś zobaczyć: "preserved library list". Wtedy po prostu wykonaj:

emerge @preserved-rebuild

Teraz powinniśmy mieć zarówno nowy serwer jak i programy gotowe do tego aby z niego kożsytać. Czas aby zająć się konfiguracją MySQL. Usuwanie nieaktualnych opcji z pliku konfiguracyjnego może być dość bolesnym zadaniem, ale nie w Gentoo Linuksie. Dzięki pracy developerów mamy wspaniałe narzędzia jak etc-update czy dispatch-conf, które pomogą połączyć nam stare pliki konfiguracyjne z nowymi. Kolejną rzeczą jaką musimy wykonać jest:

dispatch-conf

Zauważyłem przechodząc z wersji 5.0 na 5.1, że kilka opcji konfiguracyjnych rzeczywiście uległo zmianie na przykład w wersji 5.0 miałem opcję "set-variable = innodb_log_files_in_group=" teraz jest ona krótsza: "innodb_log_files_in_group=". Dispatch-conf to wspaniałe narzędzie, w niedłużnej jak minutę można połączyć pliki a jeśli coś pójdzie nie tak wystarczy, że odnajdziesz /etc/config-archive/ i wyciągniesz stamtąd swój poprzedni plik konfiguracyjny.

Teraz musimy się upewnić, że nasza struktura bazy danych będzie odpowiadała nowej wersji. MySQL dostarcza użytecznego narzędzia, które sprawdzi kompatybilność wszystkich tabel z aktualną wersją serwera. Także sprawdzi tabele systemowe, więc wszystkie nowo dostępne funkcje będą mogły zostać wykorzystane zaraz po aktualizacji. Musisz mieć świadomość tego, że sprawdzenie wszystkich tabel może zając chwile czasu. Jak długo to będzie trwało zależy przedewszystkim od tego jak duże są twoje tabele z danymi. Podczas operacji aktualizacji tabele zostaną zablokowane, więc nie spodziewaj się, że będziesz mógł korzystać ze swojej bazy danych podczas tej operacji. Uruchom aktualizację, w czasie, w którym masz pewność, że twoja baza danych nie będzie używana. Narzędzie, o którym mówiłem nazywa się mysql_upgrade więc kolejne polecenie jakie wykonamy w konsoli to:

mysql_upgrade -u Użytkownik_Z_Pełnym_Dostępem -pHasło

Kiedy mysql_upgrade działa powinieneś na ekranie zobaczyć informację, co w danym momencie jest wykonywane. Jeśli zaobserwujesz błędy podobne do tego: error : Table upgrade required. Please do "REPAIR TABLE `schema_migrations`" or dump/reload to fix it! nie martw się, na ostanim etapie pracy, to narzędzie powinno naprawić problemy za ciebie. Na samym dole raportu z wynikami pracy mysq_upgrade powinieneś zobaczyć, żę tabele są naprawiane: Repairing tables.

Najgorszą rzecz jaka mi się przydarzyła podczas wykonywania aktualizacji był ten raport błędu wyświetlony podczas fazy naprawiania tabel "note : The handler for the table doesn't support repair". Oznacza on, że table nie mogą być naprawione automatycznie. Co zrobić w takim wypadku? Po prostu zrzuć wymienione tutaj tabele i załaduj je z powrotem do bazy danych. To powinno naprawić problem. Możesz dokonać zrzutu tabeli tym poleceniem:

mysqldump --add-drop-table -u Użytkownik -pHasło nazwa_bazy_danych nazwa_tabeli > /twoja/ścieżka/kopii/nazwa_tabeli.sql

A przywrócić ją tym poleceniem:

mysql -u Użytkownik -pHasło nazwa_bazy < /twoja/ścieżka/kopii/nazwa_tabeli.sql

Po tej operacji wszystko powinno być w porządku, ale jeśli nie jesteś tego pewien możesz wykonać mysql_upgrade ponownie z opcją --force i zobaczyć czy nie zgłasza dodatkowych problemów.

mysql_upgrade --force -u Użytkownik_Z_Pełnym_Dostępem_Do_Bazy_Danych -p

Teraz nadszedł czas aby sprawdzić czy wszystko działa poprawnie. Uruchom ponownie bazę:

/etc/init.d/mysql restart

I sprawdź logi w /var/log/mysql szukając raportu błędów. Pamiętaj, jeśli napotkasz problem Google to twój przyjaciel.

Ostatnią rzeczą jest sprawdzenie aplikacji klienckich. Na moich komputerach moje programy multimedialne składują swoje dany w bazie MySQL. Sprawdziłem więc czy nadal jestem w stanie przeszukiwać moją bibliotekę plików audio i wideo w Amaroku i MythTV. Gdyby tutaj pojawiły się jakieś problemy, po prostu odtworzyłbym bazę danych z poprzednio wykonanej kopii wykonując:

mysql -u Użytkownik -pHasło baza_danych < /twoja/ścieżka/kopii/nazwa_pliku_kopii.sql

Aktualizacja MySQL nie jest skomplikowanym zadaniem, ale ważne jest aby nie pomiąć żadnego z wymaganych kroków. Jeśli byś tak zrobił, możesz napotkać bardzo dziwne problemy. Pamiętaj aby zawsze wykonać kopie przed aktualizacją, nie ważne jakie problemy napotkasz po drodze twoje dane będą wtedy bezpieczne.




Komentarze

Jeśli znalazłeś jakieś błędy w powyższej informacji lub po prostu chcesz wypowiedzieć swoje zdanie na jej temat, będę wdzięczny za pozostawienie komentarza.
Wszystkie komentarze będą pokazywać się na stronie po tym jak zostaną zatwierdzone. Przepraszam za to ale chcę mieć pewność, że moja strona będzie wolna od obraźliwych lub wulgarnych treści. Nie mam nic przeciwko krytyce ale zrób to właściwie dobierając słowa.

Pozostaw komentarz