Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Usługi dostępne w PLD
MySQL - System Zarządzania Relacyjnymi Bazami Danych (ang. RDBMS)
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
HTML (jeden plik)
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

MySQL - System Zarządzania Relacyjnymi Bazami Danych (ang. RDBMS)

<- ->
 

Co to jest MySQL?

MySQL jest Systemem Zarządzania Relacyjnymi Bazami Danych. Znany i ceniony jest przede wszystkim ze względu na swoją niebywałą wydajność i szybkość działania. Świetnie nadaje się do obsługi projektów internetowych, ale nie tylko - z powodzeniem używany jest również w wielkich projektach informatycznych organizacji, takich jak chociażby NASA. Przeciwnicy MySQL'a często mówią, jak to bardzo brakuje mu wielu ficzerów, które posiadają prawdziwe, duże systemy baz danych. Ze swojego doświadczenia wiem, że część z tych ludzi nawet nie rozróżnia wersji systemu, które oferuje nam firma MySQL AB (producent MySQL).

Ogólne cechy MySQL

  • Napisany w C i C++ (wydajność!).

  • API dla wielu języków programowania: C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, Tcl.

  • Pełna wielowątkowość, korzystająca z wątków kernela. Oznacza to, że MySQL będzie pracował na maszynie wieloprocesorowej, jeśli tylko taką posiadasz.

  • Opcjonalna obsługa transakcji.

  • B-drzewa z kompresowanymi indeksami. To wam się przyda, jakbyście mieli wieeeelkie bazy ;) Wystarczy powiedzieć, że znacząco wpływa na czas wyszukiwania i pobierania danych (wierszy) z bazy.

  • Istnieje możliwość "osadzenia" (ang. embed) serwera MySQL w aplikacji, którą piszemy. Jeśli ktoś potrzebuje funkcjonalności systemu baz danych, a niekoniecznie chce się bawić w klient-serwer, to czemu nie?

  • Duża liczba typów danych w kolumnach. Liczby, ciągi znakowe, obiekty binarne (BLOB), data & czas, typy wyliczeniowe, zestawy. Na uwagę zasługuje fakt, że w MySQL możemy daną kolumnę dostosować do pewnej wielkości danych, które zamierzamy w niej przechowywać (np. TINYINT, a nie INT), tym samym uzyskujemy większą wydajność i mniejsze zużycie pamięci (również dyskowej). Istnieje możliwość definiowania niektórych typów danych jako narodowych (różne standardy kodowania chociażby).

  • Obsługa klauzul agregujących i grupujących SQL.

  • Złączenia zewnętrzne (LEFT & RIGHT).

  • Komenda SHOW pozwalająca przeglądać informacje na temat baz, tabel i indeksów. Komenda EXPLAIN opisująca pracę optymalizatora zapytań.

  • Bardzo prosty (z punktu widzenia administratora) system zabezpieczeń. Wszystkie hasła są szyfrowane.

  • Połączenia z serwerem przez: TCP/IP, ODBC, JDBC.

  • Lokalizacja (w sensie językowym) serwera. Komunikaty m.in. po polsku.

Instalacja

Instalację oprogramowania przeprowadzimy oczywiście z pomocą naszego poldka. Logujemy się jako root, bądź używamy polecenia sudo, jeżeli mieliśmy je skonfigurowane do tego celu. Pierwszą rzeczą, którą będziemy musieli zrobić, jest ściągnięcie i zainstalowanie odpowiednich pakietów z repozytorium PLD. Można zrobić to używając zarówno trybu wsadowego, jak i interaktywnego. Podam oba sposoby, wybierz sobie ten, który bardziej Ci odpowiada :) (osobiście wolę tryb interaktywny, ze względu na tab-completion).

Najpierw uruchamiamy poldka. Można podać mu flagę -n, która oznacza źródło, z którego zamierzamy ściągać pakiety. Jeśli nie podamy tej flagi, wówczas poldek skorzysta z pierwszego źródła wpisanego do pliku /etc/poldek.conf. Ja korzystam ze słowackiego serwera firmy Bentel Ltd., ale to nie ma znaczenia.

