Przygotowanie środowiska pracy dla bazy MySQL z wykorzystaniem XAMPP Portable Lite oraz MySQL-Front opracował: dr inż. Artur Gramacki (a.gramacki@iie.uz.zgora.pl) KAŻDY student wykonuje SAMODZIELNIE na WŁASNYM komputerze (lub PenDrive-ie) następujące zadania: 1. Wgrać paczkę dystrybucyjną systemu XAMPP. Będziemy używali nieco okrojonej, w stosunku do bazowej, wersji o nazwie XAMPP Portable Lite (dla nas w zupełności wystarczającej). W chwili pisania niniejszego opracowania (8 października 2013), najnowsza wersja to plik: http://www.apachefriends.org/download.php?xampp-portable-win32-1.8.3-1-vc11.zip Zwróćmy uwagę, że ta wersja (1.8.3) nie jest wspierana przez systemem Windows XP. Gdy więc ma komputerze mamy zainstalowany ten właśnie system operacyjny, to należy pobrać wersję 1.8.2: http://www.apachefriends.org/download.php?xampp-portable-win32-1.8.2-2-vc9.zip Uwaga 1: używając PenDrive-a słabej jakości (z wolnym transferem) wgranie kilku tysięcy niewielkich plików może zająć sporo czasu. Należy uzbroić się w cierpliwość! Uwaga 2: używana wersja nazywa się Portable, gdyż nie wymaga instalowania. Wystarczy rozpakować podane wyżej archiwum do dowolnego katalogu na dysku i od razu można używać XAMPP-a (wymagana jest tylko prosta konfiguracja, o czym niżej). 2. Przeprowadzić automatyczną konfigurację systemu XAMPP (program setup_xampp.bat). 1
3. Uruchomić konsolę kontrolną (program xampp-control.exe) i sprawdzić, czy MySQL oraz Apacze uruchamiają się poprawnie. Gdy będzie taka potrzeba, ustawić właściwe numery portów (modyfikując odpowiednie wpisy w plikach my.ini oraz httpd.conf). Konsola powinna wyglądać jak niżej. 4. Sprawdzić, czy w przeglądarce internetowej poprawnie uruchamia się moduł obsługi systemu XAMPP (http://hostname:port/xampp). Jako hostname:port na lokalnym komputerze wpisujemy http://localhost (chyba, że ustawiono inny niż domyślny numer portu 80. Wówczas, po dwukropku, wpisujemy ten właśnie zmieniony numer). Po pierwszym uruchomieniu mamy ekran do wyboru wersji językowej, jak poniżej. Wybieramy język polski i powinniśmy zobaczyć panel startowy. 2
5. W MySQL-u ustawić hasło dla użytkownika root (domyślnie użytkownik root nie ma w systemie XAMPP ustawionego żadnego hasła). Po kliknięciu na link PhpMyAdmin informuje nas o tym stosowny komunikat na dole ekranu ( Twój plik konfiguracyjny zawiera ustawienia (root bez hasła), które odpowiadają domyślnie uprzywilejowanemu koncie MySQL. Twój serwer MySQL działa z tym domyślnie jest otwarty na włamania, i naprawdę powinieś naprawić tę lukę w zabezpieczeniach poprzez ustawienie hasła dla użytkownika 'root'. ). Widać to też po kliknięciu na zakładkę Użytkownicy (w tabeli, która się pojawia patrz kolumny Użytkownik, Hasło). Hasło możemy ustawić wprost z panelu PhpMyAdmin klikając w link Edytuj uprawnienia. Hasło można też ustawić wydając odpowiednie polecenie w konsoli (tekstowej) serwera MySQL. Konsolę uruchamiamy wchodząc do katalogu, gdzie wgrano paczkę XAMPP Portable Lite i następnie przechodząc do podkatalogu mysql\bin. Wpisujemy wówczas polecenie: mysql.exe u root Po poprawnym zalogowaniu ekran powinien wyglądać jak niżej. 3
Następnie wpisujemy podane niżej polecenie. SET PASSWORD FOR 'root'@'localhost'= PASSWORD('haslo-root-a'); Uwaga, po zmianie hasła z poziomu konsoli tekstowej próba ponownego uruchomienia panelu PhpMyAdmin skończy się komunikatem o błędzie (bo na razie PhpMyAdmin nic nie wie o dokonanej zmianie hasła i nadal zakłada, że użytkownik root nie ma hasła). Należy więc zmodyfikować zawartość pliku phpmyadmin\config.inc.php\config.inc.php modyfikując linijkę $cfg['servers'][$i]['password'] = ''; Po wpisaniu tam ustawionego wcześniej hasła możemy uruchomić panel PhpMyAdmin. Pojawia się jednak kolejny ' problem', gdyż wchodzenie do panelu PhpMyAdmin nie wymaga podawania jakiegokolwiek hasła (jest ono wszak zapisane na sztywno w pliku config.inc.php). Jest to ewidentna luka w zabezpieczeniach. Należy więc tak zmodyfikować plik config.inc.php, aby system prosił o wpisanie przez użytkownika hasła administratora (root-a). Należy odszukać linijkę $cfg['servers'][$i]['auth_type'] = 'config'; 4
i zamiast słowa config wpisać słowo cookie. Dokładniejszy opis tego parametru można znaleźć w dokumentacji pod adresem http://localhost/phpmyadmin/doc/html/config.html W tym momencie można już usunąć hasło wpisane w linijce $cfg['servers'][$i]['password'] = ''; pliku config.inc.php. Od tej pory nasz serwer MySQL oraz panel PhpMyAdmin są poprawnie chronione hasłem i aby uruchomić PhpMyAdmin-a musimy podać hasło. 6. Zainstalować wygodnego w użyciu klienta dla bazy MySQL o nazwie MySQL-Front (http://www.mysqlfront.de/) i podłączyć się nim do serwera MySQL. 5
Po wybraniu bazy danych mysql oraz tabeli user powinniśmy dostrzec tam (m.in.) konto użytkownika root z widocznym zakodowanym hasłem. 7. Użytkownik root jest użytkownikiem o specjalnym znaczeniu. Nie powinno się bezpośrednio na nim wykonywać żadnych nieprzemyślanych działań. Lepiej więc do eksperymentów i nauki utworzyć dedykowane konto (nadamy mu pełen zestaw uprawnień). Użytkownika można utworzyć (wyklinać) w programie PhpMyAdmin, ale bardziej edukacyjnie będzie wpisać stosowne polecenia wprost w konsoli tekstowej. Logujemy się więc do serwera wpisując następujące polecenie (zostaniemy poproszeni o podanie ustawionego wcześniej hasła dla użytkownika root, stąd przełącznik p, którego nie użyliśmy w punkcie 5). bin/mysql.exe u root -p -- trzy pierwsze polecenia kasują bazę danych oraz użytkowników -- utworzonych poniżej. Gdy tworzysz bazę i użytkowników po raz -- PIERWSZY, polecenia te generują błędy. Można je bezpiecznie -- ignorować. DROP DATABASE lab; DROP USER 'lab'@'localhost'; DROP USER 'lab'@'%'; -- tworzenie bazy o nazwie lab CREATE DATABASE lab; 6
-- utworzenie 2 użytkowników i nadanie im pełnego zestawu uprawnień -- (dlaczego tworzymy 2 użytkowników zostanie wyjaśnione na -- kolejnych zajęciach) GRANT ALL PRIVILEGES ON lab.* TO 'lab'@'localhost' IDENTIFIED BY 'lab'; GRANT ALL PRIVILEGES ON lab.* TO 'lab'@'%' IDENTIFIED BY 'lab'; -- przełączenie się na bazę systemową i sprawdzenie poprawności -- wykonania powyższych poleceń USE mysql; SELECT host, user, password FROM user WHERE user LIKE 'lab'; SELECT host, db, user FROM db; Poniżej pokazano konsolę tekstową MySQL, gdzie poprawnie zalogowano się na użytkownika root oraz, gdy wszystkie polecenia wykonały się poprawnie. Poprawność utworzenia użytkowników można też oczywiście zweryfikować w programie MySQL-Front, po zalogowaniu się na użytkownika root. 7
8. Zainstalować demonstracyjny schemat bazy danych o nazwie SAKILA. Informacja o nim oraz sposób instalacji można znaleźć na stronie http://dev.mysql.com/doc/sakila/en/sakilainstallation.html Schemat ten składa się z 23 tabel relacyjnych oraz widoków zapełnionych pewną ilością danych. Poniżej pokazano zrzut z konsoli tekstowej MySQL obrazujący proces instalacji bazy SAKILA. Polecenia wpisywane przez użytkownika pogrubiono i powiększono. mysql> SOURCE sakila-db\sakila-schema.sql Query OK, 1 row affected (0.02 sec) Database changed Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.08 sec) Query OK, 0 rows affected (0.08 sec) Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.11 sec) Query OK, 0 rows affected (0.08 sec) Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.03 sec) Query OK, 0 rows affected (0.08 sec) Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.13 sec) Query OK, 0 rows affected (0.09 sec) Query OK, 0 rows affected (0.08 sec) 8
Query OK, 0 rows affected (0.03 sec) Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.03 sec) mysql> SOURCE sakila-data.sql Database changed Query OK, 200 rows affected (0.02 sec) Records: 200 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 603 rows affected (0.09 sec) Records: 603 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.01 sec) Query OK, 16 rows affected (0.02 sec) Records: 16 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 600 rows affected (0.05 sec) Records: 600 Duplicates: 0 Warnings: 0 9
Query OK, 109 rows affected (0.00 sec) Records: 109 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 599 rows affected (0.19 sec) Records: 599 Duplicates: 0 Warnings: 0 Query OK, 1000 rows affected (0.69 sec) Records: 1000 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.16 sec) Query OK, 5462 rows affected (0.38 sec) Records: 5462 Duplicates: 0 Warnings: 0 Query OK, 1000 rows affected (0.09 sec) Records: 1000 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.03 sec) Query OK, 4581 rows affected (0.47 sec) Records: 4581 Duplicates: 0 Warnings: 0 Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.01 sec) Query OK, 14885 rows affected (1.55 sec) Records: 14885 Duplicates: 0 Warnings: 0 Query OK, 1164 rows affected (0.14 sec) Records: 1164 Duplicates: 0 Warnings: 0 10
Query OK, 0 rows affected (0.03 sec) Query OK, 12377 rows affected (1.67 sec) Records: 12377 Duplicates: 0 Warnings: 0 Query OK, 3667 rows affected (0.64 sec) Records: 3667 Duplicates: 0 Warnings: 0 Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.03 sec) Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.03 sec) mysql> USE sakila Database changed mysql> SHOW TABLES; +----------------------------+ Tables_in_sakila +----------------------------+ actor actor_info address category city country customer customer_list film film_actor film_category film_list film_text inventory language nicer_but_slower_film_list payment rental 11
sales_by_film_category sales_by_store staff staff_list store +----------------------------+ 23 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM film; +----------+ COUNT(*) +----------+ 1000 +----------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM film_text; +----------+ COUNT(*) +----------+ 1000 +----------+ 1 row in set (0.00 sec) 12