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