|
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
|
|