Baza danych plus PHP (oparte na serwerze www np. Apache) to narzędzia
umożliwiające zbieranie i przetwarzanie danych. Na dzień dzisiejszy mamy wersje programów zarówno na Windows, jak i Linuksa oraz (co oczywiste) na Uniksy.
Pod Windows problemem (dla nowicjuszy) może być konfiguracja poszczególnych programów (MySQL, Apache z modułem PHP), by ładnie współpracowały. Rozwiązaniem wydaje się być projekt KRASNAL, zawierający instalkę z już skonfigurowanymi programami. Działa na starym Win9x, WinNT i najnowszym Windows. Najmniej stabilnie pracuje na Win9x.
Uwaga: komputer na którym instalujesz MySQL musi posiadać kartę sieciową (lub modem łączący z Internetem), by na niej mógł pracować odpowiednio skonfigurowany interfejs sieciowy. Komputery pracujące w sieci (zarówno od dostawcy Internetu jak i pracujące w domowej sieci) mają automatycznie (np. poprzez DHCP) ustawione parametry typu:
adres IP, maskę sieci, nazwę komputera itd. Wówczas nie powinniśmy mieć problemów z pracą MySQL. Gorzej, gdy mamy komputer odłączony od sieci (karta sieciowa jest wówczas w komputerze niezbędna i trzeba "na sucho" ustawić interfejs sieciowy).
Rozwiązanie problemu na przykładzie Win98SE umieściłem w
tej notatce.
Problem dotyczy też Linuksa - wówczas trzeba utworzyć nowy interfejs sieciowy z wymyślonym, fikcyjnym adresem na eth0 (karta sieciowa).
Adres IP: 192.168.000.002, Maska 255.255.255.000, Broadcast 192.168.000.255, ewentualna Brama: 192.168.000.001 (w Mandrake/Mandriva pomoże nam w tym druid
drakgw, czyli "UTWÓRZ NOWY INTERFEJS SIECIOWY").
*
Niniejszy artykuł pisałem opierając się na Linuksie
Mandrake
10.1 (obecnie Mandriva), co nie powinno mieć większego znaczenia, gdyż
MySQL można instalować na każdym systemie operacyjnym: Windows,
Linux, Unix. Przyjąłem, że dane wpisujemy i odczytujemy
pracując na kliencie
MySQL (wydając odpowiednie polecenia w
powłoce tekstowej).
Klient i serwer są na tym samym komputerze (to ważne), czyli logujemy się na klienta
MySQL klepiąc po klawiaturze podłączonej do serwera (ew. łączymy się
tunelem ssh).
Odradzam
jednoczesną naukę
PHP i
MySQL. Polecam w pierwszej
kolejności zaznajomić się z teorią baz danych (tu MySQL).
Uwaga: user root używany do obsługi serwera MySQL
nie ma nic wspólnego z systemowym userem root poznanym
podczas prac na Linuksie - ma inne hasło i inne zadania. Zbieżność
nazw (moim zdaniem niezbyt udana) jest związana z określeniem usera
o najwyższych prawach dostępu. Na niniejszej stronie mamy więc do
czynienia z systemowym userem root oraz z userem root
od MySQL.
Zwróć uwagę na plik z historią poleceń .mysql_history ,
który jest umieszczony w katalogu domowym usera, czyli np.
/home/antek lub /root . Może tam znaleźć się hasło jako pozostałość
po logowaniu.
Średnik ; kończący wpis oznacza (w MySQL) koniec
polecenia i jest bardzo ważnym elementem! Bez niego zlecenie nie zadziała. Uwaga na znaczek ' (na klawiszu ze
znakiem cudzysłowia).
W Linuksie Mandrake/Mandriva serwer MySQL uruchamiamy
odwołując się do skryptu startowego:
/etc/rc.d/init.d/mysqld (z parametrami np. start, stop, restart).
Klienta uruchamiamy poprzez plik /etc/rc.d/init.d/mysql (dodając parametry np. -u
-p -h). Do tematu powrócę poniżej.
*
Uruchomienie serwera MySQL
Podczas instalacji Linuksa Mandrake/Mandriva wybierz
serwer MySQL
(zostaną automatycznie dodane inne pakiety np.
klient
mysql). Przyjmuję, że interfejsy sieciowe na komputerze są skonfigurowane (patrz notatka na początku tej strony). Zaloguj się w systemie jako
systemowy user
root i uruchom serwer
MySQL zleceniem:
/etc/rc.d/init.d/mysqld start (lub
stop, restart) (wciśnij klawisz ENTER)
Uwaga: serwer MySQL można automatycznie włączać podczas startu
systemu zaznaczając właściwą opcję po wydaniu zlecenia: drakxservices. Więcej o autostarcie tutaj.
*
Uruchomienie klienta MySQL
(na tym samym komputerze co zainstalowano serwer MySQL)
Jako
systemowy zwykły user (nie systemowy root!) np.
antek wykonaj zlecenie:
mysql (wciśnij klawisz
ENTER)
lub jeżeli nie wyjdzie, to:
cd /etc/rc.d/init.d/ (wciśnij
klawisz ENTER)
mysql (wciśnij klawisz
ENTER)
Powyższe uruchomienie klienta MySQL uda się wyłącznie,
gdy user root MySQL nie ma jeszcze ustawionego hasła, a tak
jest np. tuż po zakończeniu instalacji systemu. Zdołałeś zalogować
się do serwera MySQL. Wylistuj dostępne bazy danych (powinno
być ich kilka) zleceniem:
mysql>show databases; (wciśnij klawisz ENTER)
Zwróć uwagę na średnik na końcu zlecenia!
Jeżeli zobaczyłeś prostą tabelkę, to znaczy, że możesz zacząć
naukę baz danych MySQL.
Pracę klienta MySQL zakończysz zleceniem exit.
Jeżeli zalogujesz się do serwera MySQL, to przez cały czas prac
z lewej strony będzie widoczny napis mysql - stąd na
niniejszej stronie umieściłem przed każdym zleceniem wpis mysql>
*
Przyjmuję, że serwer
MySQL automatycznie włącza się po
starcie systemu. Działasz na jednym komputerze jako
systemowy user np. antek.
Ze względów bezpieczeństwa w pierwszej kolejności ustaw userowi
root (tego od MySQL) jakieś hasło. Wykonaj:
cd /etc/rc.d/init.d/ ENTER
mysql ENTER
Jesteś zalogowany jako root (ten od MySQL). Ustaw
hasło rootowi (temu od MySQL) zleceniem:
mysql>set password
= password ('jakieshaselko'); ENTER
Uwaga na średnik ; na końcu zlecenia. Ważne jest położenie (lub brak) spacji w zleceniu. Znaczek ' znajdziesz na klawiszu ze znakiem cudzysłowia.
Wyloguj się zleceniem exit ENTER
Zaloguj się na nowo, ale tym razem rozbudowanym
zleceniem:
mysql -u root -p (ENTER i podaj hasło roota od MySQL)
Nie wolno wpisywać hasła bezpośrednio w polecenie!!! np. mysql -u root -p hasło; , gdyż zostanie odnotowane w pliku ~/mysql_history i będzie można je wykraść.
Uwaga: W niektórych dystrybucjach Linuksa w pliku ~/mysql_history zostanie odnotowane hasło nawet po prawidłowo wykonanym logowaniu: mysql -u root -p (ENTER i podaj hasło roota od MySQL). Trzeba więc byc uważnym i kasować zawartość pliku z historią (skryptem lub ręcznie).
Gdy znasz nazwę bazy danych nad którą będziesz pracować, to
możesz od razu zalogować się i wskazać domyślną bazę danych:
mysql -u root -p nazwabazydanych (ENTER i podaj hasło roota)
Zwróć uwagę, że na końcu zlecenia nie ma średnika ;
Uwaga: jeżeli podczas logowania nie podasz
domyślnej bazy danych,
to zrób to po zalogowaniu zleceniem:
mysql>use
nazwabazydanych; ENTER
Uwaga na średnik ; na końcu zlecenia.
W zależności od konfiguracji serwera MySQL czasami będziesz musiał podczas logowania podać adres
hosta (komputera). Wypróbuj poniższe zlecenia. Zwróć uwagę, że na końcu zlecenia nie ma średnika. "kaziu" to user MySQL.
mysql -u kaziu -p -h localhost ENTER
lub
mysql -u kaziu -p -h 127.0.0.1 ENTER
lub
mysql -u kaziu -p -h 192.168.1.1 ENTER
lub adres IP i nr portu (tu 3306):
mysql -u kaziu -p -h 217.96.171.101:3306 ENTER
W ostateczności wypróbuj zlecenie:
mysql kaziu@localhost -p ENTER
Parametr -u oznacza, że po
spacji podamy nazwę usera (np. root), parametr -p oznacza, że user ma hasło, -h
oznacza, że po spacji podamy adres (lub nazwę) hosta. Wylogujesz
się zleceniem exit
Stosuj zasadę, że uruchamiasz klienta mysql z komputera na którym działa serwer mysqld.
Jeżeli musisz to zrobić z odległego komputera, to uruchom szyfrowany tunel ssh i po przejęciu shella zwykłego usera odpal na linuksowym serwerze klienta mysql. Osobiście próbowałem zdjąć zabezpieczenia w moim Mandrake/Mandriva i logować się na serwer MySQL z klienta w domowej sieci. Dotarłem do odpowiednich opcji w konfigu MySQL, udostępniłem na firewallu. Straciłem kilka dni i nic. Po prostu Mandrake/Mandriva ma szereg dodatkowych zabezpieczeń (co jest dobre na wypadek włamu), których nie publikuje w darmowych poradach. Z drugiej strony może i dobrze, że są zabezpieczenia. Przecież MySQL to jedynie silnik bazodanowy. Do wprowadzania danych lub wyprowadzania kwerend należy używać narzędzi typu php.
*
Baza danych zbudowana jest z nazwy oraz tabelek, stąd w pierwszej
kolejności utworzymy nazwę dla naszej bazy danych, a dopiero potem
tabelki podporządkowane tylko tej bazie danych. Pamiętaj, by w
nazwach baz danych (i tabelkach) nie wprowadzać polskich liter typu
śćźżąóń oraz spacji (zamiast niej można dać dolną
kreskę _ ). Zwróć uwagę na średnik ; na końcu zlecenia. Jesteś zalogowany jako root (ten od MySQL).
Wylistuj bazy danych (ich nazwy) zleceniem:
mysql>show
databases; ENTER
Dodaj nową nazwę bazy danych (utwórz nową bazę
danych) zleceniem:
mysql>create database nazwabazydanych; ENTER
Wylistuj ponownie bazy danych, a następnie usuń
bazę danych zleceniem:
mysql>drop database nazwabazydanych; ENTER
*
Uwaga: bazy danych oraz tabelki wykonuj pod
rootem (tym od MySQL). Dopiero na koniec prac utwórz zwykłego
usera (tego od MySQL), nadaj mu hasło, odpowiednie prawa (np. do
zapisu, odczytu itd.) - opis tworzenia usera jest
poniżej. Od tego momentu (czyli wprowadzania danych i
zwykłej pracy w bazie danych) nie należy używać roota (tego od
MySQL), działając wyłącznie pod
zwykłym userem (tym od MySQL).
*
Będąc zalogowanym jako zwykły
systemowy user np.
antek
zaloguj się jako jako root (ten od MySQL) do
serwera MySQL - opis powyżej. Następnie wykonaj zlecenia (zwróć uwagę na średnik ; na końcu zleceń):
mysql>create database klienci; ENTER
mysql>use
klienci; ENTER
Utwórz tabelkę nazwiska w bazie danych klienci
jednym zleceniem:
mysql>create
table nazwiska ( ENTER
mysql>id int not
null auto_increment, ENTER
mysql>opis
text, ENTER
mysql>name
varchar(25), ENTER
mysql>primary
key(id)); ENTER
Zwróć uwagę na ustawienie nawiasów (), przecinków , oraz położenie spacji.
Została utworzona w bazie danych klienci tabela
nazwiska, a w niej trzy kolumny: numeracja id
rekordów (z opcjami: int - o tym za chwilę, not null
czyli "nigdy puste", auto_increment czyli utomatycznie
nadawana numeracja +1), opis (z ustawionym typem danych
text), name (z ustawionym typem danych varchar 25
znaków). Klucz ustawiono na kolumnę id.
Zobacz, czy tabelka istnieje zleceniem:
mysql>show
tables; ENTER
Wyświetl strukturę (czyli kolumny) tabeli nazwiska:
mysql>describe nazwiska; ENTER
Zlecenie select wyświetla dane. Na razie mamy nową, pustą tabelę, więc nie ma w niej danych.
Usuń tabelkę nazwiska zleceniem:
mysql>drop
table nazwiska; ENTER
*
Trochę teorii o bazach danych i
tabelkach
Tabelki możemy teoretycznie budować w sposób dowolny, zaznaczając
jedynie, by wpisy były widziane jako literki-cyferki (do tekstu)
lub liczby (do późniejszych działań matematycznych). Oczywiście
zawsze musi być kolumna z numeracją rekordów, czyli
id (nie
mylić z numerem kolejnym, ale o tym później). Ten bardzo prosty
schemat ma jedną poważną wadę: mała informacja zajmie dużo miejsca.
Dlaczego? Ano, każda komórka w danym rekordzie ma
zaplanowaną
przestrzeń (maksymalną ilość możliwych do wpisania liter-cyfr).
Jeżeli wielkość maksymalna wynosi np. 65538 znaków, to prosty wpis
np.
Alicja zamiast 6 znaków zajmie 65538 znaków. Jeżeli
natomiast zaplanujemy komórkę o typie danych np. 30 znaków, to
marnotrawstwo będzie znikome. Minusem ograniczania ilości znaków
jest odmowa wpisu danych przekraczających wielkość zaplanowaną,
stąd koniecznym będzie zaznajomienie się z poniższymi tabelkami
typów danych. Nie polecam kucia na pamięć, ale wpis do notatnika
lub wydruk by się przydał.
LICZBY CAŁKOWITE
LICZBY ZMIENNOPRZECINKOWE
DATA I CZAS
TEKST
OPCJE DOTYCZĄCE W/W TYPÓW DANYCH
TYP
|
ZAKRES WARTOŚCI
|
| auto_increment |
Autonumeracja +1 |
| binary |
Parametr binary wskazuje, że wpisy są traktowane
jako wartości binarne i uwzględniona zostanie wielkość znaków
(w innych typach wielkość znaków w polach tekstowych jest domyślnie ignorowana). |
| default wartosc |
Określa wartość domyślną narzuconą przez
programistę. Przykładem ustandaryzowanej wartości domyślnej
jest np. opcja not null czyli "nigdy puste". |
| not null |
Określa, czy baza danych ma zaakceptować brak
wpisu. W przypadku nie podania wartości not null, MySQL
automatycznie zaakceptuje wpis o wartości null (nic). |
| primary key |
Bardzo ważny parametr określający kolumnę, która
ma zawierać unikalny klucz (w praktyce najczęściej jest to nr
id) |
| zerofill |
Parametr zmuszający bazę danych do
automatycznego uzupełniania pola liczbowego zerami do (określonej w
innym parametrze) długości tego pola np. 0000021 |
*
Modyfikacje struktury tabel
ZMIANA NAZWY TABELI
Będąc zalogowanym jako root (ten od MySQL) ustaw domyślną bazę
danych np. klienci zleceniem:
use klienci; ENTER
Wylistuj tabelki zleceniem:
show tables; ENTER
Następnie wyświetl strukturę (czyli kolumny) tabelki o nazwie np.
nazwiska zleceniem:
describe
nazwiska; ENTER
Zmień nazwę tabelki nazwiska na nazw
zleceniem:
mysql>alter
table nazwiska rename nazw; ENTER
Sprawdź wyniki prac zleceniem: show
tables; ENTER
DODAWANIE NOWEJ KOLUMNY
Będąc zalogowanym jako root (ten od MySQL) ustaw domyślną bazę
danych np. klienci zleceniem:
use klienci; ENTER
Wylistuj tabelki zleceniem:
show tables; ENTER
Następnie wylistuj tabelkę o nazwie np. nazw
zleceniem:
describe nazw; ENTER
Będąc zalogowanym jako root (ten od MySQL) i mając ustawioną domyślną bazę
danych np. klienci dodaj w tabeli nazw nową kolumnę panienskienazwisko tak, by było
położone po kolumnie opis zleceniem:
mysql>alter
table nazw add panienskienazwisko varchar(30)
after opis; ENTER
Jeżeli nowa kolumna ma być pierwsza, to zamiast parametru
after nazwakolumny daj parametr first
Sprawdź wyniki prac zleceniem: show
tables; ENTER
ZMIANA NAZWY KOLUMNY
Zmień (w tabeli nazw) nazwę istniejącej kolumny
panienskienazwisko na nową nazwę: pan_nazw zleceniem:
mysql>alter
table nazw change panienskienazwisko
pan_nazw; ENTER
ZMIANA TYPU DANYCH KOLUMNY
Zmień (w tabeli nazw) typ danych varchar(25)
istniejącej kolumny pan_nazw , na varchar(60) zleceniem:
mysql>alter
table nazw modify pan_nazw
varchar(60); ENTER
*
Masz utworzoną pod rootem (tym od MySQL)
bazę danych oraz
tabelki wraz z ustalonymi typami danych (opis powyżej). Teraz trzeba utworzyć pod rootem (tym od MySQL) zwykłego użytkownika (tego od MySQL), by za jego pomocą wypełnianiać tabele w bazach danych. Jest to związane z
pierwszą zasadą bezpieczeństwa: NIGDY NIE NALEŻY UŻYWAĆ KONTA ROOTA (TEGO OD MYSQL) DO WYPEŁNIANIA TABEL DANYMI!
*
Tworzenie użytkownika/usera odbywa się po zalogowaniu pod roota (tego od MySQL) omówionym już powyżej zleceniem:
cd /etc/rc.d/init.d/ oraz
mysql -u root -p (ewentualnie
mysql -u root -p nazwabazydanych). Każdy użytkownik może mieć nadane różne prawa.
Oto lista najczęściej nadawanych praw zwykłym userom MySQL. Praktycznie nie ma potrzeby, by nadawać więcej praw do zwykłej pracy nad bazą danych, a prawo np. do kasowania tabeli lub np. tworzenia nowej kolumny lepiej zostawić tylko rootowi (od MySQL).
- select czyli prawo do odczytu, wyszukiwania i sortowania danych
- insert czyli prawo do wstawiania nowych rekordów i danych
- update czyli prawo do zmieniania wartości rekordów
- delete czyli prawo do kasowania danych
oraz pozostałe prawa:
- lock czyli blokowanie tabel
- alter czyli dokonywanie zmian w strukturze tabel
- create czyli tworzenie nowych baz i tabel
- drop czyli usuwanie baz i tabel
- grant czyli nadawanie określonych przywilejów
- revoke czyli odbieranie przywilejów
- repair czyli naprawianie uszkodzonych tabel
- check czyli sprawdzanie tabel i aktualizacja statystyk
Polecam wydrukować sobie tabelkę z prawami MySQL (plik pdf).
Tworzymy usera MySQL
kaziu z hasłem
ofarts3ai. Przypominam, że każde polecenie trzeba kończyć średnikiem
; . Znaczek
' jest na klawiszu ze znakiem cudzysłowia.
Tworzenie użytkownika
kaziu z hałsem
ofarts3ai. Posiada on nadane (
grant) wszystkie (
all) uprawnienia na wszystkie (
*) tabele we wskazanej bazie
'baza1'
mysql>grant all on baza1.* to kaziu identified by 'ofarts3ai';
a jeżeli będą problemy dopisz
@localhost do nazwy usera:
mysql>grant all on baza1.* to kaziu@localhost identified by 'ofarts3ai';
Tworzenie użytkownika
kaziu z hasłem
ofarts3ai. Posiada on nadane wszystkie uprawnienia na wszystkich bazach i tabelach .
mysql>grant all on * to kaziu identified by 'ofarts3ai';
Tworzenie użytkownika
kaziu z hałsem
ofarts3ai. Posiada on nadane wszystkie uprawnienia na tabelę 'tabela1' w bazie 'baza1'
mysql>grant all on baza1.tabela1 to kaziu identified by 'ofarts3ai';
Można też zamiast all (wszystkie) dać tylko wybrane uprawnienia np:
mysql>grant select, insert, delete, create on * to kaziu identified by 'ofarts3ai';
By dodać
istniejącemu użytkownikowi
kaziu uprawnienia
delete, update:
mysql>grant delete, update on * to kaziu;
By usunąć uprawnienia
delete, update:
mysql>revoke delete, update on * from kaziu;
Przydatnym jest, by do każdej bazy był skonfigurowany użytkownik z ograniczonymi prawami (np. tylko select). Ze względów bezpieczeństwa należy do jednej bazy danych utworzyć jednego usera z większymi uprawnieniami (select, insert, update, delete) i jednego z uprawnieniami ograniczonymi (select).
Można też stworzyć uniwersalnego usera
zosia z hasłem
czytajx, który będzie miał tylko prawo
select (pobieranie, sortowanie danych) we wszystkich bazach:
mysql>grant select on * to zosia identified by 'czytajx';
Przykładowe zlecenie tworzące zwykłego usera
azat (działającym na tym samym komputerze co zainstalowano
serwer MySQL - stąd parametr @
localhost), z uprawnieniami do
czytania, wprowadzania, korygowania i kasowania danych w bazie
danych o nazwie
klienci, w tabeli
nazwiska. Hasło
usera:
qworpa. Zlecenie powinno być wpisane w jednej
linii.
mysql>grant select, insert, update, delete on
klienci.nazwiska to azat@localhost identified by
'qworpa';
Druga zasada bezpieczeństwa: NIE NADAWAJ ZWYKŁEMU UŻYTKOWNIKOWI (OD MySQL) PRAW ALL (WSZYSTKICH) BEZ WYRAŹNEJ POTRZEBY, GDYŻ PRZEJĘCIE GO PRZEZ WŁAMYWACZA DA MU PEŁNIĘ PRAW NAD MySQL (BAZY DANYCH, TABELE, UŻYTKOWNICY, ROOT).
Trzecia zasada bezpieczeństwa: ZAWSZE TWÓRZ MINIMUM DWÓCH USERÓW (OD MySQL) Z RÓŻNYM STOPNIEM UPRZYWILEJOWANIA. W PRZYSZŁOŚCI SKRYPTY PHP OBSŁUGUJ USEREM O OGRANICZONYCH PRAWACH, TAK BY PRZEJĘCIE GO PRZEZ INTRUZA NIE UMOŻLIWIŁO ZNISZCZENIE BAZY. W wielu moich skryptach formularze PHP umożliwiające kasowanie zawartości baz danych są usunięte z konta www i wkładane jedynie na czas prac administracyjnych. Utrudnia to nieprawne przejęcie uprzywilejowanego usera (od MySQL).
*
Jak sprawdzić nazwy użytkowników w MySQL
oraz
jak sprawdzić prawa pojedynczego użytkownika?
W Linuksie Mandrake/Mandriva jako
zwykły systemowy user np. antek zaloguj się pod roota (od MySQL) zleceniem:
cd /etc/rc.d/init.d/ ENTER
mysql -u root -p ENTER i podaj hasło roota od MySQL
Teraz jako root (od MySQL) wylistuj dostępne bazy danych (powinno być ich kilka) zleceniem:
mysql>show databases;
Jest tam baza danych
mysql. Wejdź do bazy danych
mysql zleceniem:
mysql>use mysql;
Wylistuj tabele w bazie danych
mysql
mysql>show tables; ENTER
Mamy kilka tabel (ilość może być różna zależnie od wersji serwera MySQL):
- column_priv czyli uprawnienia do kolumn
- db czyli uprawnienia do baz danych
- tables_priv czyli uprawnienia do tabel
- host czyli uprawnienia hostów do baz danych
- user czyli opis userów (użytkowników MySQL)
Jesteśmy zainteresowani tabelką opisującą
użytkowników. Tabelka ma nazwę
user. Wyświetl strukturę (czyli listę kolumn) tej tabeli zleceniem:
mysql>describe user;
Pojawią się wszystkie kolumny zawierające parametry userów: przynależność do hosta, nazwa usera, hasło, przywileje (priv czyli prawa).
Nieszczęśliwie nazwa tabeli user ma taką samą nazwę jak jedna z jej kolumn: user. Dodatkową komplikacją jest to, że KOLUMNY mają tutaj położenie w POZIOMIE.
Przy okazji warto zapamiętać listę przywilejów: select, insert, update, delete, create, drop, reload, shutdown, process, file, grant, references, index, alter.
Parametr TYPE przy user, password informuje nas, że
nazwa usera oraz
hasło usera może mieć maksymalnie 16 znaków (a przynajmniej tak jest na moim komputerze).
Aby wylistować wszystkich
userów MySQL i ich wybrane prawa należy w tabeli
user wyedytować kolumnę user oraz po kolei kolumny, które w nazwie mają "
_priv" (można też sprawdzić parametr
host) za pomocą zlecenia:
mysql>select user, host, select_priv, insert_priv, delete_priv, grant_priv from user;
Aby sprawdzić, czy dany
user MySQL: kaziu oraz zosia ma wybrane prawa:
mysql>select user, select_priv, insert_priv from user where user = kaziu and user = zosia;
Oczywiście w powyższym przykładzie wpisałem zapytanie dotyczące kilku praw, ale można wpisać wszystkie. W odpowiedzi uzyskasz ładny wykaz praw (literka Y-yes, literka N-no)
Aby wybrać tylko nazwy userów z tabeli
user wpisz jako root (od MySQL):
mysql>select user from user;
*
Jeżeli w przyszłości nie będziesz mógł się zalogować klientem MySQL, to pamiętaj, że
po korekcie w bazie danych
mysql i modyfikacji tabeli np.
user należy zleceniem
flush privileges odświeżyć bufor serwera MySQL.
*
Jeżeli zapomnimy hasło użytkownika
Jeżeli zapomnimy
hasło użytkownika (tego od MySQL) np.
kaziu, to jako root (od MySQL) możemy nadać je na nowo (przyjmujemy, że użytkownik MySQL
kaziu jest już utworzony):
- logujemy się z pozycji zwykłego, systemowego użytkownika jako root (od MySQL) zleceniem: cd /etc/rc.d/init.d/ ENTER
oraz
mysql -u root -p licznik ENTER
- następnie wykonujemy zlecenie:
mysql>grant all on licznik.* to kaziu identified by 'nowe_haslo';
Uwaga: grant all czyli WSZYSTKIE PRAWA, można zastąpić wybranymi np. grant select, insert, delete, create
Nazwa bazy danych: licznik, tabelki WSZYSTKIE (*), użytkownik kaziu, nowe hasło: nowe_haslo
*
Powyżej pokazałem jak utworzyć bazę danych MySQL (wraz z tabelkami) oraz jak utworzyć użytkowników MySQL.
Pobieranie danych załatwi nam instrukcja SELECT. Struktura tej instrukcji wygląda następująco:
SELECT co_wybrać
FROM z_której_tabeli
WHERE warunki
Czas wypełnić tabelki treścią za pomocą zwykłego użytkownika (tego od MySQL). Powinienem w tym miejscu zaprezentować PHP,
czyli narzędzie idealnie nadające się do wprowadzania i odczytu
danych. Niestety, pośpiech jest niewskazany i na razie trzeba
poznać składnię poleceń MySQL, choćby dlatego, że PHP właśnie tych
poleceń używa do pracy.
Przyjmuję, że pracujesz pod Linuksem w
powłoce tekstowej. Na tym samym komputerze masz serwer MySQL i klienta MySQL. Na Linuksie jest
systemowy (linuksowy) użytkownik antek oraz
użytkownik MySQL o nazwie
licznik3.
Zaloguj się jako
antek, a następnie wpisz zlecenie:
cd /etc/rc.d/init.d/ (ENTER)
mysql -u licznik3 -p (wciśnij klawisz ENTER i podaj hasło usera
licznik3)
uruchomisz użytkownika
licznik3 (tego od MySQL).
*
Ciąg dalszy nastąpi jak będę miał trochę
czasu...
Acha... Można wpisywać ręcznie (w shellu) polecenia do MySQL oraz można te same polecenia wprowadzić do pliku i skorzystać z wpisu:
mysql -u user -p < plik_z_poleceniami
aby zobaczyć komunikaty MySQL można wpisać:
mysql -u user -p < plik_z_poleceniami > komunikaty
Przydatny jest też projekt PhpMyAdmin. Aby za jego pomocą wpisac komendy mysql (shelowe) wpisz do przegladarki adres:
http://localhost/phpmyadmin/index.php
Zakladka SQL- Wykonanie zapytania/zapytań SQL do bazy danych- wklej treść skryptu z poleceniami.
*
W katalogu /var/lib/
mysql są podkatalogi o nazwach identycznych jak istniejące bazy danych. Przed reinstalacją systemu lub zapobiegawczo np. raz w tygodniu warto kopiować do np. katalogu
/archiwum cały katalog /var/lib/
mysql, by w przyszłości odtworzyć bazę danych (z userami, hasłami, przywilejami itd.) po np.
reinstalacji systemu. Archiwizację można wykonać poprzez
crona, który będzie odpalał skrypt o przykładowej treści (wyjaśnienia znajdziesz w artykule o
archiwizowaniu):
#!/bin/sh
tar -zcf /archiwum/mysql_`date +%Y.%m.%d`.tar.gz /var/lib/mysql
Oczywiście tradycyjną archiwizację można wykonać zleceniem (działa pod Linuksem i Windows):
mysqldump
Jej zaletą jest niewielka wielkość pliku archiwizacyjnego (w porównaniu ze skopiowanym katalogiem /var/lib/mysql/), gdyż archiwizuje wybrane elementy bazy danych (np. tylko dane, a nie budowę tabel, konta userów itp.).
Zarchiwizowałem kilka stron www na temat
mysqldump i umieściłem w
paczce rar.
Przydatny jest też projekt
PhpMyAdmin. Aby za jego pomocą zarchiwizować bazę danych mysql, wpisz do przegladarki adres:
http://localhost/phpmyadmin/index.php
BAZY DANYCH- TYTUL BAZY- EXPORT-
Notatki z odtwarzania bazy danych pracującej pod Windows, na projekcie Krasnal - opisałem
tutaj.
*
Na koniec wskazówka związana z MySQL. Może się zdażyć, że pozornie bez powodu baza danych padnie. Jedna z potencjalnych przyczyn to... przepełnienie partycji zawierającej katalog /var/lib/
mysql przez logi systemowe (o ile zawartość katalogu
/var jest montowana na jednej partycji). Co robić?
- Wylistować partycje zleceniem: mount oraz przeanalizować plik /etc/fstab
- Wyświetlić listę partycji wraz z ich wielkością, zajętością itd. zleceniem df -h. Pokaże się tabelka z informacjami: ROZMIAR PARTYCJI, UŻYWANE (zajęte), DOSTĘPNE, PROCENT ZAJĘTOŚCI.
Mając powyższe dane, można ustalić wielkości osobnej partycji montowanej jako /var/log (na logi - u mnie wystarcza 2-3GB) lub lub /var/lib/mysql (na bazy danych mysql - u mnie wystarcza 0,1-0,5GB)