Instalacja w trybie wsadowym

W trybie wsadowym poldka, instalacja wygląda następująco:

# poldek -n bentel -i mysql mysql-client mysql-libs

Instalacja w trybie interaktywnym

W trybie interaktywnym poldka, instalacja wygląda tak:

# poldek -n bentel
Wczytywanie ftp://spirit.bentel.sk/mirrors/PLD/[...]/packages.dir.gz...
Przeczytano 5116 pakietów
Wczytywanie /root/.poldek-cache/packages.dir.dbcache.var.lib.rpm.gz...
Przeczytano 450 pakietów

Witaj w poldkowym trybie interaktywnym. Wpisz "help" aby otrzymać pomoc.

poldek>

Teraz przystępujemy do instalacji pakietów MySQL:

poldek> install mysql mysql-client mysql-libs

poldek sam zadba o spełnienie wymaganych zależności.

Konfiguracja MySQL

Żeby móc sprawnie (i bezpiecznie) używać naszego świeżo zainstalowanego serwera, musimy go odpowiedno skonfigurować.

Otworzymy naszym ulubionym edytorem tekstu plik konfiguracyjny demona MySQL. W przypadku użycia edytora Vim wydajemy następującą komendę:

# vim /etc/mysql/clusters.conf

Jeżeli nie zamierzamy zmieniać lokacji, w której będzie u nas pracował MySQL, to po prostu odkomentujmy linijkę z MYSQL_DB_CLUSTERS, a jeżeli zamierzamy umieścić serwer MySQL w innym miejscu, to należy tą linijkę odkomentować, ale dodatkowo zmienić ścieżkę.

# standard setting
MYSQL_DB_CLUSTERS="/var/lib/mysql"

Upewniamy się, że jesteśmy zalogowani na konsoli jako root i wydajemy polecenie:

# /etc/rc.d/init.d/mysql init

Polecenie to będzie nam potrzebne tylko przy pierwszym uruchomieniu serwera - służy ono zainicjalizowaniu klastra baz danych. Powiedzmy, że nasz katalog jest "formatowany", ok? ;) Jeżeli pojawiłby wam się błąd, mówiący o duplikacie wpisu localhost-mysql dla klucza 1 - możecie go zignorować.j

Teraz możemy przystąpić już do edycji właściwiego pliku konfiguracyjnego RDBMS. Używając naszego ulubionego edytora otwieramy plik /var/lib/mysql/mysqld.conf

# vim /var/lib/mysql/mysqld.conf

Teraz możemy przystąpić do jego edycji. Pierwszą grupą opcji, na jaką trafiamy jest:

# This section must be the first!
[mysqld]
datadir     = /var/lib/mysql/mysqldb/db
pid-file    = /var/lib/mysql/mysqldb/mysql.pid
port        = 3306
socket      = /var/lib/mysql/mysqldb/mysql.sock
user        = mysql

datadir to oczywiście katalog, w którym składowane będą nasze bazy. Można zostawić tak jak jest.

user to użytkownik "pod którym" będzie działał nasz serwer, w sensie - uruchomienie serwera wygląda tak, jakby to ten użytkownik, reprezentowany przez zmienną user go uruchomił (proces należy do niego). Można zmienić, chociaż nie polecam. Nie zalecane jest wykorzystanie do tego użytkownika root!

To co nas natomiast bardzo interesuje, z dwóch względów, to opcja port. Chodzi o dwa przypadki:

  • Chcemy umożliwić dostęp do naszego serwera baz danych z zewnątrz, a admin naszej sieci "łaskawie" przekierował nam jakiś port z bramki na nasz komputer, ale niestety nie jest to port 3306, z którego standardowo korzysta MySQL. Edytujemy sobie opcje port w ten sposób, żeby wskazywała na ten, który mamy dostępny.

  • Mamy maszynę z zewnętrznym IP (taką, do której można się podłączyć z Internetu), nie blokowaliśmy jednak dostępu do MySQL, ale chcielibyśmy podnieść choć troszeczkę poziom bezpieczeństwa i udostępnić serwer MySQL na innym porcie. Wybieramy i jakiś i wpisujemy go jako wartość opcji port.

