Wprowadzenie do systemu zarządzania bazą danych MySQL
1.
Rozpoczynamy pracę z MySQL
Wprowadzenie
MySQL jest jednym z najpopularniejszych serwerów baz danych. Do komunikacji z
innymi programami używa standardowego języku zapytań (SQL) wraz z własnymi
rozszerzonymi jego funkcjami. W tym tekście omówiona zostanie wstępna instalacja
serwera MySQL, tworzenie baz danych i tabel oraz dodawanie nowych użytkowników
bazy. Zacznijmy od wstępnej instalacji.
Instalacja MySQL
Po pierwsze należy się upewnić, że w systemie jest już zainstalowany serwer
MySQL. Jeżeli nie, należy wykonać prostą komendę:
Listing 1.1: Instalacja MySQL |
# emerge --pretend --verbose mysql
# emerge mysql
|
Po zakończonej instalacji zostanie wyświetlona następująca uwaga:
Listing 1.2: Informacja o konfiguracji serwera MySQL |
You might want to run:
"emerge --config =dev-db/mysql-[version]"
if this is a new install.
|
Zgodnie z zaleceniami należy wykonać powyższe polecenie, oczywiście tylko
wówczas, jeżeli przeprowadzamy instalację pierwszy raz.
Listing 1.3: Konfiguracja MySQL |
# emerge --config =dev-db/mysql-[version]
* MySQL DATADIR is /var/lib/mysql
* Press ENTER to create the mysql database and set proper
* permissions on it, or Control-C to abort now...
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, issue the following commands to start the server
and change the applicable passwords:
/etc/init.d/mysql start
/usr/bin/mysqladmin -u root -h pegasos password 'new-password'
/usr/bin/mysqladmin -u root password 'new-password'
Depending on your configuration, a -p option may be needed
in the last command. See the manual for more details.
* For security reasons you should set your MySQL root
* password as soon as possible.
|
Ważne:
Od wersji mysql-4.0.24-r2 hasła są wpisywane podczas fazy konfiguracji bazy, co
sprawia że konto root serwera bazy danych jest bezpieczniejsze.
|
Wciskając klawisz ENTER podczas konfiguracji bazy MySQL sprawiamy, że
uruchomiony zostaje proces, w którym tworzona jest główna baza MySQL i
wypełniana początkowymi danymi. Zawiera ona informacje o dostępnych bazach
danych, tabelach, użytkownikach, prawach dostępu i wiele innych ciekawych
informacji. Konfiguracja zaleca zmianę hasła użytkownika root tak szybko jak
to tylko możliwe. Zrobimy to teraz ponieważ w przeciwnym wypadku, ktoś może
zmienić naszą domyślną konfigurację serwera MySQL. Jesteśmy na etapie
konfiguracji, która umożliwia nam łatwe ustawienie tego hasła, zatem zróbmy to
teraz:
Listing 1.4: Ustawianie hasła dostępu do serwera MySQL dla użytkownika root |
# /etc/init.d/mysql start
* Re-caching dependency info (mtimes differ)...
* Starting mysqld (/etc/mysql/my.cnf) ...
* [ ok ]
$ /usr/bin/mysqladmin -u root -h localhost password 'nowe-hasło'
|
Możemy teraz sprawdzić czy hasło zostało poprawnie zapisane próbując zalogować
się do serwera MySQL:
Listing 1.5: Logowanie do serwera MySQL |
$ mysql -u root -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Argument -u to konto na którym chcemy pracować, argument -h to
komputer na którym pracuje nasz serwer baz danych. Zwykle będzie to
localhost, chyba że konfigurujemy serwer zdalnie. W końcu -p mówi,
że będziemy chcieli uwierzytelnić się za pomocą hasła. Powinniśmy ujrzeć teraz
zachętę mysql>. Jest to miejsce, gdzie będziemy wpisywali wszystkie
komendy. Teraz kiedy już jesteśmy zalogowani jako użytkownik root, możemy
rozpocząć konfigurację naszej bazy danych.
2.
Konfiguracja bazy danych
Tworzenie nowej bazy danych
Zacznijmy od obejrzenia wszystkich dostępnych baz danych jakie posiadamy. Aby
tego dokonać wydajemy polecenie SHOW DATABASES jak poniżej:
Listing 2.1: Wyświetlenie dostępnych baz danych |
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.09 sec)
|
Ważne:
Należy pamiętać, że komendy MySQL muszą być zakończone średnikiem!
|
Pomimo tego że baza danych test jest już utworzona, utworzymy sobie własną dla
bardziej kompletnego przewodnika. Tworzenie baz danych odbywa się za pomocą
polecenia CREATE DATABASE. Utwórzmy zatem bazę danych i nazwijmy ją
gentoo:
Listing 2.2: Tworzenie bazy danych |
mysql> CREATE DATABASE gentoo;
Query OK, 1 row affected (0.08 sec)
|
Odpowiedź serwera pozwala nam stwierdzić, że polecenie zostało wykonane
poprawnie. W tym przypadku jeden wiersz został zmodyfikowany. Jest to
odniesienie do głównej bazy danych "mysql", która przechowuje listę wszystkich
baz danych. Nie musimy się jednak martwić o szczegóły. Ostatnią liczbą jest czas
w jakim zapytanie do bazy zostało wykonane. Możemy teraz sprawdzić, że
faktycznie baza danych została utworzona wydając komendę SHOW DATABASES
po raz kolejny:
Listing 2.3: Sprawdzamy czy baza danych została utworzona |
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| gentoo |
| mysql |
| test |
+----------+
3 rows in set (0.00 sec)
|
Rzeczywiście nasza baza danych została utworzona. Teraz będziemy chcieli
utworzyć w naszej bazie tabelę, jednak zanim to uczynimy musimy wybrać bazę na
której będziemy pracowali. Aby tego dokonać używamy komendy USE.
Przyjmuje ona jako argument nazwę bazy danych na której chcemy pracować. Bazę
danych możemy także wybrać już przy łączeniu się z serwerem podając jej nazwę
po argumencie -D. Wybierzmy zatem teraz bazę którą utworzyliśmy przed
chwilą:
Listing 2.4: Wybór bazy danych |
mysql> USE gentoo;
Database changed
|
Aktualną bazą danych jest teraz ta, którą przed chwilą utworzyliśmy. Jeżeli już
została wybrana jako aktywna, możemy przejść do utworzenia w niej przykładowej
tabeli i wypełnienia jej informacjami.
3.
Praca z tabelami w MySQL
Tworzenie nowej tabeli
Strukturę MySQL tworzą: bazy danych, tabele, rekordy i pola. Bazy danych
zawierają tabele, tabele zawierają rekordy, rekordy zawierają pola, w których to
zapisane są informacje. Struktura ta pozwala użytkownikom uporządkowanie swoich
informacji. Do tej pory zajmowaliśmy się bazami danych, teraz przyszła
pora na pracę z tabelami. Po pierwsze, dostępne tabele możemy przeglądać
podobnie jak bazy danych, używając komendy SHOW TABLES. W tej chwili nie
ma żadnych tabel w naszej bazie gentoo:
Listing 3.1: Pusta baza gentoo |
mysql> SHOW TABLES;
Empty set (0.00 sec)
|
Stwórzmy więc przykładową tabelę. Aby tego dokonać, użyjemy komendy CREATE
TABLE Jednak komenda ta jest całkiem inna od prostego CREATE
DATABASE. Przyjmuje ona listę argumentów, którą musimy podać:
Listing 3.2: Składnia polecenia CREATE TABLE |
CREATE TABLE [nazwa_tabeli] ([nazwa_pola] [typ_pola]([rozmiar]));
|
nazwa_tabeli jest nazwą jaką chcemy nadać tworzonej tabeli. W tym przykładzie
nazwijmy ją developers. Tabela ta będzie zawierała imię i nazwisko
dewelopera, email i to czym się ma zajmować. Co z typami tych pól? Typ pola
zawiera informacje o tym jakie dane będą w nim przechowywane. Wszystkie dostępne
typy można znaleźć na tej stronie.
Dla naszych celów użyjemy typu danych VARCHAR dla wszystkich pól.
VARCHAR jest jednym z najprostszych typów danych, jeżeli chodzi o pracę z
łańcuchami znakowymi. Rozmiar oznacza ile takich typów danych stworzymy. W tym
przykładzie użyjemy pól o wielkości 128. Będzie to oznaczało, że możemy umieścić
w tym polu 128 typów danych VARCHAR. Można spokojnie uważać to pole
po prostu jako 128 znaków, chociaż istnieje bardziej techniczne wytłumaczenie,
dostępne na podanej wcześniej stronie. Teraz, kiedy już wiemy jak tworzyć
tabele, zróbmy to:
Listing 3.3: Tworzenie naszej tabeli |
mysql> CREATE TABLE developers ( name VARCHAR(128), email VARCHAR(128), job VARCHAR(128));
Query OK, 0 rows affected (0.11 sec)
|
Wygląda na to, że wszystko przebiegło poprawnie. Sprawdźmy zatem wynik komendy
SHOW TABLES:
Listing 3.4: Sprawdzamy czy nasza tabela została utworzona |
mysql> SHOW TABLES;
+------------------+
| Tables_in_gentoo |
+------------------+
| developers |
+------------------+
1 row in set (0.00 sec)
|
Tak, oto i nasza tabela. Jednak nie wygląda na to żeby pokazały się informacje
o typach pól jakie ustaliliśmy. Aby je uzyskać użyjemy komendy DESCRIBE,
która pobiera jako argument nazwę tabeli. Zobaczmy zatem co zwróci nam to
polecenie w odniesieniu do tabeli developers:
Listing 3.5: Opis tabeli developers |
mysql> DESCRIBE developers;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(128) | YES | | NULL | |
| email | varchar(128) | YES | | NULL | |
| job | varchar(128) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
|
Pokazała się nam tabela z polami oraz ich typami. Widzimy także kilka
dodatkowych atrybutów, które są jednak poza zasięgiem tego dokumentu. Ich opisy
są dostępne w dokumentacji MySQL. Mamy w tej chwili tabelę z którą możemy
pracować. Wprowadźmy zatem do niej przykładowe dane.
Umieszczanie informacji w bazie danych
Teraz kiedy już mamy własną tabelę, włóżmy do niej jakieś informacje. Służy do
tego polecenie INSERT. Tak jak CREATE TABLE, ono także ma
specyficzną formę:
Listing 3.6: Składnia polecenia INSERT |
INSERT INTO [nazwa_tabeli] VALUES('wartość1', 'wartość2', ...);
|
Komenda ta służy do dodawania rekordów do tabeli. nazwa_tabeli to po prostu
tabela MySQL, do której zamierzamy wprowadzić informacje. VALUES()
zawiera informacje, które chcemy umieścić w tabeli. W tym przypadku chcemy
dodać informacje do tabeli developers. Zatem dodajmy przykładowy rekord z
danymi 'Joe Smith', 'joesmith@gentoo.org', 'toolchain'. Postępujemy
następująco:
Listing 3.7: Umieszczanie danych w tabeli developers |
mysql> INSERT INTO developers VALUES('Joe Smith', 'joesmith@gentoo.org', 'toolchain');
Query OK, 1 row affected (0.06 sec)
|
Wygląda na to, że rekord został dodany poprawnie. Co jeśli byśmy chcieli dodać
więcej niż jeden rekord? Inną wygodną komendą jest LOAD DATA. Służy ona
do ładowania oddzielonych tabulacjami informacji z pliku. Spróbujmy zatem
stworzyć w naszym katalogu domowym plik z przykładowymi danymi. Nazwijmy go
records.txt. Na przykład:
Listing 3.8: ~/records.txt |
John Doe johndoe@gentoo.org portage
Chris White chriswhite@gentoo.org documentation
Sam Smith samsmith@gentoo.org amd64
|
Ważne:
Warto upewnić się z jakimi danymi ma się do czynienia! Używanie komendy LOAD
DATA może być bardzo niebezpieczne jeżeli nie jesteśmy pewni jaka jest zawartość
używanego pliku.
|
Komenda LOAD DATA posiada nieco przydługawą definicję, jednak my użyjemy
najprostszej jej formy:
Listing 3.9: Składnia polecenia LOAD DATA |
LOAD DATA LOCAL INFILE '/ścieżka/do/pliku' INTO TABLE tabela;
|
/ścieżka/do/pliku jest po prostu katalogiem i plikiem, którego
zamierzamy użyć. tabela jest nazwą tabeli. W naszym przypadku plikiem
jest ~/records.txt, a tabelą developers:
Listing 3.10: Wczytywanie informacji z pliku: |
mysql> LOAD DATA LOCAL INFILE '~/records.txt' INTO TABLE developers;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
|
Ważne:
Napotkawszy na jakieś dziwne zachowania komendy LOAD DATA, należy się
upewnić, że kolejne informacje oddzielone są tabulatorem! Jeżeli informacje
zostały wklejone do pliku z innego źródła, tabulacje mogły zostać zamienione na
znaki spacji.
|
Komenda ta jedynie umieszcza rekordy w tabeli i nie daje żadnej kontroli nad
serwerem MySQL. Wiele aplikacji internetowych używa skryptów sql do szybkiej i
prostej konfiguracji serwera MySQL. Jeżeli zechcemy użyć takiego skryptu,
będziemy musieli uruchomić MySQL w trybie wsadowym lub użyć polecenia
source. Oto przykład uruchamiania mysql w trybie wsadowym:
Listing 3.11: MySQL w trybie wsadowym |
$ mysql -u root -h localhost -p < plik_sql
|
Tak jak przy poleceniu LOAD DATA, tak i tutaj należy być pewnym co taki
skrypt zawiera. Użycie pliku nieznanego pochodzenia może spowodować
naruszenie ochrony bazy danych! Inną metodą załadowania takiego skryptu
jest użycie polecenia source. Uruchomi ono komendy zapisane w skrypcie z
poziomu trybu interaktywnego mysql. A oto i przykład użycia komendy
source:
Listing 3.12: Składnia polecenia source |
mysql> source plik_sql;
|
Jeżeli napotkamy na aplikację internetową oczekującą na uruchomienie pliku sql,
wtedy dwie powyższe komendy mogą zostać użyte. Mamy zatem wypełnioną naszą
tabelę. Jak teraz sprawdzić co zawierają nasze pola? Dokonamy tego przez
przeszukiwanie naszej tabeli za pomocą zapytań.
Przeglądanie tabel MySQL za pomocą zapytań
Zapytania są jedną z głównych możliwości jakie oferuje każda baza danych SQL. To
one pomagają nam interpretować informacje pochodzące z naszych tabel jako coś
przydatnego. Większość zapytań realizowana jest przez komendę SELECT.
Potrafi ona być bardzo skomplikowana, my jednak pokażemy w tym dokumencie tylko
trzy główne jej formy:
Listing 3.13: Składnia polecenia SELECT |
SELECT * FROM tabela;
SELECT * FROM tabela WHERE pole=wartość;
SELECT pole1,pole2,pole3 FROM tabela [WHERE pole=wartość];
|
Przyjrzyjmy się teraz pierwszej formie. Jest ona całkiem prosta i daje w wyniku
ogólny wgląd w tabelę. Zobaczmy zatem jakie dane zawiera nasza tabela do tej
pory:
Listing 3.14: Przeglądanie danych z tabeli |
mysql> SELECT * FROM developers;
+-------------+-----------------------+---------------+
| name | email | job |
+-------------+-----------------------+---------------+
| Joe Smith | joesmith@gentoo.org | toolchain |
| John Doe | johndoe@gentoo.org | portage |
| Chris White | chriswhite@gentoo.org | documentation |
| Sam Smith | samsmith@gentoo.org | amd64 |
+-------------+-----------------------+---------------+
4 rows in set (0.00 sec)
|
Widzimy tutaj zarówno dane wprowadzone za pomocą polecenia INSERT jak i
te wprowadzone poprzez LOAD DATA. A teraz, powiedzmy że chcemy zobaczyć
tylko rekord dewelopera o nazwisku Chris White. Możemy to zrobić używając
drugiej formy zapytania:
Listing 3.15: Wybieranie specyficznych rekordów przy pomocy polecenia SELECT |
mysql> SELECT * FROM developers WHERE name = 'Chris White';
+-------------+-----------------------+---------------+
| name | email | job |
+-------------+-----------------------+---------------+
| Chris White | chriswhite@gentoo.org | documentation |
+-------------+-----------------------+---------------+
1 row in set (0.08 sec)
|
Tak jak się spodziewaliśmy, wybrany przez nas deweloper został wyświetlony. A
teraz, powiedzmy że chcemy znać tylko zadania i adres email pewnej osoby, ale
nie potrzebne nam jej nazwisko. Użyjmy do tego zadania trzeciej formy polecenia
SELECT:
Listing 3.16: Wybieranie specyficznego rekordu i pól przy pomocy polecenia SELECT |
mysql> SELECT email,job FROM developers WHERE name = 'Chris White';
+-----------------------+---------------+
| email | job |
+-----------------------+---------------+
| chriswhite@gentoo.org | documentation |
+-----------------------+---------------+
1 row in set (0.04 sec)
|
Będąc zalogowanym w bazie MySQL jako użytkownik root, mamy nieograniczone prawa
do wszystkiego czego możemy sobie zażyczyć. W środowisku serwera, użytkownik z
takimi przywilejami może być nieco problematyczny. Aby kontrolować kto i co robi
z bazami danych przyznamy teraz odpowiednim użytkownikom odpowiednie przywileje.
4.
Przywileje MySQL
Przyznawanie uprawnień za pomocą polecenia GRANT
Uprawnienia określają jaki rodzaj dostępu do baz danych, tabel, itd. posiadają
użytkownicy MySQL. W tej chwili na przykład jedynym użytkownikiem mającym
dostęp do niedawno stworzonej bazy gentoo jest root. Stwórzmy teraz zatem
jeszcze dwóch użytkowników, guest oraz admin, którzy będą mieli dostęp do bazy
gentoo i informacji w niej zawartych. Sprawimy, że użytkownik guest będzie miał
bardzo ograniczone prawa, pozwolimy mu tylko i wyłącznie na pobieranie
informacji z bazy. admin będzie posiadał dokładnie takie same uprawnienia jak
root, jednak tylko w stosunku do bazy gentoo, nie będzie miał żadnej możliwości
ingerencji w inne bazy, a w szczególności w bazę mysql. Zanim rozpoczniemy,
przyjrzyjmy się bliżej nieco uproszczonej formie polecenia GRANT:
Listing 4.1: Składnia polecenia GRANT |
GRANT [przywilej] ON baza_danych.* TO '[użytkownik]'@'[host]' IDENTIFIED BY '[hasło]';
|
Uwaga:
Polecenie GRANT można uważać za polecenie służące do dodawania nowych
użytkowników do systemu MySQL. Pomimo że ostatnie wersje (od 5.0.2) posiadają
funkcje CREATE_USER, preferowane jest używanie polecenia GRANT.
|
Pierwszym argumentem jaki będziemy musieli podać są przywileje jakie chcemy
nadać użytkownikowi. Poniżej została podana lista możliwych do nadania
uprawnień uwzględniająca to czego się do tej pory nauczyliśmy:
-
ALL - Użytkownik otrzymuje wszystkie przywileje za wyjątkiem GRANT
OPTION
-
CREATE - Pozwala użytkownikowi na tworzenie tabel
-
SELECT - Pozwala na przeszukiwanie tabel
-
INSERT - Pozwala dodawać nowe informacje do tabel
-
SHOW DATABASES - Pozwala użytkownikowi na przeglądanie listy
dostępnych baz danych
-
USAGE - Służy do tworzenia użytkownika bez uprawnień
-
GRANT OPTION - Pozwala użytkownikowi nadawać uprawnienia.
Uwaga:
Jeżeli używamy serwera MySQL do wymiany informacji z aplikacją internetową,
wtedy: CREATE, SELECT, INSERT (kwestia dyskusyjna),
DELETE oraz UPDATE (patrz dokumentacja MySQL)
będą jedynymi uprawnieniami jakie będą potrzebne. Wielu ludzi popełnia
błąd nadając wszystkie uprawnienia użytkownikowi bazy, kiedy tak naprawdę nie
jest to potrzebne.
|
Zatem użytkownikowi admin nadamy uprawnienia ALL. Dla użytkownika guest
SELECT będzie wystarczające do dostępu tylko do odczytu. baza_danych jest
bazą danych do której chcemy, aby użytkownik miał uprawnienia. W naszym
przykładzie, gentoo będzie właśnie tą bazą. Kolejne dwa znaki .* oznaczają
wszystkie tabele w naszej bazie. Jeżeli zajdzie taka potrzeba można w miejsce *
zdefiniować dostęp tylko do określonych tabel w bazie. użytkownik jest nazwą
użytkownika, natomiast host to nazwa komputera z którego użytkownik będzie miał
dostęp. W większości przypadków będzie to po prostu localhost. Wreszcie hasło
jest hasłem jakim użytkownik będzie się musiał uwierzytelnić. Kiedy już
skończymy nadawanie uprawnień, będziemy musieli wykonać polecenie FLUSH
PRIVILEGES. Spowoduje ono aktualizację uprawnień bez konieczności ponownego
uruchomienia serwera MySQL. Wszystko mamy zaplanowane, przejdźmy zatem do
stworzenia nowych użytkowników:
Listing 4.2: Dodawanie użytkowników admin oraz guest |
mysql> GRANT ALL ON gentoo.* TO 'admin'@'localhost' IDENTIFIED BY 'hasło';
mysql> GRANT SELECT ON gentoo.* TO 'guest'@'localhost' IDENTIFIED BY 'hasło';
|
Teraz, kiedy nowi użytkownicy zostali dodani, przetestujmy ich konta. Opuśćmy
teraz konsolę MySQL wpisując quit w wierszu poleceń.
Listing 4.3: Opuszczanie MySQL |
mysql> quit
|
Jesteśmy teraz w konsoli systemu. Mając utworzonych nowych użytkowników
sprawdźmy do czego tak naprawdę mają dostęp.
Testowanie uprawnień użytkowników
Ponieważ wróciliśmy do konsoli systemowej, spróbujemy zalogować się teraz na
konto guest. W tej chwili, użytkownik guest powinien posiadać przywilej tylko do
polecenia SELECT. Sprowadza się to do możliwości przeszukiwania bazy i
niczego więcej. Zalogujmy się więc jako użytkownik guest:
Listing 4.4: Logowanie jako użytkownik guest |
$ mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Przetestujmy czy faktycznie nasz użytkownik ma nałożone odpowiednie restrykcje.
Najpierw przekażemy systemowi, że chcemy pracować na bazie gentoo:
Listing 4.5: Przełączamy się na bazę gentoo |
mysql> USE gentoo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
|
Sprawdzimy teraz coś do czego nie powinniśmy mieć uprawnień. Spróbujemy
stworzyć tabelę:
Listing 4.6: Próba stworzenia tabeli przez użytkownika guest |
mysql> CREATE TABLE test (test VARCHAR(20), foobar VARCHAR(2));
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'
|
Polecenie zakończyło się niepowodzeniem, ponieważ użytkownik nie posiada
odpowiednich uprawnień. Jak pamiętamy, nadaliśmy użytkownikowi guest prawo do
polecenia SELECT. Sprawdźmy je teraz:
Listing 4.7: Próba wykonania polecenia SELECT |
mysql> SELECT * FROM developers;
+-------------+-----------------------+---------------+
| name | email | job |
+-------------+-----------------------+---------------+
| Joe Smith | joesmith@gentoo.org | toolchain |
| John Doe | johndoe@gentoo.org | portage |
| Chris White | chriswhite@gentoo.org | documentation |
| Sam Smith | samsmith@gentoo.org | amd64 |
+-------------+-----------------------+---------------+
4 rows in set (0.01 sec)
|
Zgodnie z oczekiwaniami polecenie zostało wykonane poprawnie. Oprócz konta
guest, stworzyliśmy także konto admin. Stworzyliśmy je, aby pokazać, że nawet
konto z przywilejem ALL ciągle posiada swoje ograniczenia. Opuśćmy zatem konsolę
MySQL i zalogujmy się jako użytkownik admin:
Listing 4.8: Logowanie jako użytkownik admin |
mysql> quit
Bye
$ mysql -u admin -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Na początku spróbujemy stworzyć nową bazę danych. Nasz użytkownik, admin,
posiada bardzo podobne uprawnienia do konta root, zatem może wykonywać dowolne
zmiany w bazie gentoo. Pamiętamy jednak, że nadaliśmy użytkownikowi admin
uprawnienia tylko do jednej konkretnej bazy. Sprawdźmy zatem czy tak jest w
rzeczywistości:
Listing 4.9: Próba stworzenia nowej bazy danych |
mysql> CREATE DATABASE gentoo2;
ERROR 1044: Access denied for user: 'admin@localhost' to database 'gentoo2'
|
Rzeczywiście, użytkownik admin nie może tworzyć nowych baz danych, pomimo tylu
uprawnień w bazie gentoo. Jednak możemy ciągle użyć konta admin do modyfikacji
bazy gentoo, jak zostało to pokazane na poniższym przykładzie:
Listing 4.10: Uprawnienia konta admin w bazie gentoo |
mysql> USE gentoo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO developers VALUES('Bob Simmons', 'bobsimmons@gentoo.org', 'python');
Query OK, 1 row affected (0.08 sec)
|
Istotnie użytkownik admin może swobodnie modyfikować bazę gentoo, jeśli tylko
zechce. Czasami zachodzi potrzeba odebrania użytkownikom uprawnień, powodem może
być zarówno problematyczny użytkownik jak i pracownik na emeryturze. Zobaczmy
jak można odbierać uprawnienia za pomocą polecenia REVOKE.
Odbieranie uprawnień za pomocą komendy REVOKE
Komenda REVOKE pozwala na odbieranie uprawnień użytkownikom. Możliwe jest
zarówno odebranie jakiegoś konkretnego uprawnienia, jak i wszystkich możliwych.
Składnia polecenia REVOKE jest bardzo podobna do polecenia GRANT:
Listing 4.11: Składnia polecenia REVOKE |
REVOKE [przywilej] ON baza_danych.* FROM '[użytkownik]'@'[host]';
|
Argumenty tego polecenia zostały już omówione w sekcji dotyczącej polecenia
GRANT. Tutaj natomiast zostanie przedstawiony proces odbierania
wszystkich uprawnień. Powiedzmy, że dowiadujemy się o pewnych nadużyciach
związanych z bezpieczeństwem ze strony użytkownika guest. Decydujemy się na
odebranie mu wszystkich uprawnień.
Listing 4.12: Odbieranie przywilejów |
mysql> REVOKE ALL ON gentoo.* FROM 'guest'@'localhost';
Query OK, 0 rows affected (0.00 sec)
|
Uwaga:
W tym przypadku przywileje użytkownika nie są szerokie, a zatem ich odbieranie
nie jest skomplikowane. W przypadku użytkowników mających dostęp do większej
ilości baz należy użyć *.* zamiast gentoo.* w celu odebrania dostępu do
wszystkich baz.
|
Opuścimy teraz konto root i zalogujemy się jako guest:
Listing 4.13: Próba zalogowania się jako użytkownik guest |
$ mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9 to server version: 4.0.24-debug
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Jak się okazuje, użytkownik dalej jest w stanie zalogować się do
systemu. Jednak jego prawa dostępu do bazy gentoo już nie istnieją:
Listing 4.14: Odmowa dostępu do bazy gentoo |
mysql> USE gentoo;
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'
|
W ten sposób użytkownik sprawiający problemy nie ma już dostępu do bazy gentoo.
Należy jednak zauważyć, że ciągle jest on w stanie zalogować się do serwera baz
danych. Dzieje się tak, ponieważ pozostaje on ciągle wpisany do głównej
bazy MySQL. Zobaczymy teraz jak można całkowicie usunąć konto użytkownika z
systemu za pomocą polecenia DELETE oraz głównej tabeli MySQL.
Całkowite usuwanie kont za pomocą polecenia DELETE i tabeli user głównej bazy MySQL.
Tabela user głównej bazy MySQL zawiera listę wszystkich użytkowników systemu
oraz informacje o nich. Upewniamy się, że jesteśmy zalogowani jako root, a
następnie przystępujemy do pracy z główną bazą.
Listing 4.15: Przełączanie na główną bazę mysql |
mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
|
Zobaczmy jakie tabele zawiera baza mysql:
Listing 4.16: Lista tabel bazy mysql |
mysql> SHOW TABLES;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-----------------+
6 rows in set (0.00 sec)
|
Tabela user jest tą o którą nam chodziło. Jednak zawiera ona 30 różnych pól, co
czyni ją trudną w przeglądaniu. Do wyświetlenia danych z tej tabeli w
przystępnej i czytelnej formie posłuży tutaj trzecia forma polecenia
SELECT. Pola które chcielibyśmy zobaczyć to Host oraz User.
Listing 4.17: Wybieranie użytkownika guest z tabeli user |
mysql> SELECT Host,User FROM user WHERE User = 'guest';
+-----------+-------+
| Host | User |
+-----------+-------+
| localhost | guest |
+-----------+-------+
1 row in set (0.00 sec)
|
Po odnalezieniu użytkownika, można w końcu usunąć go całkowicie z systemu. Służy
do tego polecenie DELETE, którego składnia przedstawiona została poniżej:
Listing 4.18: Składnia polecenia DELETE |
DELETE FROM tabela WHERE pole='wartość';
|
Można zauważyć, że składnia polecenia DELETE jest niejako podobna do
polecenia SELECT. W tym przypadku pole będzie równe User natomiast
wartość guest. Tak skonstruowane polecenie usunie z tabeli rekord, w którym pole
User jest równe guest, usuwając w ten sposób definitywnie konto guest z systemu:
Listing 4.19: Usuwanie konta guest |
mysql> DELETE FROM user WHERE User='guest';
Query OK, 1 row affected (0.07 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
|
Można teraz sprawdzić czy zmiany odniosły oczekiwany skutek poprzez próbę
zalogowania się jako użytkownik guest:
Listing 4.20: Próba zalogowania się na konto użytkownika guest |
mysql> quit
Bye
$ mysql -u guest -h localhost -p
Enter password:
ERROR 1045: Access denied for user: 'guest@localhost' (Using password: YES)
|
Użytkownik został całkowicie usunięty z bazy!
Podsumowanie
Chociaż przewodnik ten był nastawiony na konfigurację MySQL z linii komend,
istnieje kilka alternatyw z interfejsem graficznym:
-
phpMyAdmin -
Popularne narzędzie do administrowania serwerem MySQL zbudowane w
technologii php
-
mysqlnavigator
Kolejny interfejs internetowy do administracji serwerem MySQL
-
gmyclient - Klient
MySQL oparty o środowisko GNOME
-
knoda - Klient MySQL oparty o
środowisko KDE.
W ten sposób dotarliśmy do końca tego krótkiego wprowadzenia do MySQL. Mam
nadzieję, że było ono pomocne w zrozumieniu jednego z najpopularniejszych dziś
serwerów baz danych. Jeżeli masz jakiekolwiek uwagi na temat tego dokumentu nie
wahaj się napisać do mnie.
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|