PHP i MySQL. Witryna
WWW oparta na bazie
danych. Wydanie IV
Wykorzystaj potencja³ PHP oraz MySQL w Twoich serwisach WWW!
• Jak zainstalowaæ i uruchomiæ w³asny serwer WWW?
• Jak stworzyæ autorski system zarz¹dzania treœci¹?
• Jak kontrolowaæ dostêp do stron WWW?
PHP i MySQL to najpopularniejszy tandem webmasterski. Iloœæ serwisów opartych na
tym po³¹czeniu jest nie do ogarniêcia. Sk¹d taka popularnoœæ? Niezale¿nie od innych
zalet atutem tego rozwi¹zania jest prostota. Ju¿ kilka chwil wystarczy, ¿eby rozpocz¹æ
przygodê z profesjonalnym tworzeniem serwisów WWW. A je¿eli poœwiêcisz trochê
wiêcej czasu, poznasz i wykorzystasz jeszcze wiêcej mo¿liwoœci PHP i MySQL.
Ale czy rzeczy proste nie mog¹ byæ jeszcze prostsze?
Mog¹. Z ksi¹¿k¹ „PHP i MySQL. Witryna WWW oparta na bazie danych. Wydanie IV”
b³yskawicznie przebrniesz przez proces instalacji wszystkich niezbêdnych komponentów
– niezale¿nie od systemu, którego u¿ywasz. Autor opisuje tu sposób instalacji na platformach
Windows, MacOS X oraz Linux. Po udanej instalacji napiszesz swój pierwszy skrypt,
a nastêpnie przejdziesz do kolejnych, coraz bardziej zaawansowanych tematów. Wœród
nich znajdziesz opisy takich zagadnieñ, jak: jêzyk SQL, sk³adnia PHP, nawi¹zywanie
po³¹czenia z baz¹, publikowanie treœci znajduj¹cych siê w bazie. Ponadto zdobêdziesz
wiedzê z zakresu administrowania baz¹ MySQL, systemów zarz¹dzania treœci¹,
zarz¹dzania sesj¹ czy te¿ wykorzystania wyra¿eñ regularnych. Ksi¹¿ka ta jest nieocenion¹
pomoc¹ dla wszystkich osób zaczynaj¹cych przygodê ze stronami WWW oraz jêzykami
PHP i SQL.
• Instalacja systemu na platformach Windows, Linux oraz MacOS X
• MySQL – podstawowe zagadnienia
• PHP – sk³adnia, podstawowe polecenia i struktury
• Nawi¹zywanie po³¹czenia z baz¹ danych z poziomu PHP
• Publikacja treœci zawartych w bazie MySQL
• Zasady projektowania relacyjnej bazy danych
• Tworzenie systemu zarz¹dzania treœci¹
• Wykorzystanie wyra¿eñ regularnych
• Kontrola dostêpu do stron
• Zarz¹dzanie sesj¹ oraz „ciasteczkami”
• Zadania administracyjne w bazie MySQL
• Tworzenie zaawansowanych zapytañ MySQL
• Przechowywanie i wykorzystanie danych binarnych
Twórz dynamiczne, bogate w treœci i ³atwe w zarz¹dzaniu witryny WWW!
Autor: Kevin Yank
T³umaczenie: Daniel Kaczmarek
ISBN: 978-83-246-2580-2
Tytu³ orygina³u:
Build Your Own Database
Driven Web Site Using PHP & MySQL
Format: 158×235, stron: 424
Spis tre
Ĉci
5
Spis tre
Ĉci
Przedmowa .................................................................................... 11
Rozdzia
ä 1. Instalacja ....................................................................................... 19
W
áasny serwer WWW .................................................................................................... 20
Instalacja w systemie Windows ...................................................................................... 21
Jednoczesna instalacja wszystkich komponentów ................................................. 21
Instalacja poszczególnych komponentów .............................................................. 26
Instalowanie w systemie Mac OS X ............................................................................... 34
Jednoczesna instalacja wszystkich komponentów ................................................. 34
Instalacja poszczególnych komponentów .............................................................. 37
Instalacja w systemie Linux ............................................................................................ 43
Instalowanie serwera baz danych MySQL ............................................................. 44
Instalowanie j
Ċzyka PHP ....................................................................................... 47
Zadania poinstalacyjne ................................................................................................... 53
O co zapyta
ü dostawcĊ usáug internetowych? ................................................................. 56
Nasz pierwszy skrypt PHP .............................................................................................. 57
Narz
Ċdzia gotowe, pora do pracy ................................................................................... 60
Rozdzia
ä 2. Wprowadzenie do systemu MySQL .................................................. 61
Wprowadzenie do baz danych ........................................................................................ 61
Logowanie si
Ċ na serwerze MySQL ............................................................................... 62
SQL — Strukturalny J
Ċzyk ZapytaĔ ............................................................................... 67
Tworzenie bazy danych .................................................................................................. 67
Tworzenie tabel .............................................................................................................. 68
Wstawianie danych do tabeli .......................................................................................... 70
Przegl
ądanie danych przechowywanych w bazie ........................................................... 72
Modyfikowanie danych przechowywanych w bazie ...................................................... 74
Usuwanie danych przechowywanych w bazie ................................................................ 75
Niech PHP sam napisze kod SQL ................................................................................... 75
Rozdzia
ä 3. Wprowadzenie do jözyka PHP ......................................................... 77
Podstawowe polecenia i sk
áadnia ................................................................................... 79
Zmienne, operatory i komentarze ................................................................................... 81
Tablice ............................................................................................................................ 82
Interakcja z u
Īytkownikiem i formularze ....................................................................... 84
Struktury steruj
ące .......................................................................................................... 95
6
PHP i MySQL. Witryna WWW oparta na bazie danych
Ukrywanie spoin ........................................................................................................... 103
Nie nag
áaĞniaj swoich decyzji w zakresie technologii ......................................... 104
U
Īywaj szablonów PHP ....................................................................................... 105
Wiele szablonów, jeden kontroler ........................................................................ 107
Dajcie mi baz
Ċ danych! ................................................................................................ 110
Rozdzia
ä 4. Publikowanie w sieci WWW danych przechowywanych
w bazie MySQL ............................................................................. 111
Idea dzia
áania ................................................................................................................ 111
àączenie siĊ z bazą MySQL za pomocą PHP ............................................................... 113
Wysy
áanie zapytaĔ SQL za pomocą jĊzyka PHP .......................................................... 118
Obs
áuga zbiorów wyników zapytania SELECT ........................................................... 120
Wstawianie danych do bazy ......................................................................................... 125
Usuwanie danych z bazy .............................................................................................. 133
Misja zako
Ĕczona ......................................................................................................... 139
Rozdzia
ä 5. Projektowanie relacyjnych baz danych .......................................... 141
Umo
Īliwianie autorom podpisywania kawaáów ........................................................... 142
Prosta regu
áa: dane trzeba przechowywaü osobno ........................................................ 143
Korzystanie z wielu tabel ............................................................................................. 147
Proste relacje ................................................................................................................ 151
Relacje typu wiele-do-wielu ......................................................................................... 153
Jeden za wszystkich, wszyscy za jednego! ................................................................... 155
Rozdzia
ä 6. Programowanie strukturalne w jözyku PHP .................................... 157
Do
áączanie plików ........................................................................................................ 158
Do
áączanie zawartoĞci HTML ............................................................................. 158
Do
áączanie kodu PHP .......................................................................................... 160
Rodzaje do
áączania .............................................................................................. 164
Wspó
áuĪytkowane pliki doáączane ....................................................................... 165
Funkcje u
Īytkownika i biblioteki funkcji ..................................................................... 167
Zasi
Ċg zmiennych i dostĊp do zmiennych globalnych ......................................... 169
Programowanie strukturalne w praktyce: funkcje pomocnicze szablonów ................... 173
Najlepszy sposób .......................................................................................................... 176
Rozdzia
ä 7. System zarzñdzania zawartoĈciñ ................................................... 177
Strona startowa systemu ............................................................................................... 178
Zarz
ądzanie autorami ................................................................................................... 181
Usuwanie autorów ............................................................................................... 183
Dodawanie i edytowanie autorów ........................................................................ 186
Zarz
ądzanie kategoriami ............................................................................................... 190
Zarz
ądzanie kawaáami .................................................................................................. 195
Wyszukiwanie kawa
áów ...................................................................................... 195
Dodawanie i edytowanie kawa
áów ....................................................................... 201
Usuwanie kawa
áów .............................................................................................. 211
Podsumowanie .............................................................................................................. 212
Rozdzia
ä 8. Formatowanie zawartoĈci przy uĔyciu wyraĔeþ regularnych ............ 215
Wyra
Īenia regularne ..................................................................................................... 216
Formatowanie
áaĔcuchów tekstu za pomocą wyraĪeĔ regularnych .............................. 220
Wyt
áuszczenie i kursywa ..................................................................................... 221
Akapity ................................................................................................................ 223
Hiper
áącza ............................................................................................................ 225
Domykanie znaczników ....................................................................................... 228
Sk
áadamy wszystkie elementy w jedną caáoĞü ..................................................... 229
Automatyczne zatwierdzanie zawarto
Ğci ...................................................................... 232
Spis tre
Ĉci
7
Rozdzia
ä 9. Obsäuga cookies i sesji oraz kontrola dostöpu ............................... 233
Cookies ......................................................................................................................... 233
Obs
áuga sesji w PHP ..................................................................................................... 238
Prosty koszyk na zakupy ...................................................................................... 240
Kontrola dost
Ċpu .......................................................................................................... 248
Projekt bazy danych ............................................................................................. 248
Kod
Ĩródáowy kontrolera ..................................................................................... 252
Biblioteka funkcji ................................................................................................ 257
Zarz
ądzanie hasáami i rolami ............................................................................... 266
Kolejne wyzwanie, czyli moderowanie kawa
áów ................................................ 273
Nieograniczone mo
ĪliwoĞci .......................................................................................... 275
Rozdzia
ä 10. Administrowanie bazñ MySQL ....................................................... 277
phpMyAdmin ............................................................................................................... 278
Kopie zapasowe baz danych MySQL ........................................................................... 282
Wykonywanie kopii za pomoc
ą programu mysqldump ....................................... 282
Kopie przyrostowe w binarnym dzienniku aktualizacji ....................................... 283
Kontrola dost
Ċpu w MySQL ......................................................................................... 286
Nadawanie uprawnie
Ĕ za pomocą polecenia GRANT ......................................... 287
Odbieranie uprawnie
Ĕ przy uĪyciu polecenia REVOKE ..................................... 289
Porady na temat kontroli dost
Ċpu ......................................................................... 290
Problem braku dost
Ċpu ........................................................................................ 292
Sprawdzanie i naprawianie plików danych MySQL ..................................................... 293
Lepiej si
Ċ ubezpieczaü, niĪ potem Īaáowaü .................................................................. 295
Rozdzia
ä 11. Zaawansowane zapytania SQL ...................................................... 297
Sortowanie wyników zapytania SELECT .................................................................... 297
Ustawianie limitów dla zapyta
Ĕ .................................................................................... 299
Blokowanie tabel .......................................................................................................... 300
Aliasy nazw kolumn i tabel .......................................................................................... 302
Grupowanie wyników zapytania SELECT ................................................................... 305
Z
áączenie lewostronne .................................................................................................. 306
Ograniczanie wyników za pomoc
ą klauzuli HAVING ................................................. 309
Dalsze lektury ............................................................................................................... 310
Rozdzia
ä 12. Dane binarne ................................................................................ 313
Cz
ĊĞciowo dynamiczne strony WWW ......................................................................... 313
Obs
áuga áadowania plików ........................................................................................... 319
Przypisywanie plikom niepowtarzalnych nazw ................................................... 322
Rejestrowanie w bazie danych
áadowanych plików ...................................................... 324
Binarne typy kolumn ........................................................................................... 325
Zapisywanie plików ............................................................................................. 327
Przegl
ądanie zapisanych plików .......................................................................... 328
Kompletny skrypt ......................................................................................................... 332
Problemy zwi
ązane z wielkimi plikami ........................................................................ 338
Rozmiar pakietów MySQL .................................................................................. 338
Ograniczenia czasu dzia
áania skryptów PHP ....................................................... 338
Zako
Ĕczenie .................................................................................................................. 339
Dodatek A Sk
äadnia MySQL ........................................................................... 341
Instrukcje j
Ċzyka SQL obsáugiwane przez MySQL ...................................................... 342
ALTER TABLE ................................................................................................... 342
ANALYZE TABLE ............................................................................................. 344
CREATE DATABASE ........................................................................................ 344
CREATE INDEX ................................................................................................ 345
8
PHP i MySQL. Witryna WWW oparta na bazie danych
CREATE TABLE ................................................................................................ 345
DELETE .............................................................................................................. 347
DESCRIBE/DESC ............................................................................................... 348
DROP DATABASE ............................................................................................ 348
DROP INDEX ..................................................................................................... 348
DROP TABLE ..................................................................................................... 348
EXPLAIN ............................................................................................................ 348
GRANT ............................................................................................................... 349
INSERT ............................................................................................................... 349
LOAD DATA INFILE ......................................................................................... 350
LOCK/UNLOCK TABLES ................................................................................. 351
OPTIMIZE TABLE ............................................................................................. 352
RENAME TABLE ............................................................................................... 352
REPLACE ........................................................................................................... 353
REVOKE ............................................................................................................. 353
SELECT ............................................................................................................... 353
SET ...................................................................................................................... 359
SHOW ................................................................................................................. 359
TRUNCATE ........................................................................................................ 360
UNLOCK TABLES ............................................................................................. 361
UPDATE ............................................................................................................. 361
USE ...................................................................................................................... 362
Dodatek B Funkcje MySQL ............................................................................ 363
Funkcje przep
áywu sterowania ..................................................................................... 363
Funkcje matematyczne ................................................................................................. 364
Funkcje tekstowe .......................................................................................................... 366
Funkcje daty i czasu ..................................................................................................... 370
Pozosta
áe funkcje .......................................................................................................... 374
Funkcje u
Īywane w klauzulach GROUP BY ............................................................... 378
Dodatek C Typy danych dla kolumn tabel MySQL ........................................... 379
Typy liczbowe .............................................................................................................. 380
Typy znakowe .............................................................................................................. 383
Typy daty i czasu .......................................................................................................... 387
Dodatek D Funkcje PHP wspó
äpracujñce z MySQL .......................................... 389
Najcz
ĊĞciej uĪywane funkcje mysqli_* w jĊzyku PHP ................................................ 389
mysqli_affected_rows .......................................................................................... 390
mysqli_character_set_name ................................................................................. 390
mysqli_close ........................................................................................................ 390
mysqli_connect .................................................................................................... 390
mysqli_connect_errno .......................................................................................... 391
mysqli_connect_error .......................................................................................... 391
mysqli_data_seek ................................................................................................. 391
mysqli_errno ........................................................................................................ 392
mysqli_error ......................................................................................................... 392
mysqli_fetch_all .................................................................................................. 392
mysqli_fetch_array .............................................................................................. 393
mysqli_fetch_assoc .............................................................................................. 393
mysqli_fetch_field ............................................................................................... 393
mysqli_fetch_field_direct .................................................................................... 393
mysqli_fetch_fields .............................................................................................. 394
Spis tre
Ĉci
9
mysqli_fetch_lengths ........................................................................................... 394
mysqli_fetch_object ............................................................................................. 394
mysqli_fetch_row ................................................................................................ 395
mysqli_field_count .............................................................................................. 395
mysqli_field_seek ................................................................................................ 395
mysqli_field_tell .................................................................................................. 395
mysqli_free_result ............................................................................................... 395
mysqli_get_client_info ........................................................................................ 395
mysqli_get_client_version ................................................................................... 396
mysqli_get_host_info ........................................................................................... 396
mysqli_get_proto_info ......................................................................................... 396
mysqli_get_server_info ........................................................................................ 396
mysqli_get_server_version .................................................................................. 396
mysqli_info .......................................................................................................... 396
mysqli_insert_id .................................................................................................. 397
mysqli_num_fields ............................................................................................... 397
mysqli_num_rows ................................................................................................ 397
mysqli_ping ......................................................................................................... 397
mysqli_query ....................................................................................................... 397
mysqli_real_escape_string ................................................................................... 398
mysqli_real_query ............................................................................................... 398
mysqli_select_db ................................................................................................. 398
mysqli_set_charset ............................................................................................... 398
mysqli_stat ........................................................................................................... 399
mysqli_store_result .............................................................................................. 399
mysqli_thread_id ................................................................................................. 399
mysqli_use_result ................................................................................................ 399
Skorowidz .................................................................................... 401
Rozdzia
ä 10.
Administrowanie
baz
ñ MySQL
Sercem niemal ka
Īdej dobrze zaprojektowanej witryny tematycznej jest relacyjna baza
danych. W tej ksi
ąĪce utworzyliĞmy bazĊ danych przy uĪyciu systemu relacyjnych
baz danych MySQL. Programi
Ğci witryn internetowych chĊtnie wybierają MySQL,
poniewa
Ī jest darmowy, a takĪe ze wzglĊdu na áatwoĞü uruchomienia. Jak siĊ przeko-
nali
Ğmy w rozdziale 1., „Instalacja”, nowy uĪytkownik, uzbrojony w odpowiednie instruk-
cje, mo
Īe zainstalowaü i uruchomiü serwer MySQL w czasie krótszym niĪ 30 minut —
a przy niewielkim do
Ğwiadczeniu nawet w krótszym niĪ dziesiĊü!
Ten, kto zamierza wykorzysta
ü serwer MySQL tylko do wypróbowania przykáadów
i poeksperymentowania, prawdopodobnie nie potrzebuje niczego poza opisem procesu
instalacji, który omówili
Ğmy w rozdziale 1., „Instalacja”. Natomiast czytelnik, który
chce zbudowa
ü bazĊ danych bĊdącą podstawą dla prawdziwej witryny WWW — na
przyk
áad witryny firmowej — powinien zapoznaü siĊ jeszcze z kilkoma zagadnieniami,
zanim zacznie polega
ü na serwerze MySQL w codziennej pracy.
Najpierw, zgodnie z obietnic
ą, którą záoĪyáem w rozdziale 2., pokaĪĊ, jak skonfiguro-
wa
ü narzĊdzie phpMyAdmin, aby przeglądaü i edytowaü bazy danych oraz administrowaü
nimi z poziomu przegl
ądarki internetowej. Korzystanie z phpMyAdmin jest generalnie
o wiele
áatwiejsze niĪ zmaganie siĊ z wierszem poleceĔ serwera MySQL, zwáaszcza gdy
serwer ten dzia
áa na innym komputerze.
Pó
Ĩniej zajmiemy siĊ kopiami zapasowymi. Tworzenie kopii zapasowych danych waĪ-
nych dla nas albo naszej firmy powinno mie
ü wysoką pozycjĊ na liĞcie priorytetów
administratora. Niestety, konfigurowanie wykonywania kopii zapasowych nie nale
Īy
do najciekawszych obowi
ązków administratora, wiĊc zazwyczaj taka procedura tworzona
jest jednorazowo, z konieczno
Ğci i uznawana za „wystarczająco dobrą” dla wszystkich
zastosowa
Ĕ. KaĪdy, kto dotychczas na pytanie: „Czy powinniĞmy zrobiü kopie zapa-
sowe naszych baz danych?” odpowiada
á: „W porządku, zrobimy kopie razem z caáą
278
PHP i MySQL. Witryna WWW oparta na bazie danych
reszt
ą”, powinien uwaĪnie przeczytaü ten rozdziaá. Zademonstrujemy, dlaczego stan-
dardowe rozwi
ązanie tworzenia kopii zapasowych jest niewystarczające przy wielu
instalacjach MySQL oraz poka
Īemy wáaĞciwą metodĊ wykonywania i przywracania
kopii zapasowej bazy MySQL.
W rozdziale 1., „Instalacja”, skonfigurowali
Ğmy serwer MySQL tak, aby pozwalaá na
áączenie siĊ jako specjalny uĪytkownik root z dowolnie wybranym hasáem. UĪytkownik
root w MySQL (który zreszt
ą nie ma nic wspólnego z uĪytkownikiem root w Linuksie
i podobnych mu systemach) ma prawa odczytu i zapisu do wszystkich baz i tabel.
W wielu organizacjach konieczne jest tworzenie u
Īytkowników mających dostĊp tylko
do poszczególnych baz i tabel oraz ograniczanie w jaki
Ğ sposób tego dostĊpu (na przy-
k
áad dostĊp do pewnej tabeli z prawem tylko do odczytu). W tym rozdziale dowiemy
si
Ċ równieĪ, jak umoĪliwiü takie obostrzenia przy uĪyciu dwóch nowych poleceĔ MySQL,
czyli
GRANT
i
REVOKE
.
W pewnych sytuacjach, takich jak zaniki pr
ądu, bazy MySQL mogą ulec uszkodze-
niu. W takim przypadku mo
Īna siĊ jednak odwoáaü do sporządzonych wczeĞniej kopii
zapasowych. Zako
Ĕczymy przegląd administrowania bazami MySQL, poznając narzĊ-
dzie do sprawdzania i naprawiania prostych uszkodze
Ĕ baz.
phpMyAdmin
Podobnie jak wi
ĊkszoĞü kodu prezentowanego w ksiąĪce, phpMyAdmin
1
to skrypt PHP
przeznaczony do komunikowania si
Ċ z serwerem MySQL za poĞrednictwem stron
WWW generowanych „w locie”. Jednak zamiast prezentowa
ü uĪytkownikom strony
mi
áe dla oka, phpMyAdmin ma za zadanie udostĊpnienie interfejsu WWW, za pomocą
którego b
Ċdzie moĪliwe administrowanie serwerem MySQL.
Aplikacja phpMyAdmin pozwala na wykonanie niemal ka
Īdej czynnoĞci, dostĊpnej
z poziomu wiersza polece
Ĕ serwera MySQL. Jednak w phpMyAdmin uĪywa siĊ do tego
celu myszy, a nie wpisywanych r
Ċcznie zapytaĔ jĊzyka SQL. OczywiĞcie, jeĪeli musisz
wykona
ü zadanie, które moĪna wyraziü wyáącznie za pomocą rĊcznie napisanego kodu
SQL, phpMyAdmin równie
Ī na to pozwoli, poniewaĪ udostĊpnia formularz sáuĪący
do wpisywania kodu SQL. Kod ten zostanie wykonany, a wynik zostanie wy
Ğwietlony
w przegl
ądarce.
Na wi
ĊkszoĞci komercyjnych serwerów WWW dostĊpne są juĪ prekonfigurowane wersje
phpMyAdmin, stanowi
ące element konsoli administracyjnej. Poza tym, jeĪeli samo-
dzielnie zainstalujesz serwer MySQL pochodz
ący z rozwiązania pakietowego, takiego
jak WampServer czy MAMP, szybko zauwa
Īysz, Īe tam równieĪ udostĊpniana jest
aplikacja phpMyAdmin. Wówczas konieczne jednak b
Ċdzie odpowiednie skonfiguro-
wanie aplikacji przez podanie has
áa uĪytkownika root serwera MySQL, które zostaáo
zdefiniowane w rozdziale 1.
1
http://www.phpmyadmin.net/
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
279
Je
Īeli na serwerze, którego uĪywasz, phpMyAdmin jest niedostĊpna, moĪesz zainstalo-
wa
ü aplikacjĊ samodzielnie, co nie jest trudnym zadaniem. W tym celu naleĪy przejĞü
na stron
Ċ pobierania phpMyAdmin
2
i pobra
ü najnowszą zalecaną wersjĊ (w trakcie
powstawania tej ksi
ąĪki byáa to wersja 3.1.3.2) w preferowanym formacie (.zip dla
systemu Windows lub Mac OS X b
ądĨ teĪ .tar.gz dla Linuksa). Plik trzeba rozpakowaü,
a po rozpakowaniu oka
Īe siĊ, Īe archiwum zawiera katalog phpMyAdmin-wersja-
-j
Ċzykowa. NazwĊ tego katalogu trzeba zmieniü na phpMyAdmin i przenieĞü do gáów-
nego katalogu dokumentów WWW serwera internetowego.
Nast
Ċpnie w edytorze tekstu trzeba utworzyü nowy plik o nazwie config.inc.php i zapi-
sa
ü go w katalogu phpMyAdmin. W pliku naleĪy wpisaü nastĊpujący fragment kodu:
<?php
$cfg['blowfish_secret'] = 'bhvhbv3577h3qguw83qdh37b2fnqelinbq38qhg';
$cfg['Servers'][1]['auth_type'] = 'cookie';
?>
Elementowi
$cfg['blowfish_secret']
mo
Īna przypisaü dowolną wartoĞü záoĪoną z liter
i cyfr. Nie trzeba nawet zapami
Ċtywaü wpisanej wartoĞci, poniewaĪ wystarczy, by byáa
jak najtrudniejsza do zgadni
Ċcia przez potencjalnego hakera. Dlatego im bardziej ciąg
znaków b
Ċdzie przypominaá ciąg wygenerowany losowo, tym lepiej.
Drugi wiersz kodu konfiguruje phpMyAdmin w taki sposób, by aplikacja
áączyáa siĊ
z serwerem MySQL znajduj
ącym siĊ na tym samym komputerze oraz serwer baz danych
wymaga
á podania nazwy uĪytkownika i hasáa. JeĪeli wykorzystywany serwer MySQL
dzia
áa na innym komputerze albo chcesz, by phpMyAdmin logowaá siĊ do serwera
baz danych automatycznie, trzeba wprowadzi
ü pewne zmiany, które najlepiej są opisane
w dokumentacji aplikacji. Wystarczy w przegl
ądarce internetowej otworzyü plik
Documentation.html, który znajduje si
Ċ w katalogu phpMyAdmin.
Gdy plik konfiguracyjny jest ju
Ī gotowy, naleĪy otworzyü przeglądarkĊ i wywoáaü
adres http://localhost/phpMyAdmin/ (lub inny, który wskazuje na serwerze WWW kata-
log
phpMyAdmin). W odpowiedzi w przegl
ądarce powinna pojawiü siĊ strona logowa-
nia, widoczna na rysunku 10.1.
Je
Īeli na stronie logowania pojawi siĊ ostrzeĪenie dotyczące braku moĪliwoĞci zaáa-
dowania rozszerzenia mcrypt, mo
Īna je z czystym sumieniem zignorowaü. Na wiĊk-
szo
Ğci serwerów rozszerzenie mcrypt jest komponentem opcjonalnym, którego zainsta-
lowanie do
Ğü znacząco powinno zwiĊkszyü wydajnoĞü dziaáania phpMyAdmin, lecz
i bez tego rozszerzenia aplikacja b
Ċdzie sobie radziü bez problemu
3
.
2
http://www.phpmyadmin.net/home_page/downloads.php
3
Rozszerzenie mcrypt jest wymagane w niektórych 64-bitowych systemach operacyjnych. Aplikacja
phpMyAdmin wy
Ğwietli odpowiedni komunikat, jeĞli okaĪe siĊ, Īe nie moĪe obyü siĊ bez tego rozszerzenia.
W takim przypadku trzeba b
Ċdzie dodaü rozszerzenie do PHP. W systemie Windows wystarczy w tym
celu jedynie odkomentowa
ü wiersz
extension=php_mcrypt.dll pliku php.ini
, lecz w systemach Mac OS X
i Linux konieczne jest zainstalowanie biblioteki programistycznej libmcrypt i wykonanie rekompilacji
PHP. Trudno powiedzie
ü, by byá to najlepszy sposób spĊdzania popoáudnia!
280
PHP i MySQL. Witryna WWW oparta na bazie danych
Rysunek 10.1.
Ekran logowania
do aplikacji
phpMyAdmin
W polu U
Īytkownik naleĪy wpisaü
root
, natomiast w polu Has
áo trzeba podaü hasáo
u
Īytkownika root na serwerze MySQL. Alternatywnie, jeĪeli nie znasz hasáa uĪytkow-
nika root na serwerze baz danych, z którym si
Ċ áączysz, wpisz nazwĊ uĪytkownika
i has
áo, jakie znasz. Aplikacja phpMyAdmin zacznie wówczas pracĊ z takimi samymi
uprawnieniami, jakie posiada zastosowany u
Īytkownik MySQL.
Po zalogowaniu si
Ċ w przeglądarce powinna pojawiü siĊ strona podobna do widocznej
na rysunku 10.2.
Rysunek 10.2. Interfejs aplikacji phpMyAdmin mo
Īe byü trochĊ zniechĊcający, ale nie poddawaj siĊ!
Nie warto stresowa
ü siĊ przytáaczającą liczbą opcji udostĊpnianych przez phpMyAdmin.
Aplikacja rzeczywi
Ğcie jest bardzo záoĪona, lecz gdy tylko poznasz ją trochĊ bliĪej,
praca z ni
ą przestanie byü jakimkolwiek problemem.
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
281
Na pocz
ątek warto spojrzeü na listĊ dostĊpnych baz danych, widoczną po lewej stronie.
Je
Īeli phpMyAdmin áączy siĊ z serwerem MySQL, na którym implementowaáeĞ przy-
k
áady opisywane w tej ksiąĪce, powinieneĞ wĞród dostĊpnych baz danych ujrzeü miĊdzy
innymi baz
Ċ
ijdb
. Je
Ğli tak nie jest, moĪesz ją utworzyü choüby teraz.
Je
Īeli posiadasz uprawnienia do tworzenia baz danych na serwerze MySQL, skorzystaj
z formularza Utwórz now
ą bazĊ danych widocznego mniej wiĊcej na Ğrodku ekranu,
aby zbudowa
ü nową bazĊ danych
ijdb
. Na li
Ğcie rozwijanej System porównaĔ dla
po
áączenia MySQL moĪna pozostawiü wartoĞü domyĞlną. Gdy klikniesz przycisk Utwórz,
phpMyAdmin utworzy now
ą, pustą bazĊ danych
ijdb
i wy
Ğwietli komunikat „Nie zna-
leziono tabeli w bazie danych”, widoczny na rysunku 10.3.
Rysunek 10.3. Nie znaleziono tabeli w bazie danych
Je
Īeli natomiast moĪesz korzystaü tylko z jednej bazy danych, którą specjalnie utwo-
rzy
á administrator (na przykáad administrator dostawcy usáug internetowych), kliknij
nazw
Ċ tej bazy w menu po lewej stronie. RównieĪ w tym przypadku w przeglądarce
wy
Ğwietlona zostanie lista tabel lub komunikat „Nie znaleziono tabeli w bazie danych”,
je
Īeli baza danych bĊdzie pusta.
Teraz za pomoc
ą phpMyAdmin moĪesz utworzyü wszystkie tabele niezbĊdne do odpo-
wiedniego funkcjonowania bazy danych witryny zarz
ądzania kawaáami. W tym celu
kliknij zak
áadkĊ Import u góry strony, a nastĊpnie w sekcji Plik do importu wskaĪ plik
archiwum kodów
Ĩródáowych ksiąĪki o nazwie Rozdzial09/sql/ijdb.sql. KlikniĊcie
przycisku Wykonaj u do
áu strony spowoduje, Īe aplikacja phpMyAdmin przeĞle zawar-
to
Ğü wskazanego pliku do serwera MySQL i na tej podstawie powstaną tabele i przykáa-
dowe dane bazy do zarz
ądzania dowcipami.
Nazwy utworzonych tabel powinny si
Ċ pojawiü z lewej strony ekranu przeglądarki.
Po klikni
Ċciu myszą nazwy którejĞ z tabel bĊdzie moĪna przejrzeü jej zawartoĞü; warto
równie
Ī przejrzeü wszystkie zakáadki dostĊpne w aplikacji phpMyAdmin. WiĊkszoĞü
dost
Ċpnych opcji nie powinna budziü wątpliwoĞci, jednak przeznaczenie niektórych
zak
áadek moĪe wydaü siĊ niejasne. JeĪeli jesteĞ ciekaw, do czego sáuĪy dana funkcja, po
prostu uruchom j
ą i zobacz, jaki bĊdzie wynik (oczywiĞcie, na serwerze MySQL, który
nie zawiera
Īadnych danych!). Szczególną ostroĪnoĞü naleĪy zachowaü przy przeglą-
daniu zak
áadki UsuĔ, która usuwa caáą bazĊ danych.
282
PHP i MySQL. Witryna WWW oparta na bazie danych
Niewielu programistów PHP zna ka
Īdą funkcjĊ tak záoĪonego narzĊdzia, jakim jest
phpMyAdmin. Jednak nawet zrozumienie tylko podstawowych funkcji aplikacji sprawi,
Īe narzĊdzie szybko stanie siĊ nieodzowne do administrowania bazami danych na
serwerze MySQL.
Kopie zapasowe baz danych MySQL
Podobnie jak w przypadku serwerów WWW, wi
ĊkszoĞü serwerów MySQL musi dziaáaü
24 godziny na dob
Ċ, siedem dni w tygodniu. Powoduje to, Īe tworzenie kopii zapaso-
wych plików bazy MySQL jest problematyczne. Serwer MySQL u
Īywa pamiĊci pod-
r
Ċcznej i buforowania, aby zwiĊkszyü efektywnoĞü uaktualniania plików bazy prze-
chowywanych na dysku, co sprawia,
Īe w kaĪdej chwili pliki te mogą siĊ znajdowaü
w stanie niespójno
Ğci. Jako Īe standardowe procedury wykonywania kopii zapasowych
zak
áadają tylko kopiowanie plików systemowych i zawierających dane, kopie plików
danych MySQL nie s
ą wiarygodne. Nie ma bowiem Īadnej gwarancji, Īe skopiowane
pliki b
Ċdą w stanie nadającym siĊ do uĪycia w zastĊpstwie plików straconych w awarii.
Wiele baz danych otrzymuje nowe informacje przez ca
áy czas, zaĞ standardowe kopie
zapasowe zawieraj
ą tylko stan plików z daty ostatniego utworzenia kopii. JeĞli z jakie-
go
Ğ powodu pliki danych bazy MySQL zostaną zniszczone albo nie da siĊ ich odczytaü,
wszelkie informacje, które zmieni
áy siĊ w bazie od ostatniej kopii, przepadną bezpow-
rotnie. W wielu sytuacjach, na przyk
áad jeĞli serwer MySQL sáuĪy do Ğledzenia zamó-
wie
Ĕ klientów w sklepie internetowym, taka strata jest nie do przyjĊcia.
MySQL zawiera mechanizmy s
áuĪące do tworzenia aktualnych kopii zapasowych, na
które nie powinna mie
ü wpáywu aktywnoĞü serwera podczas archiwizacji. Niestety,
ich u
Īycie wymaga zaprojektowania specjalnej procedury wykonywania kopii zapa-
sowych dla danych MySQL, ca
ákowicie oddzielnej od wszelkich systemów archiwizacji,
które mog
áy powstaü dla innych danych. Jednak podobnie jak w przypadku kaĪdego
dobrego systemu kopii zapasowych, docenimy go, kiedy przyjdzie czas go wykorzysta
ü.
Wykonywanie kopii za pomoc
ñ programu mysqldump
Oprócz
mysql
, klienta MySQL, pakiet instalacyjny MySQL zawiera wiele przydatnych
programów narz
Ċdziowych. PoznaliĞmy juĪ na przykáad program
mysqladmin
, odpo-
wiedzialny za kontrol
Ċ i pobieranie informacji o uruchomionym serwerze MySQL.
Program
mysqldump
jest kolejnym z tych narz
Ċdzi. Po uruchomieniu áączy siĊ on z ser-
werem MySQL (w podobny sposób, jak program
mysql
albo skrypt PHP) i pobiera pe
áną
zawarto
Ğü wskazanej bazy danych. Pobrane dane są nastĊpnie wypisywane w postaci
szeregu polece
Ĕ SQL
CREATE TABLE
i
INSERT
, które, wykonane na serwerze MySQL,
odtworz
ą bazĊ danych (lub bazy danych) i zapeánią ją takimi samymi danymi, jakie
zawiera
á oryginaá.
Je
Ğli przekierujemy wynik dziaáania
mysqldump
do pliku, mo
Īemy zachowaü uzyskany
zrzut zawarto
Ğci bazy jako kopiĊ zapasową. PoniĪsze polecenie (zapisane w jednej linii)
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
283
áączy siĊ z serwerem MySQL uruchomionym na komputerze lokalnym, podając uĪyt-
kownika root i has
áo
password
, a nast
Ċpnie zapisuje kopiĊ zapasową wszystkich baz
danych do pliku full_backup.sql
4
.
mysqldump -u root -ppassword --all-databases > full_backup.sql
Poni
Īsze komendy odtworzą bazĊ po awarii:
mysql -u root -ppassword < full_backup.sql
Przytoczone polecenie
áączy siĊ z serwerem MySQL przy uĪyciu programu
mysql
i podaje do wykonania list
Ċ komend z utworzonego uprzednio pliku. JeĪeli wolisz korzy-
sta
ü z klienta wiersza poleceĔ serwera MySQL, moĪesz wykonaü polecenie
source
, aby
wykona
ü wszystkie polecenia zawarte w pliku full_backup.sql:
mysql> source full_backup.sql
Polecenie source nie jest poleceniem j
özyka SQL
Polecenie source jest säabo udokumentowanym
5
poleceniem obs
äugiwanym bez-
po
Ĉrednio przez program klienta mysql i nie jest to w Ĕadnym razie polecenie jözyka
SQL, takie jak na przyk
äad CREATE DATABASE. Dlatego na koþcu polecenia nie naleĔy
wstawia
è znaku Ĉrednika, poniewaĔ znak ten uniemoĔliwi poprawne wykonanie pole-
cenia.
W ten sposób mo
Īemy uĪywaü
mysqldump
do tworzenia kopii zapasowych naszych baz
danych. Program
mysqldump
nie kopiuje bezpo
Ğrednio plików znajdujących siĊ w kata-
logu danych MySQL, tylko pobiera dane,
áącząc siĊ z serwerem. DziĊki temu kopia,
któr
ą wykonuje, jest wáaĞciwą i pewną kopią bazy, a nie zrzutem plików, które mogą
by
ü niepeáne i nieaktualne, dopóki serwer MySQL jest uruchomiony.
Co zrobi
ü z dziurą miĊdzy kopiami zapasowymi, aby mieü pewnoĞü, Īe zarchiwizo-
wane dane z bazy s
ą zawsze aktualne? Rozwiązanie jest proste: naleĪy skonfigurowaü
serwer tak, aby prowadzi
á binarny dziennik aktualizacji.
Kopie przyrostowe w binarnym dzienniku aktualizacji
Jak ju
Ī wspomniano, w wielu zastosowaniach, w których uĪywa siĊ serwera MySQL,
utrata danych — jakichkolwiek danych — jest nie do zaakceptowania. W takich przy-
padkach trzeba znale
Ĩü sposób na utrzymywanie aktualnoĞci danych równieĪ pomiĊdzy
kopiami wykonywanymi przy u
Īyciu
mysqldump
. Rozwi
ązaniem tego problemu jest
skonfigurowanie serwera MySQL, tak aby prowadzi
á binarny dziennik aktualizacji.
Binarny dziennik aktualizacji jest zapisem wszystkich otrzymanych przez baz
Ċ zapy-
ta
Ĕ SQL, które w jakiĞ sposób zmieniáy zawartoĞü bazy. Zaliczają siĊ do nich miĊdzy
innymi polecenia
INSERT
,
UPDATE
i
CREATE TABLE
, natomiast
SELECT
ju
Ī nie.
4
Aby uruchomi
ü
mysqldump
i inne programy narz
Ċdziowe MySQL, trzeba znajdowaü siĊ w katalogu
bin serwera MySQL lub katalog ten musi znajdowa
ü siĊ w ĞcieĪce systemowej. JeĪeli wykonaáeĞ
instrukcje instalacji zawarte w rozdziale 1.,
ĞcieĪka systemowa powinna juĪ zawieraü odpowiednie wpisy.
5
http://dev.mysql.com/doc/refman/5.1/en/batch-commands.html
284
PHP i MySQL. Witryna WWW oparta na bazie danych
Podstawowym celem jest umo
Īliwienie odzyskania zawartoĞci bazy dokáadnie z chwili
wyst
ąpienia awarii. MoĪna to osiągnąü przez przywrócenie kopii zapasowej (wyko-
nanej za pomoc
ą programu
mysqldump
) i zastosowanie fragmentu binarnego dziennika
aktualizacji, powsta
áego po utworzeniu ostatniej kopii zapasowej.
Mo
Īna takĪe edytowaü binarny dziennik aktualizacji, aby cofnąü ewentualne báĊdy. JeĞli
na przyk
áad wspóápracownik przypadkowo wyda polecenie
DROP TABLE
, mo
Īemy wyeks-
portowa
ü binarny dziennik aktualizacji do postaci tekstowej i z pliku tekstowego usunąü
szkodliwy wpis. Nast
Ċpnie moĪna przywróciü bazĊ danych z ostatniej kopii zapaso-
wej i wykona
ü zmodyfikowany binarny dziennik aktualizacji. W ten sposób zacho-
wujemy nawet te aktualizacje w innych tabelach, do których dosz
áo juĪ po wydaniu
omy
ákowego polecenia. A w ramach przeciwdziaáania powinniĞmy teĪ zapewne ode-
bra
ü wspóápracownikowi prawa do polecenia
DROP
(w nast
Ċpnej czĊĞci dowiemy siĊ,
jak to zrobi
ü).
Uruchamiaj
ąc serwer MySQL z wiersza poleceĔ, moĪemy uĪyü przeáącznika
--log-bin
,
aby tworzy
á binarny dziennik aktualizacji, na przykáad w systemie Mac OS X moĪe to
wygl
ądaü tak:
Komputer:~ uľytkownik$ sudo mysqld_safe --log-bin=binlog
Powy
Īsze polecenie uruchamia serwer MySQL i instruuje go, aby tworzyá w katalogu
danych serwera (/usr/local/mysql/data na komputerach z Mac OS X i Linuksem, je
Ğli
serwer jest skonfigurowany zgodnie z opisem w rozdziale 1., „Instalacja”) pliki binlog.
000001, binlog.000002 itd. Nowy plik b
Ċdzie powstawaá, ilekroü serwer zapisze zawar-
to
Ğü dziennika na dysk; w praktyce nastĊpuje to za kaĪdym uruchomieniem serwera.
Je
Ğli chcemy przechowywaü binarny dziennik aktualizacji w innym miejscu (co jest
zazwyczaj dobrym pomys
áem — jeĞli zepsuje siĊ dysk zawierający katalog z danymi,
lepiej,
Īeby kopie zapasowe, mimo wszystko, przetrwaáy ten kataklizm!), moĪemy podaü
pe
áną ĞcieĪkĊ do niego.
Je
Ğli serwer MySQL ma dziaáaü stale, to prawdopodobnie system operacyjny odpo-
wiada za jego uruchamianie przy starcie. W takim przypadku dodawanie opcji w linii
komend mo
Īe byü utrudnione. Prostszą metodą utworzenia dziennika aktualizacji jest
ustawienie odpowiedniej opcji w pliku konfiguracyjnym MySQL o nazwie my.cnf lub
my.ini, je
Īeli uĪywany jest system Windows.
Podobnie jak plik php.ini, który definiuje konfiguracj
Ċ jĊzyka PHP na serwerze, tak samo
plik my.cnf lub my.ini jest zwyk
áym plikiem tekstowym, który zawiera listĊ opcji steru-
j
ących pracą serwera MySQL. DomyĞlnie MySQL jest instalowany bez Īadnego pliku
konfiguracyjnego i dzia
áa z wykorzystaniem ustawieĔ domyĞlnych. Aby wáączyü obsáugĊ
binarnych dzienników aktualizacji, nale
Īy utworzyü plik my.cnf lub my.ini i ustawiü
odpowiednie opcje.
W systemie Windows u
Īyj Notatnika lub innego edytora tekstu, aby utworzyü plik
o nazwie my.ini i zapisa
ü go w katalogu instalacyjnym serwera MySQL (na przykáad
w C:\Program Files\MySQL\MySQL Server 5.x).
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
285
W systemie Mac OS X lub Linux nale
Īy uĪyü wybranego edytora tekstu i utworzyü
plik o nazwie my.cnf z odpowiednimi ustawieniami konfiguracyjnymi; potem plik trzeba
przenie
Ğü do katalogu instalacyjnego serwera MySQL (/usr/local/mysql). Aby to wyko-
na
ü, prawdopodobnie potrzebne bĊdą uprawnienia administratora.
Instalacje pakietowe
W dalszej cz
öĈci punktu zakäadam, Ĕe samodzielnie zainstalowaäeĈ serwer MySQL od
podstaw. Jest to szczególnie dobre rozwi
ñzanie, jeĔeli instalujesz serwer produkcyjny.
Rozwi
ñzania pakietowe, takie jak WampServer czy MAMP, zawierajñ wbudowany, pre-
definiowany plik konfiguracyjny serwera MySQL. Oczywi
Ĉcie, moĔna zmieniè zawar-
to
Ĉè tego pliku, aby odpowiednio dostosowaè konfiguracjö serwera MySQL i wäñczyè
obs
äugö binarnych dzienników aktualizacji, lecz najlepiej cofnñè siö o krok i samo-
dzielnie w ca
äoĈci skonfigurowaè sposób dziaäania serwera.
W
äñczenie mechanizmu tworzenia binarnych dzienników aktualizacji na serwerze
rozwojowym jest tylko niepotrzebnym utrudnieniem. Je
Ĕeli chcesz mieè kopie zapa-
sowe serwera rozwojowego, po prostu go wy
äñcz i wykonaj kopiö zapasowñ plików
danych serwera MySQL.
Utworzony plik konfiguracyjny powinien zawiera
ü nastĊpujący wpis:
[mysqld]
log-bin=/tmp/binlog
Tak sformu
áowany wpis nakazuje serwerowi, by pliki binarnego dziennika aktualiza-
cji by
áy przechowywane w katalogu /tmp. W Ğrodowiskach produkcyjnych zwykle
wskazuje si
Ċ bardziej sensowną lokalizacjĊ (na przykáad dysk zapasowy). Na serwerach
Mac OS X i Linux trzeba si
Ċ przede wszystkim upewniü, Īe wskazana lokalizacja jest
dost
Ċpna do zapisu dla konta uĪytkownika
mysql
, na którym pracuje serwer MySQL.
Poniewa
Ī nowy plik konfiguracyjny jest juĪ gotowy, naleĪy zrestartowaü serwer MySQL.
Od teraz serwer b
Ċdzie zachowywaá siĊ tak, jakby uruchomiono go w wierszu poleceĔ
z opcj
ą
--log-bin
. Aby upewni
ü siĊ, Īe wszystko dziaáa prawidáowo, warto we wskazanej
lokalizacji sprawdzi
ü, czy w momencie uruchomienia serwera powstaá w niej nowy plik
dziennika.
Oczywi
Ğcie, pliki binarnych dzienników aktualizacji mogą zajmowaü znaczną iloĞü
miejsca zw
áaszcza wtedy, kiedy serwer jest intensywnie uĪywany. Z tego wzglĊdu trzeba
nakaza
ü serwerowi MySQL, aby za kaĪdym razem, gdy wykonywana jest peána kopia
zapasowa przy u
Īyciu
mysqldump
, serwer usuwa
á wszystkie przestarzaáe pliki binarnego
dziennika aktualizacji.
mysqldump -u root -ppassword --all-databases --flush-logs --master-data=2
´--delete-master-logs > backup.sql
Opcja
--flush-logs
nakazuje serwerowi MySQL, by bie
Īący plik binarnego dziennika
aktualizacji zamkn
ąü oraz utworzyü nowy plik, tak jakby serwer zostaá wyáączony
i ponownie uruchomiony. Opcja
--master-data=2
wskazuje programowi
mysqldump
,
Īe
na ko
Ĕcu pliku ijdb_backup.sql trzeba umieĞciü komentarz zawierający nazwĊ nowego
pliku binarnego dziennika aktualizacji. Plik ten b
Ċdzie zawieraá wpisy dotyczące pierw-
286
PHP i MySQL. Witryna WWW oparta na bazie danych
szych zmian dokonanych w bazie danych bezpo
Ğrednio po wykonaniu peánej kopii zapa-
sowej. Ostatnia opcja
--delete-master-logs
nakazuje programowi
mysqldump
usuni
Ċcie
tych plików binarnego dziennika aktualizacji, które po utworzeniu pe
ánej kopii zapaso-
wej nie s
ą juĪ potrzebne.
W przypadku powa
Īnej awarii posiadanie peánej kopii zapasowej oraz plików binar-
nego dziennika aktualizacji wygenerowanych po utworzeniu pe
ánej kopii pozwoli na
stosunkowo bezproblemowe przywrócenie bazy danych. W tym celu trzeba b
Ċdzie
zainstalowa
ü i skonfigurowaü nową, pustą wersjĊ serwera MySQL i odtworzyü na nim
pe
áną kopiĊ zapasową, zgodnie z opisem z poprzedniego punktu. Potem zostanie juĪ
tylko zaaplikowanie plików binarnego dziennika aktualizacji przy u
Īyciu programu
narz
Ċdziowego mysqlbinlog, wchodzącego w skáad instalacji serwera MySQL.
Zadanie programu narz
Ċdziowego mysqlbinlog polega na przeksztaáceniu formatu danych,
w jakim zapisywane s
ą binarne dzienniki aktualizacji, w polecenia jĊzyka SQL, które
nale
Īy wykonaü na bazie danych. Powiedzmy, Īe istnieją dwa pliki binarnego dziennika
aktualizacji, które trzeba odtworzy
ü po przywróceniu bazy danych z ostatniej peánej
kopii zapasowej. Za pomoc
ą programu mysqlbinlog z dwóch plików binarnego dzien-
nika mo
Īna wygenerowaü tekstowy plik z odpowiednimi poleceniami jĊzyka SQL,
a nast
Ċpnie wykonaü zawartoĞü utworzonego pliku na serwerze MySQL tak, jakby byá
to plik wygenerowany przez narz
Ċdzie mysqldump:
mysqlbinlog binlog.000041 binlog.000042 > binlog.sql
mysql -u root -ppassword < binlog.sql
Kontrola dost
öpu w MySQL
W rozdziale 2., „Wprowadzenie do systemu MySQL”, wspomnia
áem o bazie
mysql
, która
wyst
Ċpuje na kaĪdym serwerze MySQL i sáuĪy do przechowywania informacji o uĪyt-
kownikach, ich has
áach i o tym, co wolno im robiü. Dotychczas jednak zawsze áączy-
li
Ğmy siĊ z serwerem jako uĪytkownik root, co dawaáo nam dostĊp do wszystkich baz
i tabel.
Konto root MySQL mo
Īe wystarczyü do naszych celów, jeĞli do uruchomionego przez
nas serwera uzyskaj
ą dostĊp tylko skrypty PHP i zachowamy ostroĪnoĞü w podawa-
niu has
áa do konta. Jednak w sytuacjach, w których do serwera MySQL ma dostĊp
wielu u
Īytkowników (na przykáad jeĞli firma utrzymująca naszą witrynĊ WWW prze-
chowuje bazy danych klientów na jednym serwerze), warto skonfigurowa
ü konta uĪyt-
kowników z bardziej ograniczonymi prawami dost
Ċpu.
System kontroli dost
Ċpu w MySQL jest w peáni udokumentowany w rozdziale 6. pod-
r
Ċcznika MySQL
6
. W skrócie: prawa dost
Ċpu uĪytkowników regulowane są przez
zawarto
Ğü piĊciu tabel w bazie
mysql
:
user
,
db
,
host
,
tables_priv
i
columns_priv
.
Gdyby
Ğmy chcieli edytowaü je rĊcznie przy uĪyciu poleceĔ
INSERT
,
UPDATE
i
DELETE
,
powinni
Ğmy siĊ najpierw zapoznaü z odpowiednim fragmentem podrĊcznika. MySQL
6
http://dev.mysql.com/doc/mysql/en/privilege_system.html
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
287
dostarcza jednak prostsz
ą metodĊ zarządzania prawami dostĊpu, przeznaczoną dla nas,
zwyk
áych Ğmiertelników. UĪywając poleceĔ
GRANT
i
REVOKE
— niestandardowych komend
MySQL — mo
Īemy tworzyü uĪytkowników i przydzielaü im prawa bez zastanawiania
si
Ċ nad detalami i nad sposobem reprezentacji tego, co stworzymy we wspomnianych
tabelach.
Nadawanie uprawnie
þ za pomocñ polecenia GRANT
Polecenie
GRANT
, s
áuĪące do tworzenia nowych uĪytkowników, przydzielania haseá i przy-
pisywania praw, jest nast
Ċpujące:
mysql>GRANT uprawnienie [(kolumny)] ON do_czego
->TO uľytkownikowi [IDENTIFIED BY 'hasđo']
->[WITH GRANT OPTION];
A zatem polecenie to ma wiele pustych pól do wype
ánienia. Opiszemy kaĪde z nich,
a potem obejrzymy kilka przyk
áadów, aby siĊ przekonaü, jakie efekty dają razem.
Pole
uprawnienie
definiuje uprawnienia, które chcemy przydzieli
ü tym poleceniem.
Uprawnienia, które mo
Īna nadaü, dzielą siĊ na trzy grupy:
Uprawnienia do baz, tabel lub kolumn
ALTER
Modyfikowanie istniej
ących tabel (na przykáad dodawanie
albo usuwanie kolumn) i indeksów.
CREATE
Tworzenie nowych baz i tabel.
DELETE
Usuwanie pozycji z tabeli.
DROP
Usuwanie tabel lub baz.
INDEX
Tworzenie lub usuwanie indeksów.
INSERT
Dodawanie nowych pozycji w tabeli.
LOCK TABLES
Blokowanie tabel, do których u
Īytkownik ma prawo
SELECT
(zob. rozdzia
á 11., Zaawansowane zapytania SQL).
SELECT
Przegl
ądanie i przeszukiwanie zawartoĞci tabeli.
SHOW DATABASES
Przegl
ądanie listy dostĊpnych baz danych.
UPDATE
Modyfikowanie istniej
ących pozycji w tabeli.
Globalne uprawnienia administracyjne
FILE
Czytanie i zapisywanie plików na komputerze, na którym
dzia
áa serwer MySQL.
PROCESS
Ogl
ądanie lub niszczenie wątków naleĪących do innych
u
Īytkowników.
RELOAD
Prze
áadowywanie tabel kontroli dostĊpu, zapisywanie
dziennika na dysku itd.
SHUTDOWN
Zatrzymywanie serwera MySQL.
288
PHP i MySQL. Witryna WWW oparta na bazie danych
Uprawnienia specjalne
ALL
Uprawnienie do wszelkich czynno
Ğci (podobnie jak
w przypadku u
Īytkownika root), z wyjątkiem prawa
do nadawania praw.
USAGE
Prawo do zalogowania si
Ċ i nic ponadto.
Niektóre z tych uprawnie
Ĕ odnoszą siĊ do wáaĞciwoĞci MySQL, których jeszcze nie
poznali
Ğmy, ale wiĊkszoĞü nie powinna byü obca czytelnikom.
Pole
do_czego
okre
Ğla, do których czĊĞci serwera baz danych odnoszą siĊ nadawane
prawa.
Zapis
*.*
oznacza,
Īe prawa dotyczą wszystkich baz i tabel.
nazwaBazy.*
oznacza,
Īe prawa obejmują wszystkie tabele w bazie
nazwaBazy
.
nazwaBazy.nazwaTabeli
oznacza natomiast,
Īe prawa dotyczą tylko tabeli
nazwaTabeli
w bazie
nazwaBazy
.
Mo
Īna nawet okreĞliü prawa do pojedynczych kolumn w tabeli — wystarczy wstawiü
list
Ċ kolumn w nawias nastĊpujący po nazwie przydzielanych praw (zob. przykáad
poni
Īej).
Pole
user
wyznacza u
Īytkownika, którego mają dotyczyü prawa. W MySQL uĪytkow-
nik jest okre
Ğlany przez nazwĊ uĪytkownika podaną przy logowaniu oraz nazwĊ hosta
lub adres IP komputera, z którego si
Ċ áączy. WartoĞci te rozdziela znak
@
(tj.
nazwa_
´
uľytkownika@nazwa_hosta
). Obie mog
ą zawieraü znak globalny
%
, ale ka
Īdą zawiera-
j
ącą go wartoĞü trzeba ująü w cudzysáów (na przykáad
kevin@"%"
pozwoli u
Īytkowni-
kowi o nazwie
kevin
zalogowa
ü siĊ z dowolnego hosta i uĪyü podanych uprawnieĔ).
Pole
hasđo
definiuje has
áo wymagane od uĪytkownika przy áączeniu siĊ z serwerem
MySQL. Nawiasy kwadratowe oznaczaj
ą, Īe czĊĞü
IDENTIFIED BY 'hasđo'
polecenia
GRANT
jest opcjonalna. Ka
Īde podane w niej hasáo zamieni dotychczasowe hasáo dla
danego u
Īytkownika. JeĞli nie podamy hasáa dla nowo tworzonego uĪytkownika, serwer
nie b
Ċdzie od niego wymagaá podania hasáa przy poáączeniu.
Opcjonalna cz
ĊĞü
WITH GRANT OPTION
oznacza,
Īe uĪytkownik ma prawo uĪywaü pole-
ce
Ĕ
GRANT
i
REVOKE
do nadawania innym u
Īytkownikom takich samych uprawnieĔ, jakie
sam otrzyma
á. TĊ opcjĊ naleĪy przydzielaü ostroĪnie — nastĊpstwa nie zawsze są oczy-
wiste! U
Īytkownik zaáoĪony z opcją
WITH GRANT OPTION
mo
Īe przekazywaü tĊ opcjĊ
innym u
Īytkownikom, aby wymieniaü siĊ z nimi prawami dostĊpu.
Rozwa
Īmy kilka przykáadów. PoniĪsze polecenie
GRANT
tworzy u
Īytkownika o nazwie
dbmgr
, mog
ącego logowaü siĊ z komputera
server.host.net
z has
áem
managedb
i maj
ą-
cego pe
ány dostĊp tylko do bazy danych o nazwie
ijdb
(z prawem przydzielania innym
u
Īytkownikom praw dostĊpu do tej bazy wáącznie).
mysql>GRANT ALL ON ijdb.*
->TO dbmgr@example.com
->IDENTIFIED BY 'managedb'
->WITH GRANT OPTION;
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
289
Nast
Ċpnie, aby zmieniü hasáo tego uĪytkownika na
funkychicken
, u
Īyjemy nastĊpującego
polecenia:
mysql>GRANT USAGE ON *.*
->TO dbmgr@example.com
->IDENTIFIED BY 'funkychicken';
Zauwa
Īmy, Īe nie nadaliĞmy Īadnych dodatkowych uprawnieĔ (uprawnienie
USAGE
pozwala u
Īytkownikowi jedynie na zalogowanie siĊ), ale dotychczasowe przywileje uĪyt-
kownika pozosta
áy niezmienione.
Nast
Ċpnie zaáóĪmy istnienie nowego uĪytkownika o nazwie
jess
, który b
Ċdzie siĊ áączyü
z ró
Īnych komputerów w domenie
example.com
. Powiedzmy,
Īe uĪytkowniczka Jess
jest odpowiedzialna za aktualizowanie personaliów i adresów e-mail autorów, ale mo
Īe
te
Ī czasem przeglądaü pozostaáe informacje w bazie. W związku z tym uzyska dostĊp
tylko do odczytu (tj.
SELECT
) do bazy
ijdb
, ale b
Ċdzie teĪ mogáa wykonywaü
UPDATE
na
kolumnach
nazwa
i
w tabeli
autor
. Oto odpowiednie polecenia:
mysql>GRANT SELECT ON ijdb.*
->TO jess@"%.example.com"
->IDENTIFIED BY "jessrules";
mysql>GRANT UPDATE (nazwa, email) ON ijdb.autor
->TO jess@"%.example.com";
Zauwa
Īmy, Īe w pierwszym poleceniu uĪyliĞmy w nazwie hosta znaku globalnego
%
,
aby okre
Ğliü, z jakich komputerów bĊdzie siĊ mogáa áączyü Jess. Nie daliĞmy jej takĪe
prawa do przekazywania uprawnie
Ĕ innym uĪytkownikom, poniewaĪ nie dodaliĞmy
klauzuli
WITH GRANT OPTION
na ko
Ĕcu linii. Drugie polecenie pokazuje, jak przydzielaü
uprawnienia do okre
Ğlonych kolumn w tabeli — naleĪy umieszczaü rozdzielone przecin-
kami kolumny w nawiasie za nazw
ą nadawanego uprawnienia.
Aby sprawdzi
ü, jakie uprawnienia nadano konkretnemu uĪytkownikowi, naleĪy wyko-
na
ü polecenie
SHOW GRANTS
:
mysql> SHOW GRANTS FOR jess@"%.example.com"
Polecenie zwróci list
Ċ poleceĔ
GRANT
, których nale
Īy uĪyü, aby na nowo utworzyü wska-
zanego u
Īytkownika z identycznymi uprawnieniami.
Odbieranie uprawnie
þ przy uĔyciu polecenia REVOKE
Polecenie
REVOKE
, jak mo
Īna siĊ domyĞliü, sáuĪy do odbierania uĪytkownikowi poprzednio
nadanych uprawnie
Ĕ dostĊpu. Skáadnia polecenia jest nastĊpująca:
mysql>REVOKE uprawnienie [(kolumny)]
->ON do_czego FROM uľytkownikowi;
Wszystkie pola w poleceniu maj
ą to samo dziaáanie, co w przypadku polecenia
GRANT
.
Aby odebra
ü uprawnienia do uĪywania polecenia
DROP
wspó
ápracownikowi Jess o nazwie
idiot
(je
Ğli, na przykáad, ma on zwyczaj sporadycznego omyákowego usuwania za
pomoc
ą tego polecenia tabel i baz danych), uĪylibyĞmy nastĊpującego polecenia:
290
PHP i MySQL. Witryna WWW oparta na bazie danych
mysql>REVOKE DROP ON *.* FROM idiot@"%.example.com";
Cofni
Ċcie prawa uĪytkownika do zalogowania siĊ jest jedyną rzeczą, jakiej nie moĪna
osi
ągnąü przy uĪyciu poleceĔ
GRANT
i
REVOKE
. Te polecenia definitywnie odbior
ą uĪytkow-
nikowi wszelk
ą moĪliwoĞü jakichkolwiek dziaáaĔ w bazie poza zalogowaniem siĊ:
mysql>REVOKE ALL PRIVILEGES ON *.* FROM idiot@"%.example.com";
mysql>REVOKE GRANT OPTION ON *.* FROM idiot@"%.example.com";
Jednak aby ca
ákowicie usunąü uĪytkownika, trzeba wykonaü polecenie
DROP USER
:
mysql>DROP USER idiot@"%.example.com"
Porady na temat kontroli dost
öpu
Sposób, w jaki dzia
áa system kontroli dostĊpu w MySQL, ma pewne idiosynkrazje, o któ-
rych trzeba wiedzie
ü przed rozpoczĊciem zakáadania kont uĪytkowników.
Je
Ğli tworzymy uĪytkowników mogących siĊ zalogowaü do serwera MySQL tylko z kom-
putera, na którym dzia
áa serwer (na przykáad wymagamy, aby logowali siĊ do kom-
putera i uruchamiali stamt
ąd klienta MySQL, ewentualnie porozumiewali siĊ z serwe-
rem przy u
Īyciu skryptów serwerowych w rodzaju PHP), moĪemy siĊ zastanawiaü,
jaka powinna by
ü czĊĞü polecenia
GRANT
dotycz
ąca uĪytkownika. ZaáóĪmy, Īe serwer
jest uruchomiony na komputerze www.example.com. Jak powinna wygl
ądaü nazwa uĪyt-
kownika:
nazwa_uľytkownika@example.com
czy
nazwa_uľytkownika@localhost
?
Odpowied
Ĩ brzmi: nie moĪna polegaü na Īadnej z nich, jeĞli chcemy obsáuĪyü wszystkie
po
áączenia. Teoretycznie, jeĪeli áączący siĊ uĪytkownik poda nazwĊ hosta w programie
klienckim
mysql
albo w funkcji PHP
mysqli_connect
, nazwa ta zostanie porównana
z wpisem w systemie kontroli dost
Ċpu. PoniewaĪ jednak raczej nie chcemy zmuszaü
u
Īytkowników do podawania okreĞlonej nazwy hosta (ci uĪywający klienta
mysql
nie
b
Ċdą zapewne chcieli podawaü nazwy hosta w ogóle), lepiej uciec siĊ do rozwiązania
zast
Ċpczego.
Dla u
Īytkowników potrzebujących moĪliwoĞci áączenia siĊ z komputera, na którym
jest uruchomiony serwer MySQL, najlepiej stworzy
ü dwa wpisy w systemie dostĊpu
MySQL: jeden z rzeczywist
ą nazwą komputera (na przykáad
nazwa_uľytkownika
@example.com
), drugi z nazw
ą
localhost
(na przyk
áad
nazwa_uľytkownika@localhost
).
Oczywi
Ğcie, wymaga to oddzielnego nadawania i usuwania uprawnieĔ dla kaĪdej
z nazw, ale tylko na takim rozwi
ązaniu moĪna naprawdĊ polegaü.
Kolejnym problemem, cz
Ċsto napotykanym przez administratorów MySQL, jest to, Īe
nazwy u
Īytkowników zawierające nazwy wieloznaczne (na przykáad przytaczana
jess@%.example.com
) mog
ą nie zadziaáaü. Niepowodzenia nastĊpują zazwyczaj w wyniku
sposobu, w jaki MySQL nadaje priorytety wpisom w systemie kontroli dost
Ċpu. Wpisy
s
ą szeregowane w takiej kolejnoĞci, aby bardziej jednoznaczne nazwy hosta nastĊpo-
wa
áy jako pierwsze (na przykáad
www.example.com
jest nazw
ą caákowicie jednoznaczną,
%.example.com
— mniej jednoznaczn
ą, a
%
— ca
ákiem niejednoznaczną).
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
291
System kontroli dost
Ċpu nowo zainstalowanego serwera MySQL zawiera dwa anoni-
mowe wpisy (pozwalaj
ące na áączenie siĊ przy uĪyciu dowolnej nazwy uĪytkownika
z
localhost
i rzeczywistej nazwy lokalnego hosta) i dwa wpisy dla u
Īytkownika root.
Opisany powy
Īej problem wystĊpuje wówczas, gdy wpisy anonimowe mają pierw-
sze
Ĕstwo przed nowo dodanymi uĪytkownikami ze wzglĊdu na bardziej jednoznaczną
nazw
Ċ hosta.
Spójrzmy na uproszczon
ą zawartoĞü tabeli
user
na www.example.com, naszym fikcyj-
nym serwerze MySQL, po tym, jak dodali
Ğmy wpis dla
jess
. Wiersze s
ą posortowane
w porz
ądku, w jakim przegląda je serwer, kiedy uwierzytelnia poáączenie.
+-----------------+------+-----------------+
| Host | User | Password |
+-----------------+------+-----------------+
| localhost | root | encrypted value |
| www.example.com | root | encrypted value |
| localhost | | |
| www.example.com | | |
| %.example.com | jess | encrypted value |
+-----------------+------+-----------------+
Jak widzimy, wpis dla u
Īytkowniczki
jess
ma najmniej jednoznaczn
ą nazwĊ hosta,
zatem pojawia si
Ċ na liĞcie jako ostatni. Kiedy
jess
próbuje si
Ċ poáączyü spod adresu
www.example.com, serwer dopasowuje jej prób
Ċ do jednego z uĪytkowników anoni-
mowych (pusta warto
Ğü w kolumnie
User
pasuje do ka
Īdego uĪytkownika). PoniewaĪ
wpisy anonimowe nie wymagaj
ą hasáa, a
jess
zapewne podaje swoje has
áo, MySQL
odrzuca prób
Ċ poáączenia. Nawet jeĪeli uĪytkowniczka
jess
zdo
áa poáączyü siĊ bez
has
áa, uzyska bardzo ograniczone uprawnienia przeznaczone dla uĪytkowników anoni-
mowych, zamiast praw okre
Ğlonych w jej wpisie w systemie kontroli dostĊpu.
Istniej
ą dwa rozwiązania tego problemu. MoĪna rozpocząü administrowanie serwerem
MySQL od usuni
Ċcia wpisów dla uĪytkowników anonimowych (
DELETE FROM mysql.
user WHERE User=""
) albo doda
ü po dwa dodatkowe wpisy dla wszystkich uĪytkowników,
którzy potrzebuj
ą moĪliwoĞci áączenia siĊ z adresu
localhost
(tj. wpis dla
localhost
i dla rzeczywistej nazwy serwera).
+-----------------+------+-----------------+
| Host | User | Password |
+-----------------+------+-----------------+
| localhost | root | encrypted value |
| www.example.com | root | encrypted value |
| localhost | jess | encrypted value |
| www.example.com | jess | encrypted value |
| localhost | | |
| www.example.com | | |
| %. example.com | jess | encrypted value |
+-----------------+------+-----------------+
Trzy wpisy w systemie dla ka
Īdego uĪytkownika stanowią nadmiar, wiĊc zalecane
jest usuwanie u
Īytkowników anonimowych, o ile nie ma siĊ dla nich szczególnych
zastosowa
Ĕ.
292
PHP i MySQL. Witryna WWW oparta na bazie danych
+-----------------+------+-----------------+
| Host | User | Password |
+-----------------+------+-----------------+
| localhost | root | encrypted value |
| www.example.com | root | encrypted value |
| %.example.com | jess | encrypted value |
+-----------------+------+-----------------+
Problem braku dost
öpu
Zapomnienie has
áa po trwającym godzinĊ instalowaniu i konfigurowaniu serwera MySQL
jest równie zawstydzaj
ące, jak zamkniĊcie kluczyków w samochodzie. Na szczĊĞcie,
nie wszystko jest stracone, je
Ğli mamy uprawnienia administratora na komputerze, na
którym dzia
áa serwer MySQL, albo moĪemy siĊ zalogowaü jako uĪytkownik, którego
skonfigurowali
Ğmy do uruchamiania serwera (
mysql
, je
Īeli serwer zostaá zainstalowany
zgodnie z instrukcj
ą instalacji w systemie Linux zamieszczoną w rozdziale 1., „Insta-
lacja”). Poni
Īsza procedura pozwala na odzyskanie kontroli nad serwerem.
Po pierwsze, trzeba wy
áączyü serwer MySQL. Zazwyczaj robimy to przy uĪyciu narzĊ-
dzia
mysqladmin
, ale poniewa
Ī wymaga ono podania zapomnianego hasáa, musimy
zamiast tego zako
Ĕczyü proces serwera. W systemie Windows naleĪy uĪyü MenedĪera
zada
Ĕ, aby znaleĨü i zakoĔczyü proces MySQL, lub po prostu zatrzymaü usáugĊ MySQL,
je
Ğli zostaáa zainstalowana. W systemach Mac OS X i Linux naleĪy uĪyü polecenia
ps
albo zajrze
ü do pliku PID serwera w katalogu danych MySQL, aby okreĞliü ID procesu
serwera, po czym zatrzyma
ü proces za pomocą nastĊpującego polecenia:
kill pid
pid
to identyfikator procesu serwera MySQL.
To powinno wystarczy
ü do wyáączenia serwera. Nie naleĪy uĪywaü polecenia
kill -9
,
dopóki nie jest to absolutnie konieczne, poniewa
Ī moĪe ono spowodowaü uszkodze-
nie plików z tabelami. Je
Ğli jesteĞmy do tego zmuszeni, w dalszej czĊĞci rozdziaáu znaj-
duj
ą siĊ instrukcje sprawdzania i naprawiania plików z danymi.
Gdy serwer zosta
á wyáączony, moĪna uruchomiü go ponownie za pomocą polecenia
mysqld_safe
z opcj
ą
--skip-grant-tables
. Oznacza to,
Īe serwer MySQL ma pozwoliü
na nieograniczony dost
Ċp dla kaĪdego. OczywiĞcie naleĪy uruchamiaü serwer w tym
trybie najrzadziej jak to mo
Īliwe, ze wzglĊdu na nieuniknione zagroĪenie dla bezpie-
cze
Ĕstwa, jakie pociąga za sobą to rozwiązanie.
Po po
áączeniu siĊ trzeba zmieniü hasáo uĪytkownika root na takie, którego nie zapo-
mnimy:
mysql>UPDATE mysql.user SET Password=PASSWORD("nowehas
đo")
->WHERE User="root";
Na koniec roz
áączamy siĊ i wydajemy serwerowi polecenie przeáadowania tabel z upraw-
nieniami u
Īytkowników, aby system MySQL ponownie zacząá Īądaü podawania haseá:
mysqladmin flush-privileges
Rozdzia
ä 10.
i Administrowanie bazñ MySQL
293
Problem rozwi
ązany — i nikt nie musi wiedzieü, co siĊ wydarzyáo. Tak jak w przypadku
zamkni
Ċcia kluczyków w samochodzie, jesteĞmy zdani tylko na siebie.
Sprawdzanie i naprawianie
plików danych MySQL
Gdy zanika pr
ąd, w sytuacjach, kiedy wymuszamy zatrzymanie procesu serwera MySQL
przy u
Īyciu polecenia
kill -9
, i wtedy, gdy kolega Jess,
idiot@%.example.com
, kop-
nie wtyczk
Ċ zasilania, istnieje ryzyko, Īe pliki danych MySQL ulegną uszkodzeniu.
Mo
Īe siĊ to zdarzyü, jeĞli w czasie wystąpienia jednego z powyĪszych zakáóceĔ serwer
zmienia zawarto
Ğü plików; wtedy po zdarzeniu pliki mogą okazaü siĊ znieksztaácone albo
niespójne. Taki rodzaj uszkodzenia potrafi by
ü subtelny i moĪe pozostaü niewykryty
przez wiele dni, tygodni, a nawet miesi
Ċcy. W efekcie, kiedy w koĔcu odkryjemy pro-
blem, wszystkie kopie zapasowe mog
ą juĪ zawieraü to samo uszkodzenie.
W rozdziale 6. podr
Ċcznika MySQL
7
znajduje si
Ċ opis narzĊdzia
myisamchk
, standar-
dowo dost
Ċpnego w instalacji MySQL, oraz instrukcja uĪywania go w celu sprawdzania
i naprawy plików danych MySQL. O ile zapoznanie si
Ċ z tym rozdziaáem jest zalecane
dla ka
Īdego, kto zamierza utworzyü wysoko wydajny, bezpieczny system utrzymania
serwera, przedstawimy w tej cz
ĊĞci podstawowe zagadnienia.
Zanim jednak przejdziemy do dalszych rozwa
ĪaĔ, warto abyĞmy zdali sobie sprawĊ,
Īe program
myisamchk
oczekuje wy
áącznego dostĊpu do plików danych MySQL, które
sprawdza i modyfikuje. Je
Ğli dziaáający jednoczeĞnie serwer MySQL zapisze coĞ do
pliku, który w
áaĞnie jest sprawdzany,
myisamchk
mo
Īe mylnie uznaü to za báąd i próbo-
wa
ü go skorygowaü — co moĪe z kolei spowodowaü báąd serwera. Aby zatem unik-
n
ąü pogorszenia zamiast naprawienia problemu, warto wyáączyü serwer MySQL, jeĞli
pracujemy na jego plikach z danymi. Alternatywnym rozwi
ązaniem jest wyáączenie
serwera tyko na czas zrobienia kopii plików i praca z kopiami. W takim przypadku po
zako
Ĕczonej pracy trzeba wyáączyü serwer ponownie, aby zamieniü stare pliki na nowe
i, by
ü moĪe, zastosowaü wpisy z utworzonego tymczasem binarnego dziennika aktu-
alizacji.
Struktura katalogu danych MySQL nie jest zbyt skomplikowana. Ka
Īdej bazie odpo-
wiada jeden podkatalog, zawieraj
ący pliki danych, w których przechowywana jest zawar-
to
Ğü tabel w bazie. KaĪdą tabelĊ reprezentują trzy pliki o takich samych nazwach, jak
nazwa tabeli, ale ró
Īnych rozszerzeniach. Plik nazwaTabeli.frm, nazywany plikiem
formatu tabeli, zawiera definicj
Ċ tabeli, czyli wchodzące w jej skáad kolumny i ich typy
danych. Plik nazwaTabeli.MYD przechowuje wszystkie dane w tabeli. Plik nazwaTabeli.
MYI zawiera wszelkie indeksy istniej
ące dla tabeli (na przykáad tabelĊ przeglądową,
która pomaga kolumnie klucza g
áównego przyspieszaü zapytania w tej tabeli).
7
http://dev.mysql.com/doc/mysql/en/table-maintenance.html
294
PHP i MySQL. Witryna WWW oparta na bazie danych
Chc
ąc sprawdziü tabelĊ na okolicznoĞü báĊdów, naleĪy uruchomiü program
myisamchk
(znajduj
ący siĊ w katalogu bin serwera MySQL) i podaü albo ĞcieĪkĊ do plików i nazwĊ
tabeli, albo nazw
Ċ indeksu tabeli
8
:
myisamchk /usr/local/mysql/data/nazwaBazy/nazwaTabeli
myisamchk /usr/local/mysql/data/nazwaBazy/nazwaTabeli.MYI
Albo, w systemie Windows:
myisamchk "C:\"Program Files"\MySQL\data\nazwaBazy\nazwaTabeli"
myisamchk "C:\"Program Files"\MySQL\data\nazwaBazy\nazwaTabeli.MYI"
Ka
Īda z powyĪszych komend wykona test podanej tabeli. Aby sprawdziü wszystkie
tabele w bazie, nale
Īy uĪyü nazwy wieloznacznej:
myisamchk /usr/local/mysql/data/nazwaBazy/*.MYI
Natomiast aby sprawdzi
ü wszystkie tabele we wszystkich bazach, trzeba uĪyü dwóch
znaków wieloznacznych:
myisamchk /usr/local/mysql/data/*/*.MYI
Uruchomiony bez
Īadnych opcji program
myisamchk
wykonuje standardowy test plików
tabel. Je
Ğli podejrzewamy problem w tabeli, a zwykáe sprawdzenie nie znajduje Īadnych
b
áĊdów, moĪemy wykonaü znacznie bardziej wyczerpujący (ale teĪ znacznie wolniejszy!)
test przy u
Īyciu opcji
--extend-check
:
myisamchk --extend-check /sciezka/do/tabeli
Sprawdzanie pod k
ątem báĊdów jest nieszkodliwe, nie trzeba wiĊc martwiü siĊ moĪli-
wo
Ğcią pogorszenia istniejącego problemu podczas testowania plików danych. Z kolei
naprawianie tabel, mimo
Īe zazwyczaj bezpieczne, zmienia pliki danych w sposób nie-
odwracalny. Z tego powodu bardzo zalecane jest tworzenie kopii uszkodzonych plików
tabel przed rozpocz
Ċciem prób naprawiania. Przed kopiowaniem plików z danymi
nale
Īy takĪe upewniü siĊ, Īe serwer MySQL jest wyáączony.
Istniej
ą trzy metody naprawcze, których moĪna uĪyü, aby rozwiązaü problem uszko-
dzonej tabeli. Nale
Īy wypróbowywaü je po kolei, za kaĪdym razem na nowej kopii
plików z danymi (tj. nie wolno stosowa
ü drugiej procedury odzyskiwania danych na
zestawie plików, pozosta
áym po nieudanej próbie pierwszej metody). JeĪeli w którym-
kolwiek etapie otrzymamy komunikat b
áĊdu o niemoĪnoĞci utworzenia pliku tymcza-
sowego, trzeba skasowa
ü plik, o którym mówi komunikat, i ponowiü próbĊ — wspo-
mniany plik jest pozosta
áoĞcią po poprzedniej próbie naprawy.
Trzy metody naprawiania plików stosuje si
Ċ w kolejnoĞci ukazanej poniĪej:
myisamchk --recover --quick /sciezka/do/tabeli
myisamchk --recover /sciezka/do/tabeli
myisamchk --safe-recover /sciezka/do/tabeli
8
Aby upro
Ğciü opis, nie wspomniaáem juĪ, Īe w systemach Mac OS X i Linux uzyskanie dostĊpu do plików
danych serwera MySQL b
Ċdzie wymagaü posiadania uprawnieĔ administratora. Aby uruchomiü
myisamchk
z uprawnieniami administratora, zamiast polecenia
myisamchk
nale
Īy wykonaü polecenie
sudo myisamchk
.