# Don't allow connections over the network by default
skip-networking	

Jeżeli chcemy zablokować dostęp do serwera MySQL z zewnątrz (z sieci), to... nie robimy nic. A jeśli chcemy umożliwić innym komputerom łączenie się z naszym serwerem, to należy wykomentować (dodać #) linijkę z skip-networking.

Gdyby nam się kiedyś coś popsuło (zapomnieliśmy hasła, nie możemy dostać się do bazy), to przyda się odkomentowanie tej opcji:

# Emergency option. Use only if you really need this.
#skip-grant-tables

Przydatną rzeczą (ale w sumie tylko, jeśli zamierzamy udostępniać bazy na zewnątrz), będzie włączenie logowania połączeń i zapytań (zwalnia pracę serwera). Dodam, że można oczywiście zmienić standardową ścieżkę, do której zapisywane są logi.

# Log connections and queries. It slows down MySQL so 
# it's disabled by default
# log        = /var/log/mysql/log

Opcje z grupy set-variable wpływają bezpośrednio na pracę i wydajność serwera, nie będę się więc w nie zagłębiał. To trochę trudniejszy temat. Jak ktoś chce bardzo zoptymalizować pracę swojego serwera, to polecam lekturę dokumentacji MySQL. Przydatna jest również znajomość zagadnień relacyjnych baz danych i SQL'a. Przykładowo zerkniemy na jedną zmienną:

#set-variable = max_connections=100

Odkomentowanie tej linijki pozwoli nam na ustawienie maksymalnej liczby połączeń, które nasz MySQL będzie mógł przyjąć i obsłużyć w danej chwili. Wszystko zależy od tego, w jakim celu używamy naszego RDBMS - należy postawić sobie pytanie - "ile osób może chcieć podłączyć się do mojego serwera w jednej chwili i ile takich połączeń przypada średnio na jedną osobę?". Odpowiedź wpisujemy w zmienną max_connections. Innym pytaniem mogłoby być "czy skrypty obsługujące moje strony www korzystają ze stałych (persistent) połączeń?"

Ponieważ "Polacy nie gęsi i swój język mają" odkomentujemy jeszcze jedną linijkę w pliku konfiguracyjnym, aby włączyć polskie komunikaty:

# Language
language   = polish

W tej chwili nasz serwer powinien być już skonfigurowany do pracy. Upewniamy się, że jesteśmy zalogowani na konsoli jako root i wydajemy polecenie:

# /etc/rc.d/init.d/mysql start

Wywołanie tego skryptu startowego spowoduje uruchomienie demona MySQL w systemie. Upewnijmy się jeszcze, że nasz serwer baz danych rzeczywiście "wstał":

# /etc/rc.d/init.d/mysql status
MySQL cluster /var/lib/mysql: running

Jak widać na załączonym obrazku serwer działa. Ponieważ w tej chwili jest zainstalowany w sposób domyślny i dlatego mało bezpieczny, należy ustawić jakieś hasło dla użytkownika mysql:

# mysqladmin -u mysql -S /var/lib/mysql/mysqldb/mysql.sock password 'naszehaslo'

Po opcji -S podajemy scieżkę do pliku mysql.sock, który powinien znajdować się w katalogu, w którym umieściliśmy MySQL.

Demon MySQL

Demon MySQL standardowo startuje wraz z systemem, ale przydaje się znać dwie komendy. Aby włączyć lub wyłączyć serwer, będąc zalogowanym jako root, bądź używając komendy sudo, wydajemy polecenie:

# /etc/rc.d/init.d/mysql start | stop

wstawiając oczywiście opcje start lub stop, w zależności od tego, co chcemy zrobić.

mysqladmin

mysqladmin jest narzędziem, za pomocą którego możemy tworzyć i usuwać bazy oraz przeładowywać konfigurację. Nie będziemy go używać do wyłączania serwera, bo od tego jest skrypt omówiony powyżej. Narzędzie wywołuje się poleceniem mysqladmin, a flagi i argumenty (opcje) polecenia służą do wykonywania określonych zadań. Ponieważ wcześniej zmieniliśmy hasło dla użytkownika mysql, winniśmy przy każdym poleceniu dodać -u mysql i -p na końcu (aby klient zapytał nas o hasło), np tak dla komendy status:

# mysqladmin -u mysql status -p
Enter password:
Uptime: 6720  Threads: 1  Questions: 1  Slow queries: 0  Opens: 6 \
Flush tables: 1 Open tables: 0  Queries per second avg: 0.000

Kilka przydatnych komend:

  • create nazwabazy - tworzy nową bazę danych o nazwie nazwabazy.

  • drop nazwabazy - usuwa bazę danych o nazwie nazwabazy

  • flush-privileges albo reload - obie opcje robią to samo - przeładowują tablice uprawnień. Powinniśmy wykonać przeładowanie zawsze, gdy dodamy np nowego użytkownika do jakiejś bazy, ponieważ do czasu przeładowania takie konto jest nieaktywne.

mysqldump

mysqldump to program, służący do "zrzucania" danych - czyli do robienia kopii zapasowych. Polecenie to jest przydatne w przypadku wykonywania kopii zapasowych podczas aktualizacji MySQL czy też przenoszenia danych na inny serwer.

Kilka przydatnych opcji:

  • --databases baza1 baza2... - zrzuca dane z baz, których nazwy podaliśmy w liście oddzielonymi spacjami.

  • --all-databases - to samo co wyżej ale dla wszystkich bazy.

  • --add-drop-table - dodaje DROP TABLE do skryptów tworzących tabele z backup-u (jak będziemy przywracać dane). Przydatne, kiedy np chcemy przywrócić już istniejącą tabelę. Spowoduje to najpierw jej usunięcie, a następnie utworzenie od nowa z danych, które mieliśmy w kopii zapasowej. Ogólnie, żeby uniknąć ewentualnych problemów z duplikatami wierszy, itp. warto tą opcję włączyć.

  • --no-create-info - w kopii nie zostanie zawarta informacja o tworzeniu tabel (nazwy tabel, typy pól, indeksy itp.). Przydatne, jeżeli chcemy zrobić kopię tylko danych, a nie całej struktury bazy.

  • --no-data - Ta opcja pozwala zapisać samą informację o strukturze bazy i tabel, nie zapisuje natomiast danych.

  • --opt nazwabazy - tworzy kopię bazy nazwabazy wraz z rozszerzonymi informacjami MySQL, blokowaniem tabel, itd. Chyba najczęściej stosowana opcja przy robieniu kopii zapasowych.

Należy pamiętać, że wynik polecenia mysqldump należy przekierować (>) do jakiegoś pliku. Podam może kilka przykładów użycia tego programu. Zrzucenie zawartości bazy baza1 do pliku baza1_bkp.sql:

# mysqldump -u mysql --databases baza1 > baza1_bkp.sql -p

Stworzenie kopii zapasowej struktury bazy (bez danych) baza2 i zapisanie jej w pliku baza2_str.sql:

# mysqldump -u mysql --databases --no-data baza2 > baza2_str.sql -p

Niezwykle przydatną opcją jest --opt omówiona wcześniej. Polecam jej stosowanie do wykonywania kopii całej bazy, włącznie ze strukturą tabel i samymi danymi. Aby stworzyć pełną kopię zapasową bazy baza1 i zapisać ją w pliku baza1_kopia.sql:

# mysqldump -u mysql --opt baza1 > baza1_kopia.sql -p

Przywracanie baz wykonanych poleceniem mysqldump wygląda tak:

# mysql -u mysql baza1 < baza1_kopia.sql -p

Inna metoda (w sumie różniąca się zapisem):

# mysql -u mysql -e 'source /sciezka_do_pliku/baza1_kopia.sql' baza1 -p

phpMyAdmin

TODO

 
&lt;- ->