Download: SysadminMysql

Transkrypt

Download: SysadminMysql
SYSADMIN
MySQL Backups Manager
Tworzenie kopii baz MySQL programem MySQL Backups Manager
OCHRONA
DANYCH
BAZY
Mimo wielu funkcji dostępnych na serwerach usługodawców,
użytkownik przeważnie samodzielnie tworzy kopie zapasowe baz MySQL.
Czy na pewno nie istnieje narzędzie, które mogłoby w tym pomóc?
JAMES MOHR
D
ane zapisane w bazie MySQL mają
duże znaczenie nawet wtedy, gdy
prowadzimy niewielki, niekomercyjny serwis. Jeśli baza ulega częstym zmianom na systemie produkcyjnym, tym bardziej musimy dysponować niezawodnym mechanizmem tworzenia kopii zapasowych.
Niestety, narzędzia udostępniane przez usługodawców są w najlepszym razie kłopotliwe
w użyciu.
Niedawno wprowadzałem istotne zmiany
w bazie danych na testowym systemie i zacząłem zastanawiać się, co stałoby się, gdybym tę
bazę popsuł. Na komputerze lokalnym sam
regularnie wykonuję kopie zapasowe, po prostu kopiując w inne miejsce pliki MySQL. Ta
metoda działa, ale z odtwarzaniem po awarii
mogą wystąpić różne problemy. Dlatego zacząłem poszukiwać innych rozwiązań. Po
przeanalizowaniu alternatywnych metod
tworzenia kopii bazy SQL (patrz Ramka „Inne metody tworzenia kopii zapasowych baz
MySQL”) wybrałem narzędzie MySQL Backups Manager firmy indexsoft [1].
Oprogramowanie MySQL Backups Manager można uruchomić na serwerze WWW
i obsługiwać za pomocą przeglądarki lub
wiersza poleceń. Właściwie program MySQL
Backups Manager można nazwać frontonem
programu mysqldump; udostępnia on jednak liczne dodatkowe funkcje. Na przykład,
informacje o połączeniach z bazami danych
74
NUMER 17 CZERWIEC 2005
są zapisane w głównym pliku konfiguracyjnym, dlatego w celu utworzenia kopii zapasowej wystarczy użyć jej identyfikatora. Ponadto MySQL Backups Manager posiada inne funkcje upraszczające zarządzanie kopiami zapasowymi na wielu komputerach.
MySQL Backups Manager jest udostępniany na licencji komercyjnej, ale warto jest
zainwestować te 15 USD. Narzędzie jest napisane w Perlu i korzysta ze standardowych
narzędzi MySQL; można więc go używać na
dowolnym systemie z zainstalowanymi pakietami Perl i MySQL. Serwer Apache nie
jest wymagany, ale musimy go zainstalować,
jeśli zamierzamy korzystać z interfejsu internetowego oprogramowania MySQL.
Instalacja i podstawowa
konfiguracja
Oprogramowanie MySQL Backups Manager
jest dostarczane w postaci małego archiwum
ZIP. Po rozpakowaniu tego pliku otrzymujemy skrypt backupsmanager.cgi i katalog modules, zawierający moduły Perla do obsługi FTP
i poczty elektronicznej. Choć według instrukcji wystarczy przekopiować skrypt CGI
w miejsce, z którego ma być wykonywany
(zazwyczaj katalog cgi-bin serwera WWW),
musimy jeszcze umieścić katalog modules
w ścieżce dostępu znanej interpreterowi Perl.
Najprościej jest po prostu wszystko skopiować do katalogu cgi-bin.
WWW.LINUX-MAGAZINE.PL
W celu skonfigurowania oprogramowania, przede wszystkim musimy uruchomić
skrypt CGI w przeglądarce WWW, http://linux.local/cgi-bin/backupsmanager.cgi. Powoduje to utworzenie pliku konfiguracyjnego
(backupsmanager.pm) i wyświetlenie jego zawartości w obszarze tekstowym formularza
HTML.
W pliku tym widoczne są wszystkie wartości domyślne opcji konfiguracyjnych zarówno interfejsu WWW, jak i samego polecenia
obsługującego kopie zapasowe. Domyślnie
zdefiniowana jest tylko baza danych:
$mySQLDBName[0] = 'mydb0';
$mySQLHost[0] = 'localhost';
$mySQLUser[0] = 'root';
$mySQLPassword[0] = '';
$mySQLDBEmail[0] = '';
Ponieważ zapis ten zawiera informację
o połączeniu z bazą danych, musimy zadbać
o właściwe ustawienie praw dostępu do pliku
konfiguracyjnego, tak aby zapobiec dostępowi ze strony niepowołanych osób (w szczególności, gdy plik znajduje się na naszym serwerze WWW).
Widoczne są tutaj także inne zmienne, np.
definiujące domyślny katalog z plikami
„zrzutów” bazy, sterujące programami dodatkowymi itd. Generalnie nietrudno domyślić się, do czego każda z tych opcji służy.
MySQL Backups Manager
Po skonfigurowaniu programu możemy
już tworzyć kopie zapasowe. W tym celu używamy interfejsu WWW, albo wykonujemy
proste polecenie:
backupsmanager.cgi --db=#
Gdzie # jest numerem bazy danych zgodnym
z zawartością pliku konfiguracyjnego. Lokalizacja zapisana jest w zmiennej $DBDumpsDir
i domyślnie jest to podkatalog dumps katalogu,
w którym pracuje skrypt backupsmanager.cgi.
Katalogu docelowego nie możemy zmienić,
możemy jednak zastosować opcję --filename=
i za jej pomocą wskazać plik inny niż domyślny (tj. RRRR-MM-DD.sql).
Przesyłanie kopii bazy
Nawet jeśli na serwerze WWW możemy korzystać z usługi cron i za jej pomocą uruchamiać program MySQL Backups Manager, lokalne zapisywanie kopii nie zawsze
wystarcza. Jeśli chcemy dysponować różnymi kopiami zapasowymi, a na serwerze nie
ma wystarczająco dużo miejsca, dobrze byłoby przenieść kopie na inny komputer. Jak
wspomniałem, pliki ze „zrzutami” baz
można przesyłać e-mailem. Nawet jeśli nie
możemy wysyłać listów do innych komputerów, być może mamy możliwość wysyłania
lokalnego (np. pod adres administratora
strony).
Zwróćmy uwagę, że najczęściej nie wystarczy ustawić adresu e-mail na wartość webmaster lub podobną. Nawet jeśli wiadomość
z pocztą ma dotrzeć do innego użytkownika
tego samego hosta, nazwę hosta trzeba podać
(np. webmaster@localhost).
Program MySQL Backups Manager wysyła pocztę za pomocą modułu SendMail.pm.
Jeśli moduł ten nie działa, musimy odpowiednio zmodyfikować zmienną $SMTP,
umieszczając tam polecenie wysyłające wiadomość e-mail. Na przykład:
$SMTP = '|/usr/sbin/sendmail -t';
Plik z kopią możemy wysłać albo za pomocą interfejsu WWW, albo z wiersza poleceń,
przez użycie opcji -mail. Należy zwrócić uwagę, że jeśli w pliku konfiguracyjnym ustawiona jest zmienna $mySQLDBEmail[], zawsze
stosowana jest jej wartość – nawet jeśli podamy adres e-mail za pomocą opcji -email. Jeśli
zmienna $mySQLDBEmail[] jest pusta, adres
musimy podać w wierszu poleceń; ewentualnie można ustawić zmienną $DefaultEmail
w pliku konfiguracyjnym.
Plik z kopią można również przesłać protokołem FTP. MySQL Backups Manager wysyła kopię na podstawie informacji o połączeniu zawartych w pliku backupsmanager.pm.
Podczas powstawiania niniejszego artykułu nie można było jeszcze określać różnych
serwerów FTP dla różnych baz danych (tak
jak to można robić w przypadku adresów e-mail). Jednak jak łatwo się domyślić, odpowiednie informacje można wprowadzać
z wiersza poleceń. W związku z czym w praktyce kopie baz możemy wysyłać na dowolnie
wybrane serwery.
SYSADMIN
W wygenerowanym wywołaniu mysqldump
opcja -extended-insert następuje wtedy po podaniu hasła, a dla polecenia mysqldump nie sprawia to różnicy. Teoretycznie zapis ten możemy
także dodać jako opcję w zmiennej $mySQLDBName[0]. To spowoduje jednak utworzenie katalogu z kopiami o nazwie w rodzaju:
$DBDumpsDir/localhost-----U
extended-insert=FALSE linkbat
zamiast
$DBDumpsDir/localhost---linkbat
Kopia wszystkich danych
W domyślnym pliku konfiguracyjnym dostępny jest również szablon umożliwiający
zrzucenie wszystkich baz danych. Procedura
jest podobna do tej stosowanej w przypadku
indywidualnych baz, z jednym wyjątkiem bazy danych określa się w następujący sposób:
$mySQLDBName[1] = '-all-databases';
Zauważmy, że taki zapis nie oznacza skopiowania danych wszystkich baz znanych programowi MySQL Backups Manager. Oznacza
skopiowanie tylko wszystkich baz danego hosta i użytkownika. Dlatego w celu kopiowania
wszystkich baz wielu serwerów musimy użyć
wielu zapisów z opcją „all-databases”. Opcja
ta działa zresztą tylko wtedy, gdy program wywoływany jest z prawami roota, dlatego prawdopodobnie Czytelnik nie będzie mógł użyć
jej na serwerze usługodawcy.
Inne opcje
Dostępny jest także mechanizm pozwalający
na przekazanie wszystkich opcji obsługiwanych przez program mysqldump. Tak działa
zmienna $DumpDBOptions, która domyślnie
obsługuje dwie opcje: -quote-names oraz -add-drop-table. Do tego możemy dodać dowolną
opcję programu mysqldump. Na przykład, aby
utworzyć zrzut bez użycia specjalnych dyrektyw insert, wpisujemy -extended-insert=FALSE. Jest jednak pewien problem: zmienna
$DumpDBOptions dotyczy wszystkich baz danych. Dlatego albo zawsze korzystamy z rozszerzonych dyrektyw insert, albo nie korzystamy z nich wcale.
Problem ten można obejść, jeśli wziąć pod
uwagę fakt, że właściwe polecenie mysqldump
powstaje w wyniku łączenia różnych opcji.
Można więc napisać:
$mySQLPassword[0] = 'PASSWORD --U
extended-insert=FALSE';
WWW.LINUX-MAGAZINE.PL
Wynika to stąd, że nazwa katalogu powstaje w wyniku interpretacji zapisu $mySQLHost[]---$mySQLDBName[]. Producent planuje wprowadzenie w przyszłych wersjach
oprogramowania możliwości określania różnych opcji dla różnych baz danych.
Przy automatyzowaniu kopii baz danych
przydatne mogą być także inne opcje. Pierwsza to $ArchiverCommand, która definiuje polecenie archiwizujące lub kompresujące oraz jego opcje. Domyślnie stosowany jest program
gzip z określeniem poziomu kompresji 9.
W ustawieniu domyślnym plik z kopią zapasową nie jest kompresowany. Aby włączyć kompresję z wiersza poleceń, używamy opcji -pack.
Jest też zmienna $OldBackups, w wyniku
zastosowania której MySQL Backups Manager usuwa pliki z kopiami starsze niż określona liczba dni. Liczbę dni podajemy po
opcji -old. Zauważmy, że mechanizm usuwania plików nie może działać niezależnie od
tworzenia kopii. Stare pliki są usuwane podczas procedury „zrzucania” bazy danych.
Interfejs WWW
Dotychczas posługiwaliśmy się tylko wierszem poleceń. Jednak główną przyczyną, dla
której zainteresowałem się programem MySQL Backups Manager, była potrzeba automatyzacji procesu tworzenia kopii zapasowych. Dostęp do interfejsu WWW wymaga
wpisania tego samego adresu URL, jakiego
używaliśmy przy konfigurowaniu oprogramowania. Po jego wprowadzeniu widzimy
stronę pokazaną na Rysunku 1.
W pierwszej części możemy wybrać żądaną
nazwę bazy danych (zgodnie z zawartością
pliku backupsmanager.pm). Druga służy do
określania opcji kopii zapasowych. Domyślnie pliki z kopiami zapisywane są w podkatalogach katalogu określonego w zmiennej
$DBDumpsDir (każda baza danych w oddzielnym podkatalogu). Jednak wybranie opcji
NUMER 17 CZERWIEC 2005
75
SYSADMIN
MySQL Backups Manager
backup and download it to my computer powoduje, że program MySQL Backups Manager
tworzy plik i wysyła go do naszej przeglądarki
(która zazwyczaj umożliwia zapisanie pliku).
W kolejnej części (Backups list of database)
widoczne są pliki z kopiami zapisane w odpowiednim katalogu. Tu docierają wszystkie
pliki z kopiami – te utworzone z wiersza poleceń i te, których wykonanie zlecono z interfejsu WWW. W obu przypadkach właścicielem pliku jest użytkownik, z którego prawami wykonywane jest polecenie mysqldump.
W związku z tym w przypadku użycia interfejsu WWW właścicielem jest ten użytkownik, z którego prawami działa serwer WWW.
W razie zaś użycia wiersza poleceń, właścicielem pliku jest zwykły użytkownik. Jeśli
tworzymy pliki ze „zrzutami” za pomocą obu
mechanizmów, możemy doświadczyć problemów z prawami dostępu.
W opisywanym miejscu można wykonać
różne operacje na plikach. Na przykład, można załadować do bazy dane z wybranego pliku. Należy uważać na tę funkcję – w takim
przypadku MySQL Backups Manager po prostu wykonuje polecenie mysql ze wskazanym
plikiem jako argumentem. Ponieważ domyślnie stosowana jest opcja -add-drop-table, przed
wykonaniem dyrektyw insert tabele zostają
najpierw usunięte, a potem odtworzone. Zazwyczaj o to właśnie chodzi. Wyłączenie opcji
-add-drop-table powoduje, że próba utworzenia
tabeli doprowadzi do wygenerowania błędu,
a operacja insert doda rekordy do istniejących.
Wybrane pliki można także wysłać pocztą
elektroniczną na wskazany adres, albo wstawić na domyślny serwer FTP.
W części Upload backup for database dostępna jest funkcja do wysyłania pliku z komputera lokalnego na serwer WWW. Bywa przydatna w różnych okolicznościach. Na przykład wtedy, gdy usługodawca nie tworzy kopii zapasowych, a baza danych ulega awarii,
albo wtedy, gdy w strukturze danych wprowadzono zmiany. W tym ostatnim przypadku pobieramy całą bazę do komputera lokalnego, modyfikujemy jej strukturę, a następnie tworzymy nowy zrzut i wysyłamy go na
serwer. Dane z kopii można odtworzyć, używając i najświeższych danych, i nowej struktury bazy.
Inne metody tworzenia kopii zapasowych baz MySQL
Mój usługodawca umożliwia „zrzucenie”
każdej bazy danych przy użyciu programu,
który muszę wywoływać ręcznie. Na stronie
tworzenia kopii zapasowej dostępne jest łącze, którego kliknięcie powoduje uruchomienie procedury backupu i wysłanie kopii zapasowej do mojej przeglądarki. Plik ten można
otworzyć lub pobrać, tak jak każdy inny.
To bardzo wygodne narzędzie, jednak ja jestem człowiekiem zapominalskim i nie wykonuję tej procedury odpowiednio często. Potrzebuję więc innego narzędzia.
Sam pakiet oprogramowania MySQL udostępnia mechanizmy tworzenia kopii zapasowych, np. polecenie mysqldump.
Polecenie to można uruchomić lokalnie lub
zdalnie. Poniżej przedstawiono jeden
z prostszych przykładów jego użycia:
/usr/bin/mysqldump --host=komputer.domena.com --user=uzytkownik -password=haslo baza_danych
Nietrudno odgadnąć, do czego służą poszczególne opcje (-host oznacza hosta zdalnego). W zależności od systemu i sposobu
korzystania ze „zrzutu” z bazy, powyższe polecenie może zupełnie wystarczyć.
Zwraca ono wszystkie dyrektywy SQL konieczne do odtworzenia bazy danych. Dotyczy to także dyrektyw create database oraz
wszystkich operacji typu insert i innych mechanizmów koniecznych do odtworzenia poprzedniego stanu bazy.
Wadą tej metody jest fakt, że często odbudowę
bazy trzeba rozpoczynać zupełnie od zera. Dyrektywy create nie zadziałają, jeśli odpowiednie
tabele już istnieją; jeśli zaś mają one inne struktury, nie uda się wykonać operacji typu insert.
76
NUMER 17 CZERWIEC 2005
Problem ten można rozwiązać podczas tworzenia bazy, określając, że przed utworzeniem tabeli ma ona najpierw zostać usunięta. Można to osiągnąć w sposób automatyczny, dodając do wywołania programu mysqldump opcję -add-drop-table. Oczywiście,
należy pamiętać, że wszystkie dane w już istniejących tabelach zostaną utracone; przeważnie jednak o to właśnie nam chodzi.
Ponieważ bazy danych utworzone na potrzeby
niniejszego artykułu są niewielkie, nie liczy się
szybkość pobierania zrzutu lub odtwarzania bazy. Jeśli jednak baza zawiera miliony rekordów,
te sprawy zaczynają mieć znaczenie (kopie zapasowe mogą być wykonywane w godzinach
nocnych, jednak podczas odtwarzania danych
siedzimy przeważnie przed komputerem).
Jednym ze sposobów przyspieszenia procedury
odtwarzania jest zwiększenie efektywności dyrektyw insert. W bazie MySQL w wersji
4.0 i wcześniejszych polecenie mysqldump domyślnie generowało jedną dyrektywę insert dla
każdego rekordu. Przy milionach rekordów odtwarzanie trwało całe wieki. Rozwiązaniem jest
użycie opcji -extended-insert programu mysqldump. Powoduje ona upakowanie wszystkich
dyrektyw insert do jednego wyrażenia, co
znacznie przyspiesza działanie programu.
Należy zwrócić uwagę, że z opcji tej nie zawsze możemy skorzystać. Niektórzy usługodawcy blokują w nowych wersjach mysqldump możliwość korzystania z tej opcji ze
względu na kompatybilność. Generalnie mysqldump stosuje takie dyrektywy SQL, które
„rozumie” dowolna baza SQL. Opcja -extended-insert bywa blokowana właśnie ze względu na zapewnienie pełnej zgodności.
Ponieważ usługodawcy oferują różne usługi
i w różny sposób, nie każdy może mieć do-
WWW.LINUX-MAGAZINE.PL
stęp do takich samych mechanizmów.
Może się zdarzyć tak, że tylko użytkownicy zalogowani lokalnie mają dostęp do polecenia
mysqldump. Mój usługodawca umożliwia
skonfigurowanie, z których komputerów mogę
uzyskiwać dostęp do swoich baz. U innych
usługodawców może nie być takiej możliwości.
Alternatywą jest utworzenie na komputerze
lokalnym skryptu automatycznie uruchamiającego program mysqldump.
Może to być skrypt CGI uruchamiany z przeglądarki albo program wywoływany jako zadanie cron (o ile zezwala na to usługodawca).
Do automatycznego tworzenia kopii zapasowych można także wykorzystać mechanizm
dostępu przez SSH, o ile usługodawca na taki zezwala.
Napisałem krótki skrypt, który za pomocą
programu mysqldump wykonuje kopie zapasowe moich baz, a te z wyjścia standardowego kierowane są do tunelu SSH:
ssh [email protected]
„mysqldump --user=uzytkownik --password=haslo baza_danych” > backup.data
Zdarzyło mi się już trafić na usługi bardzo tanich (czytaj: lichych) usługodawców, którzy,
choć udostępniają bazy MySQL, nie dają żadnej gwarancji bezpieczeństwa danych. Nie
udostępniają bezpośredniego mechanizmu
kopii zapasowych ani usługi cron; nie ma także dostępu do powłoki i nie można zdalnie
uruchomić programu mysqldump. Czy to
znaczy, że kopii zapasowej nie da się zrobić?
Cóż, znów dużo zależy od usługodawcy, ale
także od naszej zaradności. Dobrym narzędziem dla tych, którzy nie mogą bezpośrednio
wykonać kopii zapasowej, jest MySQL Backups Manager firmy indexsoft.
MySQL Backups Manager
Obok każdej nazwy pliku widoczne jest pole
wyboru GZ. Gdy jest zaznaczone, plik jest
skompresowany. Wyłączenie tej opcji powoduje, że plik jest automatycznie rozpakowywany;
włączenie – że plik pozostaje spakowany.
Zwróćmy również uwagę na fakt, że domyślnie nie da się przesyłać plików bezpośrednio
z jednej bazy do drugiej. Chodzi na przykład
o sytuacje, w których chcemy synchronizować
dane między systemem testowym a produkcyjnym. Aby wykonać takie zadanie, musimy bezpośrednio wywołać program mysql albo ręcznie
przenieść pliki z jednego katalogu do drugiego
(uwaga na pliki o takich samych nazwach!).
Ponieważ interfejs WWW po prostu pokazuje
listy plików w odpowiednich katalogach, nie
ma znaczenia, w jaki sposób zostały one tam
umieszczone.
Rysunek 1: Interfejs oprogramowania MySQL
Backups Manager.
Ponieważ dane odtwarzane są przez wywoływanie polecenia mysql i dyrektyw SQL zawartych w pliku z kopią, powstaje problem z plikami skompresowanymi, których mysql nie obsługuje. Takie pliki trzeba najpierw rozpakować.
Niski koszt eksploatacji
Choć MySQL Backups Manager firmy indexsoft jest udostępniany na zasadach komercyjnych (jedna licencja kosztuje 15 USD),
uważam, że to rozsądna inwestycja. Taki
skrypt można byłoby napisać samodzielnie,
ale oszczędność byłaby niewspółmiernie mała w stosunku do czasu, jaki trzeba byłoby
poświęcić na programowanie. A ponieważ
SYSADMIN
czas to pieniądz, opisywane oprogramowanie
zwraca się z nawiązką.
Program pozwala skonfigurować proces
automatycznego tworzenia kopii dowolnych
baz MySQL w ciągu kilku minut. Nie trzeba
spędzać całych godzin czy dni na pisaniu
skryptów. Po prostu otrzymujemy gotowe do
pracy rozwiązanie. ■
INFO
[1] Strona firmy indexsoft: www.indexsoft.com
[2] Polecenie mysqldump: dev.mysql.com/doc/mysql/en/mysqldump.html
[3] Profesjonalny usługodawca oferujący
hosting WWW i funkcję MySQL Backups
Manager: www.imagelinkusa.net
AUTOR
James Mohr zajmuje się monitorowaniem
kilku centrów przetwarzania danych na zlecenie firmy dostarczającej rozwiązania biznesowe w Coburg w Niemczech. Poza prowadzeniem serwisu samouczków linuksowych (Linux Tutorial – http://www.linux-tutorial.info), James jest autorem kilku książek
i wielu artykułów na różne tematy.
WWW.LINUX-MAGAZINE.PL

Podobne dokumenty