You are on page 1of 131

Pregledan uvod u korienje MySQL-a

- sistema za rad sa bazama podataka

n/ oo

MySQLje sistem za upravljanje relacionim bazama podataka otvorenog


koda , ija popularnost brzo raste. Poznat po brzini, pouzdanosti i lakoi
upotrebe, MySQL se pokazao kao naroito pogodan i za poetnike
i L.a iskusne programere jer omoguava izradu sofisticiranih Web lokacija
i ap likacija koje rade sa bazama podataka.
Prirunik za MySQL daje jasan i saet uvod u osnovne koncepte i tehnike
upotrebe MySOL-a,. itaocu koji j e poetnik u MySOL-u omoguava da
pravi i administrirasloene baze podataka koje moe koristiti kod kue,
na poslu ili na Webu.

Bez obzira na to da li ste poetnik u oblasti baza podataka ili iskusan


profesionalac koji eli da sazna vie o tome kako radi MySQL, Prirunik
za MySOL e vam efikasno pruiti sve informacije koje su vam potrebne
da biste zapoeli i brzo savladali MySQL.
Luke Well ing i Laura Thomson, autori popu larne knjige PHP i MySOL:
razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje
Web aplikacija, softverske inenjerstvo i elektronsko trgovanje, na RMIT
univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji
Tangl ed Web Design, koja je osvojila vie nagrada za svoje projekte dinamiki h Web lokacija na kojima se koriste PHP i MySQL. esto uestvuju
i predaju na konferencijama o softveru otvorenog koda, kao to su MySQL
U er Conference, PHPCon, LinuxTag i O'Reilly Open Source Convention.

<{
(.)

>N

....,

~<

My

S~

Izdanja Mikro knjige


donose informacije,
prenose proverena iskustva
i pruaju potrebna znanja.

Press

<{~
z-,

w
Obl.t\ 1: l\o11r pndoliolkol

Prirunik

za MySQ

Pregledan uvod u korienje MySQL a


-sistema za rad sa bazama podata ko

Prirunik ~a MySQL

Rc.ccn1enL
Urednik
ltrd.lktori
Tehniki urednik
Korektor
Realizacija korica
l'rclom tc Ima i obrada slika

Izdava

l ul Vlling (Luke Wclling) predaje u koli za raunarske nauke i informacione tehnolPl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opretl IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog reenja to
"' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, objaIIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla drao je predavanja iz raznih oblasti, ali ua specijalnost mu je Internet.

Mikro knjiga, Beograd


Dragan Tanaskoski

Direktor
tampa

O autorima
Dragan Tanaskoski
Olga Milanka
Aleksandra Stojanovi i Stela Spa.i
Sanja Tasi
Vesna uki
Vladimir Konarevi
Sanja Tasi
Milica Deanski

YG{)~O "J. ( ~u~kum,

l '"''Tomson (Laura Thomson) predaje u koli za raunarske nauke i informacione

r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je vie predmeta iz

Beograd

Ako imate pitanja ili komentare, ili ako elite da dobijete besplatan katalog, piite nam ili se javite:
Mikro knjiga
l~ t:th 20-87
11030 Beograd
tel: t l /3540-544

Mikro knjiga
Jevrejska bb
78000 Banja Luka
tel: 051/220-960

Mikro knjiga
Maksimirska 13
10000 Zagreb
tel: 01/2344-023

pismamikroknjiga . co.yu

pismamikroknjiga.ba

pismamikroknjiga . hr

Autorizovan prevod sa engleskog jezika knjige MySQLTurorial.

,,,,J.,~tt

Weba i Jnterneta, a priprema doktorat na temu pretraivanja Weba. Uestvuje na


, 'w 1111 konferencijama irom sveta. Bila je instruktor na kursevima u organizacijama
1 d '' t ,!\diiti m kao to su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra
1 l\11\lllll Consulting Group. Diplomirala je inenjering raunarskih sistema i raunar
l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menaeriju kunih ljubiilt.ll 1, .1 ponekad pria s Lukom i o stvarima sasvim izvan sveta tehnike.

Copyright 2005 Mikro knjiga. Sva prava zadrana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji nain, elektronski ili mehaniki, ukljuujui fotokopiranje, snimanje ili bilo koji drugi sistem
~.l bdccnje, bez prethodne pismene dozvole izdavaa.
Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING,
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright 2004.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or
nll'chanical, including photocopying, recording or by any information storage retrieval system, without permission from
l'r.mon Education, Inc.

CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH


IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11

004.655.3(035)
004.652.4(035)
BEJ111Hr, nyK
Prirunik za MySQL l Luke Welling, Laura
Thomson ; preveo Andon Kartalovski. Beograd : Mikro knjiga, 2005 (Beograd :
Publikum). - XI, 251 str. : ilustr. ; 24
cm

KN lio

Prevod dela: MySQL Tutorial. - O autorima:


str. YI. - Registar.

ISBN 86-7555-271-8
l. TOMCOH, napa
a) nporpaMCKH je3HK "SQL" - Prirunici b}
Penau.11oue 6aJe noAaTaKa - Ynpaslbaihe npHpY'IHlll(H
COBISS.SR- ID t 22074124

MSQL/251/1280412M33010P78S6K54 S 4 3 2 1

Od istih autora
Meu

1'111 1 i MySQL
l

lltvo~J

l'lrk.tcija zn Web

knjigama o izradi Web aplikacija korienjem P HP-a


i MySQL-a, ova knjiga ima najbolje ocene na lokacijama
Amazon. com i bn.com. Posebno je dobra druga polovina
knjige, u kojoj su praktini projekti. U udbenicima programiranja za Web, primeri su obino previe jednostavni
za praktinu primenu - ova knjiga sadri i jednostavne primere na kojima se objanjavaju svojstva jezika, ali i nekoliko
gotovih kompletnih aplikacija koje prikazuju kako se prave
veliki projekti.

a draj
Uvod . . . . . . . . .

. 1

Osnove MYSQL-a

. 9

Instaliranje MySQL-a

11

lnSLaliranje na Linux .... ..... ......... .... ...... .. ...... .. . . ... 12


Instaliranje na Windows .................... . .. .... ............. 12
l11staliranje na OS X ........................................... 14
Podeavanje sistema .. ......... ... ........... .... .. . ... ..... ... 14
l'rovera da li sistem radi ........................................ 16
Zadavanje lozinke za nalog root ................. . .. .......... .... 17
ll1 isanje anonimnih naloga .................... .... ............. . 17
l'ravljenje naloga za uobiajene poslove ............................. 17
Saetak ............................................ .. .. .. .. 18

Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Struktura MySQL-ovih direktorijuma ............................ .. 19
Pregled izvrnih datoteka ....................................... 20
Pregled korisnikih interfejsa .................................... 21
Kratak uvod u MySQL monitor .................................. 22
Saetak .................................................... 23

ll Projektovanje i izrada baza podataka u MySQL-u.

27

Ubrzani kurs projektovanja baza podataka. . . . . .

29

Koncepti i terminologija baza podataka ............................. 29


!>rincipi projektovanja baza podataka ............................... 32
Normalizovanje ............................. ... .. ... . ....... . 34
Saetak ............ . . . ...... . . . . . .... . .... ... .............. 38

Pravljenje baza podataka, tabela i indeksa . . . . . . . . . . . . 41


Razlikova~ e

malih i velikih slova ........ .. ....................... 42


Jdentifikatori u MySQL-u ................................. . .... 42
Prav ljenje baze podataka ........................................ 43
Oiranje baze podataka .......................................... 43
Pravljenje tabela .................................. . ........... 44
Tipovi podataka u kolonama .... . ............. . . .. .. . ... ........ 52

l'r,1v~jenje indeksa .......................... , , ,

Brisanje baza podataka, tabela i indeksa ............. , , , , . , .. , . , . , , ~()


Izmena strukture postojee tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %
Saetak ............................................... .... . 58

III Upotreba MySQL-a . . . . . . . . . . . . . . . . .

63

5 Umetanje, brisanje i auriranje podataka . .

65

Komanda INSERT ... .. ..... . ................... ..... ........ 65


Komanda REPLACE ....... .. ............. . ... . .. ... ...... ... . 70
Komanda DELETE .. .......... ............ .. .... .... . .. ... .. . 70
Komanda TRUNCATE ........... . ... . ............. .. .. . ... .. 72
Komanda UPDATE .. .. . ....... . ......... ...... .............. 72
Grupno unoenje podataka pomou komande LOAD DATA INFILE ...... 73
Saetak ...... .. .. . ... . . .................................... 75

Korienje upita u MySQL-u . . . . . . . . . . . . . . . . . . . . . 79


Opti oblik komande SELECT . . ... . . ............................ 80
Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80
Uitavanje podataka iz odreenih kolona .... .. .. . .... . .. .. ...... . .. 80
Apsolutna imena baza podataka i tabela ............................. 81
Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82
Upotreba odredbe WHERE za uitavanje samo odreenih redova ...... . .. 83
Uklanjanje dupliranih vrednosti pomou opcije DISTINCT .. . .......... 84
Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86
Izdvajanje odreenih grupa podataka pomou opcije HAVING ... ... .. ... 87
Sortiranje uitanih rezultata pomou odredbe ORDER BY . . .. . . . ....... 87
Ograniavanje broj a redova rezultata pomou odredbe LIMIT ........ .. .. 88
Saetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89

Sloeniji upiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Upotreba spojeva u upitima koji obuhvataju vie tabela . ... ............. 93
Vrste spojeva izmeu tabela ...... . .. ............... ... ...... . .. . 97
Podupiti ........... ...... .......... . . . ..... . ............... 99
Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103
Saetak ........... . .. . ....... . ... . ... . .. .. .... . . , ......... 104

8 Upotreba MySQL-ovih ugraenih funkcija


u komandi SELECT . . . . . . . . . . . . . . . . . . . . . . . . 109
Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O
Funkcije za upravljanje tokom izvravanja komandi ....... ..... .. .. . .. 113
Funkcije za rad sa znakovnim vrednostima ........................ . 114
Numerike funkcije ... ........... . .. ...................... .. . 117

h 1nk tl)t.: za r.1d s d.11111111111 ,1 1 VIti lit 111111.1, .. . ...... ................


J' nnktq<.: za kouv~:uqu IIJHlV.I pod.tt.tka . ...........................
!>tuge funkcije . . . . . . . . . . . . .. .......... . ...... . .............
l:uktijc za upotrebu u odredbi GltOUP BY ........................
S.1iet1k .... ..... ... ... ... .. ..... .... ..... .. . .... ..........

l V Tipovi tabela i transakcije u MySQL-u

Tipovi tabela u MySQL-u . . . . . . . . .

ll <J
120
121
121
122

125
127

I~AM

tabele ... ................................... .. ... ... . 128


MyiSAM tabele ............................................. 129
lnnoDB tabele ......... .. .. . . ..... ... .... . . ............ . .... 134
llerkeleyDB (BDB) tabele . . . ...... . . . ......... .. . . ............ 135
MER.GE tabele .............................. ... ............ 136
l l EAP tabele .. ........... .................................. 138
S;tetak ........... . ... .... ........... . . .. ................. 138

l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143


Staje transakcija? ... . ..................... ..... ...... .. ...... 143
Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146
Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149
Saetak ............. .... . . .... .. .......................... 152

V Administriranje MySQL-a ...

155

ll Upravljanje pravima korisnika

157

l'ravljenje korisnikih naloga pomou komandi GRANT i REVOKE ... .. 157


Nivoi prava ................................................ 159
Utvrivanje ukupnih prava . .. ......... ... .... . ... .... .......... 160
Upotreba komande REVOKE .......... .......... . ............. 161
Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161
Saetak ........... ... . ........... .... . ........ ......... .. . 165

12 Podeavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169


Podeavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169
Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172
Konfiguraciane opcije za vie instalacija na istom raunaru ....... . .... .. 173
Internacionalizovanje ......................................... 174
Saetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4

13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177


Pokretanj e i sputanje MySQL servera ............................. 177
Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178
Podeavanje serverskih promenljivih ......... . .................. . . 182

Unitavanje niti .................................. .. , , . , ... .. 182


Pranjenje ostava ............................................ 182
Datoteke dnevnika ........................................... 183
Saetak ................................... . ............... 184

14 Izrada rezervnih kopija i obnavljanje podataka . . . . . . . . 187


Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187
Testiranje rezervne kopije ... ...... ..... ....................... 195
Proveravanje i popravljanje tabela .. ... ... ........................ 195
Saetak ............. . .............................. .... ... 198

15 Zatita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201


Kako sistem prava korisnika deluje u praksi ......................... 201
Zatita korisnikih naloga ...................................... 202
Zatita instaliranih datoteka ..................................... 203
Filtriranje podataka koje korisnici alju ............................ 204
Drugi saveti ........................................... ..... 205
Saetak . . . . . . . . . . ......... . ...... .. ....................... 206

16 Replikovanje baze podataka . . . . . . . . . . . . . . . . . . . . . 209


Principi replikovanja ... ...... ................................ 209
Podeavanje sistema za replikovanje ........ . ..................... 211
Sloenije topologije ................. .... .... .. ............... 215
Budunost replikovanja ...................... .. ............... 216
Saetak ... . .. . ............................. . ...... ... ..... 217

VI Optimizovanje MySQL-a . . . . .

219

17 Optimizovanje MySQL servera.

221

Prevoenje

i povezivanje koda radi poveavanja brzine rada ............. 221


Podeavanje parametara servera .. . ....... . ........... . ........... 222
Podeavanje drugih inilaca .................................... 224
Saetak ......... ... .. ............................ .... ..... 224

18 Optimizovanje baze podataka . . . . . . . . . . . . . . . . . . . 227


ta usporava MySQL-ove baze podataka .......... ... ....... .. ..... 227
Pravilni izbori pri projektovanju baze podataka .. . ................... 228
Indeksiranje u cilju optimizovanja ......... .... ................... 229
Komanda ANALYZE TABLE .. . .............. . ................ 230
Komanda OPTIMIZE TABLE ... . . ... . ......................... 230
Saetak .. ........................... . ..................... 230

19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233


Otkrivanje sporih upita ..................... . ..... .... ........ 233
Merenje performansi upita ............................ . ........ 234
Upotreba dnevnika sporih upita ...................... ... ........ 234
Upotreba komande EXPLAIN za prikazivanje naina na koji se
upiti izvravaju .. ............. . ....... . ............ . ...... 235
MySQL-ov ugraeni mehanizam optimizovanja upita ................. 237
Preporuke za optimizovanje upita ................................ 238
Saetak . . .... . .......................... .. ................ 238

u knjizi .

241

Indeks . . . . . . . . . . . . . . . . . . . .

243

Spisak termina

korienih

Uvod

D~

PRIRUNIK

ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da


da brzo uhvatite korak s MySQL-om. MySQL emo objasniti tako da
1 ptlhliimo i krajnjem korisniku i administratoru sistema.
l J ovom uvodnom delu razmotriemo sledee:

1111

lill O DOLI U

omogui

~bog ega biste se opredelili za MySQL


/.ato ba MySQL a ne neka druga baza podataka
!'lt a je drugaije u MySQL-u 4.0 i 4.1

Koje nove mogunosti tek treba da se pojave u


Kome je ova knjiga namenjena
l<.1ko treba koristiti ovu knjigu

buduim

verzijama

N<lpomena u vezi s nainom licenciranja MySQL-a.

Zbog

ega

biste se opredelili za MySOL

"'<)L je odlian proizvod iz oblasti baza podataka. Postoji vie razloga zbog kojih
l11 lt' \l! opredelili da MySQL bude va server baza podataka.
MySQL je brz i stabilan. To je kljuni razlog njegove popularnosti. Februara 2002.
!ullltL', asopis eUiek (www. eweek. com) napravio je uporednu studiju nekoliko
tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov
1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najvie ukupne
H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je jo bri.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, moete je kupiti.
MySQL prua veliku veinu mogunosti koje se smatraju vanim u oblasti baza
('ul.ti.lka, a to su transakcije, zakljuavanje na nivou pojedinanih redova, spoljni klju' l 1, podupiti i tekstualno pretraivanje.Verzija 5.0 e na ovaj spisak dodati i uskladil Ill' procedure.
MySQL omoguava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao to
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.
MySQL je odlina opta alatka za uenje baza podataka jer se lako instalira i koristi,
1 Z.lutima malo prostora na disku i troi skromnu koliinu memorije.
Ukupno gledano, MySQL je odlian izbor za aplikacije baza podataka.
1)

Zato ba MySQL a ne neka druga baza podataka


Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim
detaljima, ali MySQL nudi kombinaciju performansi, cene i mogunosti koju bi drugi
sistemi teko nadmaili.

Performanse
MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju
najbre baze podataka na svetu, to, u zavisnosti od vaeg stepena lakovernosti, samo
dokazuje jednu od sledee dve tvrdnje: programi za testiranje mogu se napisati tako da
rezultati dokazuju ta god naruilac programa zahteva, ili da se razliiti proizvodi
pokazuju kao savreni u razliitim uslovima upotrebe.
Na MySQL-ovj zvaninoj Web lokaciji moete pogledati rezultate poreenja performansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom
primctno nadmauje svoje takmace. Iako u naelu rezultate bilo kojeg testiranja treba
prihvata ti "sa zrnom soli", to naroito vai za rezultate testova koje je izvrio proizvoa baze podataka, svi dokazi na raspolaganju, ukljuujui i nezavisne testove, pokazuju da je MySQL jedan od najbrih proizvoda na raspolaganju.
Rezultate testiranja moete videti na Web lokaciji:
www.mysql.com/information/benchmarks.html

a ti podaci su priloeni i uz datoteke izvornog koda koje preuzim.ate, to vam omoguava da ih uporedite s rezultatima koje dobijete u svom radnom okruenju.
Rezultati testiranja koje je izveo asopis eWeek 2002. godine pokazali su da je
MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web
aplikacije napisane na jeziku Java koje rade na Windows raunaru s etiri procesora.
Navedena dva proizvoda su nadmaila IBM-ov DB2, Microsoftov SQL Server i Sybaseov ASE. U nastavku ovog teksta bie vie rei o ce nama, ali vredi napomenuti da je
od svih proizvoda obuhvaenih tim testovima, jedan od najboljih bio besplatan, dok su
cene drugih bile reda veliine 160.000 dolara (40.000 dolara po procesoru).Vie detalja
o tome nai ete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
Brzina je oduvek bila kljuna odlika o kojoj projektanti MySQL-a vode rauna.
U MySQL se ugrauju nove mogunosti samo ako nisu na tetu performansi. Zbog
toga se ponekad nove mogunosti dodaju sporije nego to to korisnici ele, ali se time
obezbeuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ete se i
sami sloiti na osnovu svog iskustva ili testova koje sami izvedete.

Cena
Cena je stavka koja se moda najlake poredi. Za mnoge uslove upotrebe, MySQL je
besplatna aplikacija. Uslovi licence tipa GPL omoguavaju da neogranieno koristite
softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima
takoe pod GPL uslovima. U odreenim situacijama, npr. kada elite da distribuirate
MySQL kao sastavni deo komercijalnog proizvoda, moraete da kupite komercijalnu
li cenc u. Cena licence za jedan server je od 220 do 440 dolara (u vren~e pisanja ove

knjige), to zavisi od toga da li koristite tabele tipa InnoDB. Drugim reima, za


MySQL postoje dva sistema licenciranja, gde je besplatna upotreba odreena GPL
uslovima, a nain komercijalne upotrebe odreen je standardnim sporazumima EULA
(End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM
(Original Equipment Manufacturer- izvorni proizvoa opreme). Pravilo kompanije
MySQL AB je sledee: "Ako je va proizvod besplatan, i na je; ako se va proizvod
pb a -na takoe".
Najvaniji konkurenti nude iskljuivo komercijalne licence, uz sloene sisteme
t ena, koje zavise od nameravanog naina upotrebe, broja procesora po serveru i broja
Istovremenih korisnika koji e uspostavljati veze s bazom podataka. Trokovi za Orat leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu dostii
desetine hiljada dolara u okruenju sa umerenim optereenjem, pa ak i stotine hiljada
dolara za server s vie procesora na koji se povezuje vei broj klijenata.
MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao to su
l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je
MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1
odtetu u sluaju neispravnosti, kao to zahtevaju velike organizacije.
Jo jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze
podataka koje nisu namenjene radu u klijent/server okruenju, a ciljna trina grupa
su im kuni korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro.
Mada se grafiki korisniki interfejs programa iz ove kategorije esto jednostavno
upotrebljava, njima uglavnom nedostaje vana funkcionalnost i nisu dovoljno stabilni,
skalabilni i brzi da bi bili upotrebljivi za aplikacije od kljune vanosti za firmu.

Stabil nost
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog znaaja .
Sve verzije MySQL-a izdate u binarnom obliku - ak i alfa izdanja - moraju proi
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
osobina, kao i ispitivanje rezultata operacija pri kojima su u prolosti otkrivene i ispravljene greke, ime se obezbeuje da se nikad ponovo ne uvede ve ispravljena greka.
Ispravljanju greaka projektanti moraju da daju vii prioritet od drugih poslova.
U sutini, projektant prekida tekui posao sve dok se ne otkloni greka koja spada
u njegovu oblast strunosti. Pravilo nalae da svako izdanje MySQL-a mora biti oi
eno od dotad poznatih greaka koje se mogu reprodukovati u poznatim uslovima.
R.azume se, odreeni problemi ne mogu se reiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To naroito vai za produkcione verzije u koje ne bi trebalo ugraivati sutinske izmene koje bi mogle da utiu na stabilnost verzije. U takvim
sluajevima, problem se dokumentuje i otklanja u jednoj od narednih verzija.
I najzad, kvalitet softvera obezbeuju MySQL-ovi klijenti i zajednica korisnika.
Preko etiri miliona korisnika irom sveta rade u veoma razliitim okruenjima, to
prua jedinstvenu priliku za otkrivanje greaka ve u poetnim fazama razvoja. Budui
da je MySQL-ov sistem za otkrivanje i dokumentovanje greaka javan, svaki korisnik
ima uvid u sve to su drugi korisnici otkrili i moe da dodaje svoje napomene.

Lakoa

upotrebe

Druga kljuna odlika MySQL-a jeste lakoa upotrebe. Nije potreban sime.: n post upak
podeavanja da biste poeli da radite. MySQL server radi kako treba im ga "rasp~ku
jete". Standardne vrednosti parametara su takve da minimizuju utroak prostora na
disku i memorije. Razume se, da bi se postigle optimalne performanse odreenih
funkcija koje su vane u produkcionom okrue~ u. kao to je npr. prijavljiva~e korisnika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu pomoi primeri konfiguracionih
datoteka koje dobijate uz MySQL.
Mogunosti

Poree~e mogunosti softvera umnogome zavisi od toga koje mogunosti smatrate


vanim. MySQL prua odreene mogunosti, kao to su tekstualno pretraivanje,
replikovanje i podrka za veoma obimne tabele, kojih u drugim jeftinim proizvodima
uopte nema ili ne rade najbolje. Meutim, MySQL-u nedostaju neke mogunosti
kao to su uskladitene procedure i pogledi, koje su standardne u najskupljim proizvodima, a postoje ak i u nekim jeftinim proizvodima. Neke od tih nedostajuih mogu
nosti (kao to su uskladitene procedure), planirane su za naredne verzije, dok e za
druge (kao to su pogledi) biti potrebno vie vremena. Neke MySQL-ove mogunosti
(na primer, zakljuavanje na nivou reda) ne postoje ak ni u najskupljim sistemima.
Na Web lokaciji posveenoj MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/
information/features. html, na kojoj ete nai uporedni pregled mogunosti
MySQL-a i dvadesetak konkurenata, da biste videli ta se sve nudi. U nastavku dajemo
kratak spisak mogunosti koje ne podravaju svi MySQL-ovi konkurenti i spisak
mogunosti kojih nema u MySQL-u a postoje u drugim proizvodima.
MySQL 4.1 nudi sledee:

transakcije u skladu s grupom pravila ACID


podrku za razliite platforme
replikovanje
podrku za obimne tabele i baze podataka
tekstualno pretraivanje
podupite
podrku za veinu sintakse po standardu SQL 92.
MySQL zasad jo ne nudi sledee:
poglede
uskladitene procedure

okidae

ta je drugaije u My

-u 4.0 i 4.1

MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V lii:ij ,l , M.11t.1 2003. godine izdat je MySQL
1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I 11.1 11.data je aprila iste godine.
Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uoiete sledee znaajnije izmene:
U standardnu binarnu verziju ugrad ena je maina baze podataka Inn oD B, koja je
ve bila ugraena u neke kasnije verzije 3.23. Maina baze podataka InnoDB
podrava pravila ACID, to znai da podrava transakcije, spoljne kljueve i
zakljuavanje na nivou redova tabele.
MySQL sada koristi ostavu (ke) za upite, u koju smeta rezultate upita za kasniju
ponovnu upotrebu, ime znatno poboljava performanse uobiajenih upita.
Tekstualno pretraivanje i indeksiranje, koji su dodati u verziji 3.23.23, poboljani su dodava~em opcije Boolean.
Tabele tipa MERGE sada podravaju komande INSERT i polja AUTO_INCREMENT.
Skupovi rezultata dobijeni
opcije UNION .

pomou

upita

SELECT

sada se mogu spajati

Sada moete da br i ete redove iz vie tabela istovremeno

pomou jedne

pomou

komande

DELETE.

Poboljano je upravlja~ e pravima korisnika. Doda to je vie novih vrsta prava, to


omoguava finije podeavanje, a odsad moete da ograniite i resurse kojima
korisnik ima pristup.
Odsad moete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.
Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omoguava da ugraujete MySQL u svoje programe.
Replikovanje, koje postoji jo od verzije 3.23.15, poboljano je na vie naina,
uglavnom otklanjanjem greaka. Na primer, sada moete da podesite bazu ka~
prijemnik podataka pomou opcije LOAD DATA FROM MASTER, umesto pomocu
komande mysqldump ili alatke mysqlsnapshot.
Napravljeno je i puno drugih manjih izmena i poboljanja.
.
.
Verzija 4.1 donosi jo neka dodatna poboljanja. Najvanija izmena Je dodavanJe
pod upita i izvedenih tabela. Odsad imate i podrku za Unicode, po~.~ku za fo_:m~t
OpenGIS za skladitenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.

Koje nove mogunosti tek treba da se pojave


u buduim verzijama
Verzija 5.0 je zasad u predalfa fazi, ali moete preuzeti izvorni kod da biste s njim
ckspcrimentisali. Najznaajnija izmena koju donosi verzija 5.0 jeste do.datak u~kla
ditenih procedura, to je ve ugraeno u predalfa verziju. Planirane su 1 druge 1zm~ne
medu kojima su podrka za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1
druga manja znaajna poboljanja.

Trebalo bi da verzija 5.1 omogui definisanje spoljnih kljueva Ll sv lill Vl st.llll.l


tabela (meu mnogobrojnim drugim novim mogunostima). Pogledi e biti podra ni
u jednoj od buduih verzija S.x.

Kome je ova knjiga namenjena


Ova knjiga je jedinstvena jer se sastoji od niza kratkih i saetih poglavlja, a svako je
u sredsreene na odreenu temu i prevashodno opisuje kako se rade odreeni poslovi.
Svako poglavlje zavrava se pitanjima i vebama koje se odnose na gradivo poglavlja,
to vam omoguava da ispitate da li ste dobro razumeli koncepte izloene u poglavlju.
Ukratko, naa namera je da knjiga bude kratak prirunik za pametne ljude. Ova
knjiga nije referentni prirunik. Ako vam to treba, pogledajte odlian prirunik o
MySQL-u na zvaninoj Web lokaciji. Zaista nema potrebe da ponovo pronalazimo
rupu na saksiji.
Usredsrediemo se na sledeih pet kljunih oblasti: instalisanje i konfigurisanje
MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a.
Opisaemo sva sutinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a.
Ovu knjigu moete koristiti kad god vam zatreba da uradite odreeni posao koji
se ti e upotrebe MySQL-a u novom projektu, ili ste preli na nov posao, ili nemate
dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je
napisana tako da vam pomae da uradite odreeni posao.

N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktinih vebi u vezi s gradivom
poglavlja, da biste mogli da provebate ono to ste nauili u poglavlju.

Napomena u vezi s na i nom licenci ranja MySOL-a


l nmpanij a MySQL AB, kojom upravljaju projektanti i autori MySQL-a, vlasnik je
MySQL-ovog koda i dokumentacije.
Veina delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU
tlptcjavne licence (General Public License, GPL).To znai da moete slobodno kori\111 1, kopirati, distribuirati i menjati izvorni kod MySQL-a. Ako kop irate ili distribuil,lll' kod (ili ako kod izmenite pa ga zatim kopirate ili distribuirate), to takoe morate
1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati
, 11vorni kod.
Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a moete proitati
11 lkktronskom obliku u MySQL-ovom referentnom priruniku, ili na Web lokaciji
l ondacij e za besplatan softver (Free Software Foundation):

hl Lp://www.gnu.org/licenses/

Vie detalja o GNU uslovima

Ova knjiga je podeljena na pet delova:


U prvom delu", Osnove MySQL-a", nauiete kako da instalirate i podesite MySQL
na svom sistemu, i upoznaete MySQL na osnovu kratkog opisa.
Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz
postupak projektovanja i izrade baze podataka. itaocima koji imaju iskustva u projektovanju baza podataka bie dovoljno da samo povrno pogledaju ovaj deo, ali ako
ste poetnik u oblasti baza podataka, savetujemo da ga detaljno prouite .
U treem delu",Upotreba MySQL-a", nauiete kako da koristite podatke iz
MySQL-a u svakodnevnim poslovima.
etvrti deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u
koriste pojedine vrste maina baza podataka, sa posebnim osvrtom na mainu InnoDB
i njenu upotrebu za transakcionu obradu podataka.
Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da obavlja administrator MySQL-ove baze podataka, kao to su upravljarUe korisnicima,
podeavanje, odravarUe baze podataka, izrada rezervnih kopija i restauriranje baze
podataka, zatita baze podataka od neovlaenog pristupa i replikovanje podataka.
esti deo",Optimizovanje MySQL-a", pomoi e vam da dobijete maksimum od
MySQL-ove baze podataka tako to optimizujete podeavarUa servera, baze podataka
i upite u svojim uslovima.

na:

Ako to ne odgovara vaim namerama- na primer, ako elite da izmenite MySQL


d:1 zatim prodajete binarnu verziju napravljenu na osnovu izmenjenog koda, ali bez
pristupa izvornom kodu- onda morate kupiti komercijalnu licencu od firme MySQL
AB. Komercijalnu licencu moete kupiti i ako elite da pomognete razvoj MySQL-a.
Vano je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL
uslovima, ali se moe slobodno tampati za linu upotrebu.
1

Kako treba koristiti ovu knjigu

nai ete

http://www .gnu.org/licenses/gpl-faq.html

I
Osnove MYSQL-a

Instaliranje MySQL-a

2 Kratak obilazak

1
Instaliranje MySQL-a

>VOM POGLAVLJU SAZNAETE

111 upotrebe.

Obradiemo sledee

kako se instalira i podeava MySQL za


teme:

uobiajen

l11staliranje na Linux
l11staliranje na Windows
l11staliranje na OS X
Podeavanje sistema

z~davanje

lozinke za nalog root

llrisanje anoninmih naloga.


l'nu~ emo

od instaliranja MySQL-a na sistem. Ako ve imate instaliran primerak


<)L- a 4.1 ili neku stariju verziju, moete preskoiti tekst do odeljka "Zadavanje
Ito. lli~ l! za nalog root".
l'rl'balo bi da najpre preuzmete sa Web lokacije verziju MySQL-a koja je najpogodlllj.r 1.1 va sistem. Za veinu sistema postoje verzije MySQL-a koje se distribuiraju u
1!111,11110111 obliku ili kao izvorni kod. Ako tek uite kako se koristi MySQL, prepomu1 11111 vam da preuzmete binarnu verziju jer se znatno lake instalira. Dodatna prednost
11 1 lo to je binarna verzija MySQL-a podeena za optimalne i stabilne perfom1anse.
l .. t svaku platformu, MySQL postoji u tri varijante: Standard, Max i Debug. Za
(llllllt'IC iz ove knjige, potrebna vam je varijanta Max, u koju su ukljuene razne korilli IIIOgunosti, kao to su InnoDB tabele koje omoguavaju upotrebu transakcija,
Int' remo vrlo esto koristiti.
MySQL je na raspolaganju istovremeno u vie verzija: tekua verzija, najnovija ver~ 'l' 1 11ekoliko razvojnih verzija iz vie faza razvoja. Ova knjiga je napisana za verziju 4.1.
MySQL moete preuzeti s Web lokacije:
www mysql.com/downloads/index.html

U 11<\Stavku ovog poglavlja opisujemo kako se instaliraju binarne verzije MySQL-a


l'od l inuxom, Windowsom i OS X-om. Postoji MySQL i za nmoge dmge operativne
~ 1\lt'lllL', ali detalje o nainu instaliranja morate potraiti u MySQL-ovoj dokumentaciji.

Instaliranje na Linux
U zav_is.nosti od verzije ~inuxa koju imate i od toga koliko je svea, vrlo je verovatno
da vec Jmate neku verZljU MySQL-a instaliranu na svom raunaru, ali je takoe vrlo
verovatno da to nije najnovija verzija.
Prepor~~jemo da i~stalira~e MySQL iz MySQL-ove RPM datoteke, pod uslov.~m da vas SJStem podrzava taj format pakovanja. Savetujemo vam da upotrebite verZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM
datoteku koju vam je isporuio proizvoa vae distribucije Linuxa, naroito ako tek
po~i~~ete uenje .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji auriraju
se cesc: n~go . u b1lo kojoj v distribuciji Linuxa, to znai da su u njih ugraena najnovija
poboljsanja J 1spravke gresaka . Osm1 toga, struktura direktorijuma na vaem raunaru
bie podeena kako je opisano u MySQL-ovoj dokumentaciji, to e vam za poetak
svakako olakati traenje informacija.
_Jedna distribucija se sastoji od vie RPM datoteka. Da biste mogli da koristite
klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server- VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VERZljA.i386.rpm. (Re VERZijA bie zamenjena odgovarajuim brojem verzije.)
Server i klijent moete instalirati ako u komandnom okruenju otkucate sledeu
komandu:

rpm -i MySQL-server-VERZIJA.i386.rpm MySQL-client-VERZIJA.i386 .rpm


. Time.ete pokrenuti i mysqld, MySQL server, i formirati odgovarajuu strukturu
dJ:ektonjuma u /etc/ini t. d/ da bi se server automatski pokretao kada pokrenete
racunar.
Ako elite da instalirate MySQL na neki drugi nain- tj. ne iz RPM datoteka
-potraite detaljnija uputstva u MySQL-ovoj dokumentaciji.
Ivmajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i da se
moze. razb~ovat1 o~ onog koji moda poznajete iz verzija MySQL-a koje ste ranije
mstabrah, 1h od vase verzije Linuxa.

Instaliranje na Windows
~a biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prijaVltl na s1stem kao administrator.
Akvo ve !mate .instalira~ u neku verziju MySQL-a, morate zaustaviti server pre
nego sto pocnete mstal1ra11Je nove verzije. To se radi pomou sledee komande:

mysqladmin -u root -p shutdown


. Ako imate M~SQL ins~~iran kao Windowsov servis, moraete najpre da uklonite
taj serv1s. To mozete urad1t1 u komandnom okruenju pomou sledee komande:
mysqld --remove

l\\ n/L' bttt polrtbno d.t myoq l cl'/;IIIICililc imenom prvobitne binarne verzije servera

l"111

\lt'

imt.1lirali kao Windowsov servis.

Al o vit.: volite da radite s grafikim alatkama, servis moete da uklonite i pomou

tl .ql t' Services Manager, koja je na raspolaganju u Control Panelu, u grupi Admini1! .111 vc Tools Services, ili na nekim sistemima, u prozoru alatke Microsoft Managelitt tll Console.
ltllajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i moe
t.tllikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije instal~t ,tll 11~ svojoj verziji Windowsa. Zaponite instaliranje raspakivanjem .zip datoteke
lt tp 1 ste preuzeli sa We b lokacije.
lJ zavisnosti od trenutka kada ovo budete itali, sadraj te datoteke moe biti drugaql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe.
~ \ d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL ete
111\t.tl1rati tako to dvaput pritisnete ime MSI datoteke.
In stalacioni program e vam ponuditi opciju da instalira MySQL u podrazumevani
l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ete ga
111\t.llirati u podrazumevani direktorijum.
Poto instalirate MySQL, treba da napravite datoteku s parametrima koji odreuju
potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego to prvi put
pokrenete server. Vie detalja o podeavanju sistema nai ete u odeljku "Podeavanje
!'lema", u nastavku ovog poglavlja.
Poto podesite parametre sistema, korisno je da server prvi put pokrenete s
~ omandne linije. (U nastavku ovog poglavlja objasniemo kako se MySQL instalira
~ .10 Windowsov servis, ali pogledajmo prvo da li uopte radi.)
Otvorite prozor komandne linije i preite u direktorijum u koji ste instalirali
MySQL. Ako imate standardnu instalaciju, to e biti c:\mysql\bin.
Otkucajte

sledee:

mysqld-max --standalone
Trebalo bi da se nakon toga prikae grupa poetnih poruka. Ako je dosad sve
u redu, moete instalirati MySQL kao Windowsov servis.
Otkucajte ime izvrive datoteke servera koju nameravate da koristite, a zatim i
opciju --install. Na primer:
mysqld-max --install
U ovoj knjizi preporuujemo izvrivu datoteku mysqld-max.
Da bi vaa instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da
obavite jo jedan, poslednji posao. Poto su neki od programa pridruenih MySQL-u
zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl maina da bi ti programi mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState:
www.activestate.com/Products/ActivePerl/

ActivePerl dobijate u obliku MSI datoteke. Preuzmite ActivePerl i instaiii,IJ!t ga


tako to dvaput pritisnete ime te datoteke. Moete prihvatiti sve vrednosti parametara
koje vam instalacioni program ponudi za upotrebu s MySQL-om.

U ovoj knjizi preporuujemo da izmenite sledee opcije :


ll udui da emo koristiti InnoDB tabele, morate obaviti osnovno podeavanje za
upotrebu tog tipa tabela.

l'n:poruujcmo da ukljuite beleenje izmena u dnevnik (engl. binary log) u svim


situacijama . To je veoma korisno u sluaju oporavljanja od katastrofalnih greaka.

Instaliranje na OS X
MySQL moete instalirati na OS X iz odgovarajueg paketa, pod uslovom da imate
OS X 10.2 ili noviji.
Ako ve imate neku verziju MySQL servera koja je aktivna na vaem raunaru,
morate je zaustaviti pre nego to zaponete instaliranje nove verzije. To moete uraditi tako to na komandnoj liniji otkucate sledeu komandu:
mysqladmin -u root -p shutdown
Da biste mogli da pokrenete server, potreban vam je korisniki nalog ije je ime
mysql. Ako imate OS X 10.2 ili noviji, taj nalog ve postoji.
S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike
diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.
Pojavie se sadraj datoteke slike diska. Pronaite PKG datoteku i dvaput je pritisnite. Za potrebe ove knjige moete prihvatiti sve vrednosti opcija koje vam instalacioni program ponudi.
MySQL moete podesiti tako da se automatski pokree pri podizanju sistema, tako
to dodate Startupitem. To moete uraditi ako dvaput pritisnete datoteku MySQLStartupltem.pkg koja bi trebalo da se nalazi u vaoj .dmg datoteci.
Poto izvrite postupak opisan u odeljku "Podeavanje sistema", moete pokrenuti
MySQL server tako to otkucate sledeu komandu, pod uslovom da ste instalirali Startup Item:
sudo /Library/Startupitems/MySQL/MySQL start
Ako niste instalirali Startupltem, server moete pokrenuti
komandi:

pomou sledeeg

niza

cd /usr/local/mysql
sudo ./bin/mysqld_safe
Pritisnite Ctrl+Z. I najzad, otkucajte

sledeu

komandu:

bg
Ako niste instalirali Startupitem, morate ponoviti ove korake kad god pokreete
svoj sistem i elite da koristite MySQL.
Imajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i moe
se razlikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije instalirali, ili moe biti drugaiji na vaoj verziji OS X-a.

Podeavanje sistema
Poetna

konfiguracija MySQL-a radie ve takva kakvu ste je instalirali; meutim,


neke korisne mogunosti su standardno iskljuene a instalacija nije ' dovoljno zatiena.

l 1 reporuujemo da ukljuite beleenje sporih upita u dnevnik, to e vam pomoi


da optimizujete svoje aplikacije.

MySQL smeta vrednosti konfiguracionih parametara u datoteku opcija. Ako koriWindows, globalnu datoteku opcija moete smesti ti u Windowsov sistemski
oi ill ktor uum i nazvati je my.ini, ili u e: \my.cnf. Preporuujemo da koristite my. ini jer
II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija.
U operativnim sistemima iz porodice Unix, globalna datoteka opcija obino je
.llii'tena u direktorijum /etc/my.cnf. Ako elite da na istom raunaru radi vie
r-- lySQL servera, podatke za svaki server moete uvati u zasebnoj datoteci my.cnf
lllt'tenoj u direktorijumu data svakog servera. Osim toga, moete dozvoliti korisni' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smetene u
ol1tntcci -/.my.cnf(obratite panju na taku ispred imena datoteke).
U zavisnosti od vae instalacije, moda u poetku neete ni imati datoteku opcija.
t ltvorite tu datoteku u svom uobiajenom editoru za tekst- Notepad e sasvim lepo
nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.
Predlaemo vam datoteku opcija sa sledeim poetnim opcijama (listing 1.1):
lit t

l h ting 1.1

Predloena datoteka opcija

tmysqld]
ll aktiviranje dnevnika izmena i dnevnika sporih upita
tog bin
log-slow-queries

Podeavanje za InnoDB tabele


ll Ovo je osnovna datoteka opcija predloena u dokumentaciji
ll Datoteke za podatke treba da omogue
ll skladi tenje podataka i indeksa.
ll Obezbedite dovoljno slobodnog
ll prostora na disku.
innodb_dat a_file_path = ibdatal:lOM:autoextend
ll Podesi te veliinu rezerve za bafere na
ll 50-80% koliine mermorije
ll na rau naru
rwL-variable = innodb_buffer_pool_size=70M
nPL-variable = innodb_additional_mem_pool_size=lOM
ll Podes ite veliinu dnevnika na priblino
ll 25% veliine rezerve za bafere
set-variable
innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM

# Podesite .. flush_log_at_trx_commit
# na O ako moete da prihvatite gubljenje
# nekoliko poslednjih transakcija

innodb_flush_log_at_trx_commit=1
Vei deo sadraja ove datoteke opcija zasniva se na veoma jednostavnoj konfiguracionoj datoteci za upotrebu Inn o DB tabela, koja je predloena u MySQL-ovoj dokumentaciji. Ako imate postojeu instalaciju u kojoj se koriste InnoDB tabele i dodate
joj ovu datoteku opcija, moda ete morati da pretvorite u komentar sledei red:

set-variable = innodb_log_file_size=20M

Da biste se odjavili iz MySQL monitora, otkucajte sledee:


\q

(Obrnuta kosa crta, slovo q i pritisak na taster Enter.)


..
.. .
Meutim, nemojte se jo odjavljivati. (Ako ste to uradth, ponovo se pnjaVJte.) .
Postoji jo nekoliko administrativnih stvari koje treba da obavite da bis.te_ zatsta mogh
da koristite svoju instalaciju MySQL-a. Budui daje to vano, preporucujemo vam da
n~stavite itanje ovog poglavlja.

Zadavanje lozinke za nalog root

na poetku reda upisati znak#. (Ako ve imate datoteku dnevnika druge


veliine, to e moda zbuniti MySQL.)
Ostala podeavanja opisana su u poglavlju 12, "Podeavanje MySQL-a".

Kao to ste verovatno uoili ako ste se upravo prijavili na server, moral1 ste da. zadate
une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku
n:tlog root nema lozinku. Iz oiglednih bezbednosnih razloga, veoma je vano da tom
ualogu dodelite lozinku. U MySQL monitoru otkucajte sledee:

Provera da li sistem radi

aet password for rootlocalhost=password('lozinka');

tako to

ete

Poto instalirate MySQL, podesite ga tako da se automatski pokree pri podizanju


raunara. Ako je tano podeen, trebalo bi da bude mogue uspostavljanje veza sa
MySQL serverom.
To moete proveriti pomou sledee komande:
mysql -u root
Moe biti potrebno da zadate punu putanju izvrive datoteke mysql (na primer, na
Windowsu, to je obino e: \mysql \bin\mysql -u root) ili da izmenite vrednost
sistemske promenljive PATH.
Trebalo bi da se na ovaj nain uspeno prijavite kao korisnik root (administrator)
MySQL monitoru (tj. MySQL-ovom interfejsu u obliku komandne linije). Na vaem
ekranu trebalo bi da se pojavi sledea uvodna poruka:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.1.0-alpha-max-debug-log
Type 'help; ' or '\h' for help. Type '\e' to clear the buffer.
mysql>
Na vaem sistemu e verovatno biti razliit broj veze (connection id) i broj verzije
servera. Neka vas to ne brine.
Ako se pojavi poruka nalik na sledeu:
ERROR

2003: Can't connect to MySQL server on 'localhost' (10061)

to znai da MySQL server ne radi. Pokuajte ponovo da pokrenete sistem da bi se server automatski pokrenuo zajedno s njim, ili runo pokrenite server pomou komande:
mysqld --standalone
na komandnoj liniji. (To ete najlake uraditi u jednom prozoru, a zatim otvorite
drugi prozor iz kojeg ete se prijaviti na server.)

Razume se re lozinka zameniete lozinkom koju ste izabrali za nalog root.


Odjavite se' (\q) a zatim se ponovo prijavite. Ovog puta ete morati da se prijavite
slcdeom komandom:

mysql -u root -p
MySQL e zatraiti da zadate svoju lozinku. Parametar -u znai ime korisnika,
;1

parametar -p znai da se prijavljujete s lozinkom.

Brisanje anon imn ih naloga

. ..

Pri instaliranju, MySQL automatski pravi nekoliko anonimnih naloga .za koje mje
potrebno zadavanje imena korisnika prilikom prijavljivanja.' Pr~poruujemo vam da te
naloge izbriete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .
"Zatita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete
ukloniti pomou sledeeg niza komandi:
use mysql;
delete from user where User='';
delete from db where User='';
(lush privileges;

Pravljenje na loga za uobiajene poslove

.. .

Jz bezbednosnih razloga, korisno je da umesto naloga root, za uobJcajene

svakod-

nevne poslove koristite neki drugi nalog.


.
. . .
Ovde je samo ukratko opisano kako se prav1 nov konsmckt ,n~log. Vtse deta.lja
tome kako se upravlja korisnikim nalozima u MySQL-u naCl cete u poglavlju 11,
V

"Upravljanje pravima korisnika" .

Pomou sledee komande napravite nov nalog koji ete koristiti za svakodnevne

poslove:

grant create, create temporary tables, delete, execute, index,


insert,
lock tables, select, show databases, update
on*.*
to imekorisnika identified by 'lozinka ' ;

Kratak obilazak

Razume se, umesto rei imekorisnika i lozinka, u tekst komande treba da upiete
svoje korisniko ime i odgovarajuu lozinku.
Trebalo bi da se sada odjavi te sa servera, pa ponovo prijavite na njega pod imenom
korisnika i lozinkom koje ste zadali. U nekim od zavrnih poglavlja ove knjige moraete da koristite nalog root da biste obavili odreene poslove, ali poto korisniki
nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za svakodnevne poslove.

Saetak

OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Prid1uene. Poveemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u
MySQL-u i koji su najei klijentski interfejsi. Razmotriemo sledece teme:

U ovoj f.ni trebalo bi da vaa instalacija MySQL-a bude upotrebljiva a vi spremni da


sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili sledee:

Strukturu MySQL-ovih direktorijuma


Pregled izvrnih datoteka

Preuzeli najnoviju binarnu verziju MySQL-a za va operativni sistem s Web lokacije mysql.com.

Pregled

Prvi put se prijavili na server i odjavili s njega.


Zadali lozinku za nalog root.
Izbrisali anonimne naloge.
Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove.

Vebe
Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju,
ukoliko jo niste to uradili.

U sledeem poglavlju
U poglavlju 2",Kratak obilazak", pogledaemo komponente vae instalacije MySQL-a,
ponovo emo pogledati korisnike interfejse i osnovni nain upotrebe MySQL-a.

interfejsa

Kratak uvod u MySQL monitor.

Instalirali je- pomou instalacionog programa (na Windowsu ili OS X-u) ili
pomou alatke RPM.
Podesili server tako da se automatski pokree pri podizanju sistema, ako je to u
vaem sluaju prihvatljivo.
Napravili datoteku opcija.

korisnikih

truktu ra MySQL- ovih direktorijuma

..

l J ovom poglavlju pretpostaviemo da ste instalirali MySQL na standardnu lokaciJU na

vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura
dlll'ktorijuma bie ista, ali e kerenski direktorijum biti drugaiji.
Ukoliko vam je proizvoa isporuio sistem sa ve instaliranim MySQL~om:.
11uktura direktorij uma e se moda razlikovati. Na primer, ako Imate dJstn~uCIJU v .
l~l'd Hat 9, otkriete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1
,1,tcm skladitenja datoteka. Ako ste MySQL instalirali iz RPM d~toteka. koje potJCu
.1 MySQL-ove Web lokacije, trebalo bi da datoteke budu na mestima koje navodimo
ovoj knjizi.
..
.. v
v..
v

lill ajte u vidu i to da e struktura direktonJuma b1t1 nes~o dru gaCIJa sto zavisi od tog~
~ nJe ste opcione stavke instalirali i da li ste MySQL instalJral.I IZ bmarne .distnbuciJe Ih
11 distribucije sa izvornim kodom. U ovoj knjizi pretpostavljamo .da ste mst~Irali IZ
blll.lrne distribucije, kao to je preporueno u poglavlju 1, u odeljku "InstaliranJe
MySQL-a".
.
. .
..
Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
tt

/U

rUylctVIJt: L

Pregled korisnikih interfejsa

1'\.ldldl\. UVIIOLO"

U tom direktorijumu nai ete, izmeu ostalog, sledee poddirektorijume (pod


pretpostavkom da ste instalirali MySQL iz binarne distribucije):
bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i vie
drugih korisnih programa u prevedenom obliku. Sadraj tog direktorijuma opisan je u narednom odeljku ovog poglavlja.
scripts: Ovaj direktorij um sadri grupu skri p tova napisanih na jeziku Perl koji
obavljaju korisne poslove. Objasniemo ih detaljnije u narednom odeljku ovog
poglavlja .
data: Ovo je direktorij um u kojem e se uvati vai podaci.
does (Linux) ili Does (Windows): U ovom direktorijumu nai ete dokumentaciju o MySQL-u, u HTML formatu.
sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se programi za testiranje MySQL-a.
Postoji jo nekoliko drugih direktorij uma u koje e prosean korisnik retko zalaziti. To su: include (sadri datoteke zaglavlja), lib (biblioteke funkcija koje MySQL
koristi), share (sadri tekst poruka o grekama koje MySQL alje) i example (postoji
samo na Windowsu, sadri primere upotrebe datoteke libmysql.DLL). Ako instalirate
drugi softver (kao to je PHP) koji se povezuje s MySQL-om, moe vam zatrebati da
znate gde se ti direktorijumi nalaze ali malo je verovatno da ete neto direktno
menjati u njima.

Pregled izvrnih datoteka


MySQL-ove izvrne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo
najpre direktorijum bin.
U njemu ete nai izvrnu datoteku mysqld ili datoteku s nekim drugim imenom,
to zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u
poglavlju 1 podesili tako da se automatski pokree zajedno sa operativnim sistemom.
Tu ete nai i mysql, MySQL monitor. To je osnovni klijentski program sa mterfejsom u obliku komandne linije.
.
Osim ova dva najvanija programa, nai ete i vie drugih. Upotrebu mnogih od
njih opisaemo u pojedinim poglavljima ove knjige. Ovde emo navesti samo neke
meu

najkorisnijim:
mysqladmin: Slui za obavljanje administrativnih funkcija.
myisamchk: Slui za proveru i popravljanje oteenih MyiSAM tabela.
mysqldump: Omoguava izradu rezervnih kopija baze podataka.
mysqlbinlog: Omoguava itanje dnevnika izmena, to je kljuno za oporavljanje baze u sluaju katastrofalne greke.
mysqlshow: Slui za prikazivanje podataka o bazama podataka i njihovim
tabelama.

Kroz celu ovu knjigu koristiemo programe mysqld i mysql, a na druge pomenute
programe vrati emo se u petom delu, "Administriranje MySQL-a".
Pogledajte sadraj direktorijuma scripts. Programi koji se u njemu nalaze su skriptovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih meu njima opisaemo kada vam budu zatrebali u ovoj knjizi.
Najvaniji od onih koje emo koristiti u ovoj knjizi jeste mysqlhotcopy, koji slui za
111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada
11'zervnih kopija i obnavljanje podataka".)

Pregled

korisnikih

interfejsa

MySQL-u moete pristupati pomou vie korisnikih interfejsa, ili klijentskih progl.l!na.Tri najpopularnija korisnika interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, skraeno, MySQLCC)
1 phpMyAdmin.
MySQL monitor je ukljuen u osnovnu instalaciju MySQL-a, a komande se
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
l o listi i radi na svim platformama.
MySQL Control Center (MySQLCC) jeste grafiki korisniki interfejs. Napisan je
pomou skupa alatki za izradu prozora Qt, koji omoguava izradu verzija za razliite
pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Windows, a planirana je i verzija za OS X.
phpMyAdrninje Web korisniki interfejs za upotrebu MySQL-a. Veoma je popu111 an meu dobavljaima Internet usluga koji svojim korisnicima stavljaju na raspolago~~~jc MySQL radi razvijanja Web aplikacija.
Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je zvanini
pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate,
111nda ete morati da ga posebno preuzmete sa adrese:
www.mysql.com/downloads/mysqlcc.html

MySQLCC se izuzetno lako instalira, a uputstva o tome

nai ete

na adresi:

www.mysql.com/products/mysqlcc/install.html

phpMyAdmin moete preuzeti sa adrese:


www.phpmyadmin.net/

Ako elite da sami instalirate phpMyAdmin, morate imati funkcionalan Web sernl 1 instaliran PHP.
Za potrebe ove knjige, nevano je koji ete korisniki interfejs odabrati. Svi nude
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika:tiJll takoe u obliku teksta, bez obzira na korisniki interfejs koji upotrebite.
i>rimeri koje dajemo u ovoj knjizi testirani su pomou MySQL monitora, ali vi
1110ete koristiti ta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
111u~i klijentski program naete na Internetu. Za neke poslove bie potrebno da izaete
it kn ns n ikog interfejsa i upotrebite koma n dno okruenje operativnog sistema.

21

22

Poglavlje 2 Kratak obilazak

Saetak

Kratak uvod u MySQL monitor


Sada emo ukratko opisati osnovni nain upotrebe MySQL monitora. Prijavljivanje za
rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL monitor prijavljujete se pomou sledee komande:
Ovaj klijentski program ima nekoliko opcija koje mogu biti korisne. Ako uspostavljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom raunaru,
moete upotrebiti opciju -h da biste zadali ime tog raunara; na primer:
imeraunara

Poto izaberete bazu podataka, moete videti koje se sve tabele nalaze u njoj, ako
kll Cate komand ll:

111

11 1iow tables;

mysql -u username -p

mysql -h

tHireenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
p.1 pokuajte ponovo.)

-u imekorisnika -p

U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postiete i


opcije --safe -update s. Na primer:

pomou

mysql --i-am-a-dummy -u root -p

Ova opcija ograniava tetu koju biste mogli da nainite pomou zadate komande.
To je naroito korisna opcija (na raspolaganju samo u alatki u kojoj se komande
zadaju na komandnoj liniji) kada se kao poetnik malo pribojavate rada u MySQL-u.
Moda bi bilo dobro daje koristite dok itate ovu knjigu. (Konkretno, ova opcija vas
spreava da aurirate ili izbriete redove u tabelama ako ne zadate vrednost primarnog
kljua tih redova. Ako jo ne znate ta to tano znai, nemojte brinuti. Sve e postati
jasno u treem delu knjige, "Upotreba MySQL-a".)
Poto se prijavite u MySQL, moete videti koje sve baze podataka postoje, ako
zadate komandu SHOW:
show databases;

Kod veine italaca, u ovoj fazi rezultat ove komande bie kratak spisak baza podataka. Trebalo bi da se na vaem spisku pojavi baza podataka mysql. To je sistemska
baza podataka u kojoj se uvaju podaci o korisnikim nalozima i njihovim pravima.
Vie rei o tome bie u nastavku ove knjige.
Obratite panju na to da se komanda zavrava znakom taka i zarez. Veinu
komandi koje otkucate u MySQL monitoru morate zavriti tim znakom ina e ih
MySQL nee izvriti. Otkucajte:
show databases

i zatim pritisnite Enter. MySQL e samo mirno ekati. Ako potom otkucate znak taka
i zarez i pritisnete taster Enter, komanda e biti izvrena. To omoguava da sloene
komande raspodelite u vie redova da bi bile itljivije. Umesto znaka taka i zarez,
moete upisati \g (obrnuta kosa crta i slovo g), ali veina koristi taku i zarez.
Moete izabrati neku bazu podataka sa liste i otkucati sledeu komandu:
use imebaze;
(Upiite tano ime baze kojoj elite da pristupite.)
Time navodite MySQL-u da elite da radite sa odreenom baz<?m podataka. Izaberite jednu sa spiska i otkucaj te ovu komandu. (Moda neete imati prava da pristupite

Podatke o odreenoj tabeli moete dobiti pomou komande:


til ncri be tablename;

Iz MySQL monitora moete se odjaviti tako to otkucate:


\q

bratite panju na to da se ova komanda ne zavrava znakom taka i zarez. Postoji


l', illpa komandi koje poinju znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr,, va se znakom taka i zarez. Spisak tih komandi moete dobiti ako otkucate:
\h

(Slovo

h potie

od rei help.)

MySQL-ove i SQL-ove komande moete upisivati direktno ll MySQL monitor.


Ml'tlutim, te komande moete takoe uneti u datoteku koju zatim izvrite jednom
~ o111andom, kao skript. To ete raditi u nastavku ove knjige, npr. kada u poglavlju 4,
,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.
Ako ste prijavljeni u MySQL monitor, datoteku koja sadri komande moete izvrdir kad otkucate:
""ree imedatoteke

Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama moete


rr.vriti preusmeravanjem rezultata te datoteke; na primer:
my oql -u imekorisnika -p e imedatoteke

Ovim ste stekli osnove o nainu upotrebe klijentskog programa mysql.

aetak
Najvaniji direktorijumi u instalaciji MySQL-ajesu bin (izvrni programi), data
(podaci iz baze podataka) i does (dokumentacija).
Dva programa koja ete n;Uee koristiti jesu mysqld (MySQL server) i mysql,
klijentski program u kojem se komande zadaju preko komandne linije.
Moete birati izmeu vie korisnikih interfejsa, odnosno klijentskih programa.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafiki
interfejs) i phpMyAdmin (Web interfejs).
Program mysql ima vie korisnih opcija koje moete zadati na njegovoj komandnoj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje
s lozinkom), -h (kojom se zad;Ue ime udaljenog raunara) i --i-am-a-dummy
(za ograni:lvanjc mogue tete).

24

Poglavlje 2 Kratak obilazak

U sledeem poglavlju

Poto se prijavite na server, moete izdati komande SHOW DATABASES ili SHOW
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imetabele da biste dobili podatke o odreenoj tabeli.
Iz MySQL servera moete se odjaviti pomou komande \q.
Komande moete zavravati znakom ; ili znakovima \g da biste ih poslali servem
na izvrenje .
Datoteku koja sadri komande moete izvriti iz klijentskog programa pomou
komande source imedatoteke, ili izvan klijentskog programa- preusmeravanjem rezultata datoteke.

Pitanja

Vebe
l'r tuznute i instaliraj te neki grafiki ili Web korisniki interfejs, kao to je MySQLCC.
Vtzbajte prijavljivanje i prikazivanje spiska postojeih baza podataka pomou klijentlo~ programa koji ste izabrali .

Odgovori
fl1lanja
l. d
) a
\. e

l. Program MySQL server nalazi se u

l. e

a) direktorijumu does ili Does

'l . b

b) direktorijumu lib
e) direktorijumu scripts

U sledeem poglavlju

d) direktorijumu bin
2. Dokumentacija o MySQL-u nalazi se u

l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri emo opte kon-

u vezi s bazama podataka, terminologiju i principe projektovanja, ukljuujui i


rrnrrnalizaciju.Ako niste poetnik u oblasti baza podataka, ali ste poetnik u MySQL-u,
'" rrtorate detaljno proitati to poglavlje.
' qllt:

a) direktorijumu does ili Does


b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
3. Program mysqlhotcopy nalazi se u
a) direktorijumu does ili Does
b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
4. U MySQL monitoru
a) komande treba da se zavravaju znakom taka i zarez
b) komande treba da se zavravaju znacima \g
e) moe a) ili b)
d) nita od prethodnog nije tano
5. Opcija --i-am-a-dummy zadata u programu mysql
a)

znai tano

b)

spreava

to to pie

me da napravim previe tete dok

uim

SQL

e) spreava me da uradim bilo ta osim prijavljivanja i odjavljivanja


d) nita od prethodnog nije tano

II
Projektovanje i izrada
baza podataka u MySQL-u
\ Ubrzani kurs projektovanja baza podataka
l

Pravljenje baza podataka, tabela i indeksa

3
Ubrzani kurs projektovanja
baza podataka

RAZMOTRIEMO

OVOM POGLAVLJU
osnovne principe projektovanja i normalilu\,lllja baza podataka. U dobro projektovanoj bazi podataka redundantnost (dupli' tll)t') podataka svedeno je na minimum, ali bez gubljenja podataka. To znai da e na
'riJ hrt i to manji utroak prostora na disku uz ouvanje svih veza koje postoje izmeu
1'HI.1taka.
R.1zmotriemo sledee teme:

Koncepti i terminologija baza podataka


Principi projektovanja baza podataka
Normalizovanje i normalne forme
Vcbe iz projektovanja baza podataka.

Koncepti i terminologija baza podataka


l 1.1 !liSte razumeli principe koje emo razmatrati u ovom poglavlju, moramo najpre
othJ.IStliti neke osnovne koncepte i terminologiju.

l ntiteti i relacij e
hnovni elementi koje emo pokuati da model ujemo jesu entiteti i relacije. Entiteti su
'' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog ivota o kojima uvamo podatke
11 h.1:n podataka. Na primer, moemo se opredeliti da evidentiramo podatke o zaposle111111.1 i slubama u kojima rade. U tom sluaju bi zaposleni bio jedan entitet, a sluba
11 ~nJoj radi- drugi. Relacije su veze koje postoje izmeu entiteta. Na primer, zaposleni
t,tdi ll slubi. "Radi u" je relacija (veza) izmeu entiteta zaposleni i sluba.
ltdacije mogu biti razliitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla vie" (ili "vie prema jedan", u zavisnosti od toga s koje strane relacije posmalt,tlt') 1., vie prema vie". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.

JU

ruyraVIJI:: J

VUILdfll

~ur~ fHUJI::~lUVdiiJd

UdLd

Koncepti 1 termrnologiJa oaza podataka

JJUUdld~d

Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s pisaim stolom, to bi
bila relacija tipa ,jedan prema jedan". U primerima kao to je navedeni, ta veza "radi u"
ee je tipa "vie prema jedan", tj. vie zaposlenih radi u datoj slubi .Tc dve vrste relacija prikazane su na slici 3.1.

l.tbele
~

tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database


\ ltiiWgement System, RDBMS), to znai da podrava baze u kojima postoje relacije
1 111\!du podataka koji se uvaju u tabelama (engl. tables). Ako ste ikada koristili neki
i'ln~ram za tabelarne proraune, svaki njegov radni list ima oblik tabele s podacima.
11111llCr tabele je prikazan na slici 3.2.
emolovee
em loveeiD

~g

name
1

Noro edwards

Ben Smith
6651 Ajay Palal
!016 Candy Burnett

Istraivanje i razvoj

ob
1

Programmer

OBA

Programmer

Systems Administrator

departmentiD
l~
128
128

Slika 3.2 U tabeli employee (zaposleni) uvaju se ifre zaposlenih (employee ID),
imena (name), poslovi kojima se bave Gob) i slube u kojima rade (departmentiD).

Kao to vidite, ova tabela sadri podatke o zaposlenima u jednoj kompaniji. (Nisu
pr1bzani podaci o svim zaposlenima, ve samo nekoliko primera.)

Kolone ili atributi


Candy

-Jr________.____",
~~'
Nora

~-------'----"'
:ru.~.
Ajay

Slika 3.1

Relacija "nalazi se u" jeste tipa ,jedan prema jedan".


Relacija "radi u" jeste tipa "vie prema jedan".

Imajte u vidu da entiteti, relacije i vrste relacija meu njima zavise od okruenja i
poslovnih pravila koje pokuavate da modelujete. Na primer, u nekim firmama jedan
zaposleni moe raditi u vie slubi. U tom sluaju bi relacija "radi u" bila tipa "vie
prema vie". Ako vie ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u"
nije tipa "jedan prema jedan".
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja vae u sistemu
koji modelujete. Ne postoje dva potpuno jednaka sistema.

l J tabelama baze podataka, svaka kolona ili atribut opisuje odreeni podatak koji se
11.d.tzi u svakom redu tabele. Rei kolona (engl. column) i atribut (obeleje, engl. attri/111/r) koriste se kao sinonimi, ali tanije je rei da je kolona deo tabele, dok se atribut
1 ul11osi na entitet iz stvarnog sveta koji tabela modeluje. Na slici 3.2 vidljivo je da svaki
.1posleni ima atribute employee ID, name, j ob i department ID. To su kolone tabele
r lltployee, koje se ponekad nazivaju i atributi ili polja (engl.fields) tabele.

B dovi, zapisi i n-torke


l'o~ledaj te ponovo tabel u employee. Svaki red te tabele predstavlja zapis o jednom
t.tposlenom. Moda ete uti izraze redovi (engl. rows), slogovi ili zapisi (engl. records)
11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadri podatke iz svih kolona tabele.

Kljuevi
..,. IIJII'rkiju (engl. superkey) je kolona (ili grupa kolona) koja jednoznano identifikuje red
t.tbele. Klju (engl. key) je minimalni superklju. Pogledajte tabel u employee. Da bismo
)l'dnoznano identifikovali svakog zaposlenog, moemo upotrebiti kombinaciju kolona
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
tkpartmentiD). Obe kombinacije su superkljuevi.
Meutim, da bismo jednoznano identifikovali svaki red tabele, nisu nam potrebne
sve te kolone, ve je dovoljna samo jedna (na primer) employeeiD, odnosno miniIlla ina grupa kolona pomou koje nedvosmisleno identifikujemo svaki red. Prema
tome, klju je kolona employeeiD.
Pogledajte ponovo tabelu employee. Jednog zaposlenog moemo identifikovati po
1111enu (name) ili po ifri zaposlenog (employeeiD). Obc kolone su kljuevi. Tc klju
(l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogui bndid~ti

1.(

t'UYilVIJC::

UUfLlnl

KUf~ prUJC::KlUVlnJl UlLl pUUlllKl

meu kojima emo izabrati primarni (engl. pri mary) klju. Primarni klju je kolona ili
grupa kolona pomou koje emo jednoznano identifikovati pojedine redove tabele.
U ovom sluaju, za tu namenu koristiemo kolonu employee ID. To je bolji klju od
kolone name jer se esto dogaa da dve osobe imaju isto ime i prezime.
Spoijni kljuevi (engi.Joreign keys) predstavljaju veze izmeu tabela. Na slici 3.2 vidite
da kolona departmentiD sadri brojeve koji predstavljaju ifre slubi u kojima rade
zaposleni. To je spoljni klju; skup svih podataka o odreenoj slubi uva se u drugoj
tabeli, u kojoj je primarni klju kolona departmentiD.

Funkcionalne zavisnosti
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ree nego drugi koje
smo naveli, ali treba da shvatite njegovo znaenje da biste razumeli postupak normalizavanja o kojem e biti rei u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost izmeu kolone A i kolone B, koja
se moe napisati kao A -7 B, vrednost u koloni A odreuje vrednost u koloni B. Na
primer, u tabeli employee, kolona employeeiD funkcionalno odreuje ime zaposlenog
(a u ovom primeru i sve druge atribute).

nmc1p1

prUJC::KlUVlnJl UlLl

pUUtlliiKil

H dundantnost i gubljenje podataka


l Hla projektujemo emu baze podataka, to moramo uraditi tako da redundantnost
Jlndataka bude minimalna, ali da pri tome ne izgubimo nijedan podatak koji namje
111 llphodan. Redundantni podatak u ovom kontekstu znai da se isti podatak ponavlja
11 1azliitim redovima iste tabele ili u razliitim tabelama baze podataka.
Zamislite da umesto dve tabele, employee (zaposleni) i department (slube), imamo
11110 jednu tabelu koja se zove employeeDepartment. To moemo izvesti ako tabeli
IIIJlloyee dodamo kolonu departmentName tako da ema tabele postaje sledea:
cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)
Za svakog zaposlenog koji radi u slubi iji je ifra 128, Research and Development
(htt.1ivanje i razvoj), moramo da ponovimo podatak "Research and Development"
( Irb 3.3). Isto vai i za sve ostale slube kompanije.
employeeDepartment
employeeiD name
ora_t:a_war s

~~~

6651
9006

ob

de artmentiD

rogrammar

Ben Smith

OBA

~ayPatet

Programmer

~
128

Candy Burn eU

Systems Administrator

128

de artmentName
1

~.esearcn

ana Ue\le opment

Fmance
Research and Development
Research and Development

Slika 3.3 Ova ema dovodi do redundantnosti (ponavljanja) podatka

eme
Izraz ema ili ema baze podataka (engl. database schema) oznaava strukturu ili dizajn
baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke.
Da bi vam bilo jasnije, ema je "nacrt strukture" podataka koji se uvaju u bazi.
emu jedne tabele u bazi podataka piemo na sledei nain:
employee (employeeiD, name, j ob, ~-~P.~r_t_I?!!'!.~_nR)
U ovoj knjizi draemo se pravila da se atributi koji predstavljaju primarne kljueve
podvlae punom linijom, a atributi koji predstavljaju spoljne kljueve - takastom. Primarni kljuevi koji su istovremeno i spoljni, podvlae se i punom i takastom linijom.

Principi projektovanja baza podataka


Kada projektujemo bazu podataka, moramo razmotriti dva vana pitanja:
Koje sve podatke treba uvati, odnosno o kojim sve stvarima ili entitetima
moramo da uvamo podatke?
Koju emo vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se
upiti.)
Kada traimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila
organizacije koju pokuavamo da modelujemo, o emu sve moramo da uvamo
podatke i koje su veze izmeu tih podataka.
Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka ija e
struktura biti takva da iskljuuje strukturne probleme kao to su redundantnost (dupliranje) podataka i anomalije podataka.

o nazivu slube.

Ovu emu moemo da izmenimo na sledei nain:


tmployee(employeeiD, name, job, ~-~P.~r_t_l?}!'!.~-~l:Q)
dcpartment(departmentiD, name)

U ovom sluaju se naziv slube

uva na samo jednom mestu, pa se minirnizuje


prostora na disku i izbe gavaju odreeni problemi.
Obratite panju na to da smo morali da ostavimo kolonu departmentiD u tabeli
111ployee; bez nje bismo izgubili informaciju iz eme, odnosno u ovom sluaju bismo
1/~llbili vezu izmeu zaposlenog i slube u kojoj radi. Kada poboljavamo emu baze
Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali
lll'z gubljenja informacija.

1111 oak

Anomalije
/\11omalije su neto sloeniji koncept. To su problemi koji se pojavljuju meu poda' 1111.1 zbog loe osmiljene strukture baze podataka. Mogu se pojaviti tri vrste anomalq.t, koje emo opisati na primeru loe osmiljene eme sa slike 3.3.

Anomalije pri dodavanju podataka


Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loe osmiljenom struktullllll pokuate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji
poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da
1111csemo i ifi-u i naziv slube u kojoj radi. ta se dogaa ako unesemo podatke koji se
1,wlrkujr1 od postojeih u tabeli, npr. ako upiemo da novi zaposleni radi u slubi ija
Jl' sili .1 42, J evl'lopment? Nakon toga vie nee biti jasno koji redovi tn bele sadre
1\jli.IVIIl' pod.1tkt 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOl'IIJll pod;~(;1k;l.

ll

t'll91ilVIJe

uorzant Kurs proJeKwvanJa oaza pooaraKa

NormattzovanJe

Anomalije pri brisanju podataka

employee
employeoiD

Anomalije pri brisanju podataka nastaju kada se podaci briu iz tabele s loe osmiljenom strukturom. Zamislite da svi zaposleni iz slube ija je ifra 128 daju otkaz (moda
zato to im je sve dojadilo). Poto izbriemo sve zapise o tim zaposlenima, vie nemamo
nijedan zapis u kojem se pominje sluba sa ifrom 128, niti njeno ime. To je primer
anomalije pri brisanju.

Anomalije pri auriranju podataka


Anomalije pri auriranju podataka nastaju kada se auriraju podaci u tabeli s loe osmiljenom strukturom. Zamislite da je rukovodstvo donelo odluku da sluba ija je ifra
128 promeni ime u EmergingTechnologies. U tom sluaju moramo izmeniti podatke
pojedinano za svakog zaposlenog koji radi u toj slubi. Lako se moe dogoditi da nekog
izostavimo.Ako se to desi, imaemo anomaliju pri auriranju.

~~

6651
9006

Slika 3.4

Null vrednosti

Normalizovanje je postupak koji omoguava ispravljanje loe osmiljene strukture


baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, to su
grupe pravila o tome ta treba i ta ne treba da bude u strukturama tabela. Tokom
postupka normalizovanja, tabele se razbijaju na manje tabele koje ine bolju strukturu.
Da biste pratili postupak normalizovanja, na strukturu baze podataka primeniemo
redom sve tri normalne forme. U svakoj nomalnoj formi obino se polazi od pretpostavke daje ema baze podataka ve u prethodnoj normalnoj formi. Da bi baza podataka bila u drugoj normalnoj formi, mora prethodno biti dovedena u prvu normalnu
formu a da bi bila u treoj normalnoj formi, mora prethodno biti dovedena u drugu
normalnu formu itd. U svakoj fazi normalizovanja dodajemo nova pravila koja ema
mora da ispuni.

dopartmentiD

,AJay Palal

Programmer

Candy Burnett

Systems Administrator

1~

OBA

128
128

skills
~~en. Java

VB, Java
NT, Linu)(

Ova ema nije u prvoj normalnoj formi zato to kolona


skills sadri grupu vrednosti.

emclovee
employeeiD

~~:~

7513
9642
6651
6651
9006
9006

Name

IJ\Iora ~dwards
Nora Edwards

Nora Edwards

ob

del'_artmentiD

1 ~rogrammer

Pro grammar
Pro grammar

Ben Smith

OBA

Ajay Patel
Ajay Patel

Programmer

Candy Burnett
Candy Bumett

Systems Administrator
Systems Administrator

Slika 3.5

Pro grammar

skill

:~ l ~eri

12e
42
12e
128
12e
12e

Java

082
VB
Java
NT
Linux

Sve vrednosti sada su proste.

U ovom sluaju napravili smo jedan red po strunoj kvalifikaciji. Ova ema je sada
prvoj normalnoj formi.
Razume se, ova organizacija podataka je daleko od savrene jer imamo veliku
~t dundantnost- za svaku kombinaciju struna kvalifikacija/zaposleni u tabeli uvamo
~ VL' podatke o zaposlenom.
Bolje reenje i pravilan nain organizovanja ovih podataka u prvu normalnu formu
prikazano je na slici 3.6.
11

employee
employeeiD

~:~

6651
9006

ob

name
1 Nora Edwards

Ben Smith
Ajay Patel
Candy Burnett

':'rogrammer

departmentiD

OBA

l~

Pro grammar
Systems Administrator

12e
12e

employeeSkills
employeeiD skill

~~:; lGPerl

Prva normalna forma


Prva normalna forma, koja se ponekad naziva i l NF, propisuje da svaka vrednost atributa ili kolone mora biti prosta. To znai da svaki atribut mora sadrati samo jednu
vrednost, a ne kom.binaciju vie vrednosti ili drugi red baze podataka.
Pogledajte tabelu na slici 3.4.
To je nenorm.alizovana verzija tabele employee koju smo razmatrali u prethodnim
odcljcima. Kao to vidite, dodata je nova kolona, skills, u kojoj su navedena struna
znanja svakog zaposlenog.

ob
Programmer

Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
d.1sadri prostu vrednost kao to je Java, kolona sadri listu vrednosti, kao to je e,
l ' t l , Java. Time je prekrena pravilo prve normalne forme.
Da bismo ovu emu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
11 koloni skills na proste elemente. To se moe obaviti na vie naina. Prvi i moda naj' n tglcdniji nain prikazan je na slici 3.5.

Poslednje pravilo dobrog projektovanja baza podataka nalae da treba izbegavati eme
koje dozvoljavaju vei broj nepopunjenih atributa. Ako elimo da evidentiramo da na
svakih sto ili vie zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee
ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta
kolona sadrala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se
uvale ifre i kvalifikacije samo zaposlenih koji ih imaju.

Normalizovanje

name
Nora Edwards
Ben Smith

7513
9642
6651
6651
9006
9006

Slika 3.6

Java

082

VB
Java

NT
Linux

Pravilno reenje istog problema je pravljenje


dodatne tabele.

Jb

t"ogtaVIJe

uorzan1 Kurs proJeKtovanJa oaza poaaiaKa

U ovom primeru, preneli smo strune kvalifikacije u zasebnu ta belu koja slui
samo da povee ifre zaposlenih s pojedinim kvalifikacijam.a. Time smo reili problem
redundantnosti.
Moda se pitate kako smo doli do drugog reenja. Postoje dva odgovora.Jedan je:
na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka
normalizovanja na emu sa slike 3.5; u tom sluaju, na kraju dobijamo emu sa slike
3.6. Prednost iskustva je to to omoguava predvianje i direktan prelazak na prav1lnu
strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.

Druga normalna forma


Poto postavimo emu u drugu normalnu formu, moemo je preneti u naredne normalne forme vieg stepena, koje se neto tee razumeju.
Kae se daje ema u drugoj normalnoj formi (koja se takoe zove 2NF), ako su svi
atributi koji nisu deo primarnog kljua funkcionalno potpuno zavisni od primarnog
kljua i emaje ve u prvoj normalnoj formi. ta to tano znai? To znai da svaki atribut koji nije deo primarnog kljua mora biti funkcionalno zavisan od svih delova primarnog kljua, tj. ako primarni klju ini vie kolona, svi ostali atributi tabele moraju
biti zavisni od kombinacije svih tih kolona.
Pogledajmo primer da bi postalo jasnije.
Pogledajte sliku 3.5. U toj emi, tabela sadri jedan red po zaposlenom i po strunoj
kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog ega?
ta je primarni klju te tabele? Znamo da primarni klju mora jednoznano identifikovati svaki red tabele. U ovom sluaju, to je mogue samo pomou kombinacije kolona
employeeiD i skills. Ako je sadraj kolone skills kao na slici, kolona employeeiD nije
dovoljna za jednoznano identifikovanje redova jer, na primer, vrednost em.ployeeiD
7513 postoji u tri reda. Meutim, poto kombinacija vrednosti u kolonama employeeiD
i skills jednoznano identifikuje svaki red, upotrebiemo je kao primarni klju. Tako
dolazimo do sledee eme:
employee(employeeiD, name, job, <J.e_p_'!l_'m"!~~_I_.Q, skill)
Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom
imamo:
employeeiD, skill -7 name, job, departmentiD

sluaju

ali i
employeeiD -7 name, job, departmentiD
Drugim reima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znai da su ti atributi funkcionalno samo delimino zavisni od izabranog primarnog kljua, odnosno
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog kljua a
njegova cela vrednost nije neophodna. Prema tome, ova ema nije u drugoj normalnoj
formi.
Sledee pitanje je: "Kako bismo je doveli u drugu normalnu formu?"

Normalizovanjc

'!''::!belu moramo razdvojiti na vie tabela u kojima su svi atributi koji nisu deo pri liLl rnog kljua funkcionalno potpuno zavisni od primarnog kljua. U ovom sluaju je
''' 1glcdno da to moemo postii ako tabelu razdvojimo na dve tabele:
employee(employeeiD, name, job, departmentiD)
<.'mployeeSkills( employeeiD, skill)
----------------'lb je ema prikazana na slici 3.6.
Kao to je ve opisano, ova ema je u prvoj normalnoj formi zato to su sve vredll osti proste. Ona je takoe u drugoj normalnoj formi zato to svaki atribut koji nije
dl' o primarnog kljua sada je potpuno zavisan od svih delova primarnog kljua.

Ir a normalna forma
I'1111Ckad ete uti nekoga da kae: "Normalizovanje se tie kljua, celog kljua i nieg
t11t1gog osim kljua". Druga normalna forma nalae da atributi moraju zavisiti od
1 1 log kljua. Trea normalna forma propisuje da atributi zavise samo od kljua.
1:ormalno, da bi ema bila u treoj normalnoj formi (3NF), moramo ukloniti sve
li.lllzitivne zavisnosti i ema mora ve biti u drugoj normalnoj formi. U redu, ali ta je
lidll:titivna zavisnost?
Pogledajte ponovo sliku 3.3. Prikazana je sledea ema:
l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Ova ema sadri sledee funkcionalne zavisnosti:
l'mployeeiD -7 name, job, departmentlD, departmentName
dcpartmentiD -7 departmentName
Primarni klju je employeeiD i svi atributi funkcionalno su potpuno zavisni od
"l''ga, to je lako razumljivo jer se primarni klju sastoji od samo jednog atributa.
Meutim, vidljivo je i to da imamo:
l'mployeeiD -7 departmentName
l'tnployeeiD -7 departmentiD
dcpartmentiD -7 departmentName
Obratite panju i na to da atribut departmentiD nije klju.
Ovaj odnos znai da je funkcionalna zavisnost employee ID -7 departmentName
li,lllzitivna zato to postoji "meukorak" (zavisnost departmentiD -7 departmentName) .
Da bismo doli do tree normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Kao i u prethodnim formama, da bismo doli do tree normalne forme, tabel u razdv.l_J.lmo na vie drugih tabela. U ovom sluaju takoe, prilino je oigledno ta bi trclo.do da uradimo. emu d elimo na dve tabele, employee i department, na sledei nain:
l'mployee(employeeiD, name, job, ~_<:p_~:~~~~-~-t_I_J?.)
d cpa rtmcnt( d epa rtmen t ID, departmentN ame)

'18

Poglavlje 3 Ubrzani kurs projektovanja baza podataka


Pitanja

To nas vraa na emu tabele employee prikazanu na slici 3.2. Ona je u treoj normalnoj formi.
Drugi nain da opiemo treu normalnu formu jeste da kaemo sledee: fo~maln~,
ako je ema u treoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh,
ispunjen je jedan od sledea dva uslova:
Leva strana funkcionalne zavisnosti je super klju (tj. klju koji nije obavezno
minimalan).
ili
Desna strana funkcionalne zavisnosti je deo svakog kljua te tabele.
Drugi uslov se ne pojavljuje ba tako esto! U
zavisnosti bie obuhvaene prvim uslovom.

veini sluajeva,

l'rmcipi projektovanja baza podataka


Redundantnost se mora minimizovati, ali bez gublje~a podataka.
Anomalije pri dodavanju, brisanju i auriranju jesu problemi koji se pojavljuju
kada se u tabelu s loe osmiljenom strukturom podaci dodaju, briu iz nje ili
auriraju .
lzbegavajte strukture koje dovode do velikog broja null vrednosti.

Normalizovanje
Normalizovanje je formalni postupak koji omoguava poboljava~ e strukture
baze podataka.

sve funkcionalne

Prva normalna forma (lNF) znai da kolone ili atributi sadre iskljuivo proste
vrednosti.

Boyce-Coddova normalna forma


Poslednja forma koju emo - ukratko- razmotriti jeste Boyce-Cod~ova normalna
forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh ~mo ~~a usl.ova.
Da bi tabela bila u BCNF, mora biti u treoj normalnoj formi i mora 1spumt1 prv1 od
dva uslova, tj. sve funkcionalne zavisnosti moraju imati superklju na levoj strani.
Taj uslov je esto automatski ispunjen i bez pred uzimanja posebn~hv mera, kao u
ovom primeru. Ako imamo zavisnost koja kri ovo pravilo, moramo j OS jednom razdvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF.

Normalne forme vieg stepena

Druga normalna forma (2NF) znai da svi atributi izvan kljua mor;Uu zavisiti od
celog kljua.
Trea normalna forma (3NF) znai da ne sme biti tranzitivnih zavisnosti.
IJoyce-Coddova normalna forma (BCNF) znai da svi atributi moraju biti funkcionalno odreeni superkljuem.

Pitanja
Superklj u

..

je

a) Minimalni klju
b) Spoljni klju

Postoje i normalne forme viih stepena (etvrta, peta itd.) ali su one pogodmje za akademske rasprave nego za praktinu primenu na projektovanje b~za podataka. 3NF
(ili BCNF) sasvim. je dovoljna da rei te probleme redundantnost1 podataka na koje

e) Grupa atributa koja jednoznano identifikuje svaki red tabele

ete naii.
1

d) Minimalna grupa atributa koja jednoznano identifikuje svaki red tabele


Ako je tabela u drugoj normalnoj formi

Saetak

a) Takoe je u prvoj normalnoj formi

Za kraj, evo ta smo sve razmotrili u ovom poglavlju.

b) Takoe je u treoj normalnoj formi


e) Ne sadri tranzitivne zavisnosti

Koncepti
Entiteti su "stvari", a relacije su veze imeu njih .
Tabele sadre podatke koji se prikazuju u tabelarnom obliku.
Kolone tabela su atributi (obeleja) koji opisuju svaki entitet.
Redovi tabela sadre vrednosti iz svih kolona tabele .

Kljuevi omoguavaju jednoznano

identifikovanje pojedinih redova.

Funkcionalne zavisnosti opisuju koji atributi


eme su "nacrti" baze podataka.

odreuju

vrednosti drugih atributa.

d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog kljua


l, Ako je tabela u treoj normalnoj formi
a) Takoe je u Boyce-Coddovoj normalnoj formi
b) Sadri atribute koji nisu prosti
e) Ne sadri tranzitivne zavisnosti
d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog kljua
1. Tri vrste anomalija nastaju pri
a) dodavanju, uitavanju i brisanju podataka
b) dodavanju, aurira~u i brisanju podataka
e) uitavanju, auriranju i brisanju podataka

40

Poglavlje 3 Ubrzani kurs projektovanja baza podataka

5. N-torka je
a) kolona
b) red
e) kandidat za klju
d) vrsta narodnog kola
e) spoljni

Pravljenje baza podataka,


tabela i indeksa

klju

Vebe
1. Normalizujte sledeu emu u treu normalnu formu:
Porudbine(ifraKupea, imeKupea, adresaKupea, brojPorudbine, datumPorudbine, ifraRobe, nazivRobe, koliinaRobe)
2. Pokuajte da osmisli te emu koja je 3NF ali ne i u BC NF.

Odgovori
Pitanja
1. e
2. a

3. e
4. b
5. b (postoji narodno kolo koje se zove estorka)

Vebe
1.

NAUIETE

da pravite osnovne MySQL strukture: baze


tabele i indekse. Razmotriemo sledee teme:
Pravljenje baze podataka
Biranje baze podataka
Pravljenje tabela
O VO M POGLAVLJU

1tlld,nnka,

Tipovi podataka za MySQL-ove kolone


Pravljenje indeksa
l3risanje tabela, indeksa i baza podataka
lzmena postojeih struktura tabela.
/.a rad s primerima u ovom poglavlju koristiemo jednostavnu bazu podataka: to je
employee o kojoj je ve bilo rei u prethodnom poglavlju. ema te baze

1:,1 podataka

Kupei(ifraKupea, imeKupea, adresaKupea)

l"'d .1t~kaje sledea:

Porudbine(brojPorudbine, datumPorudbine, ~~~~~':~~~-~)

tmployee(employeeiD, name, job, ~~p-~:~~~-r:~_I_l2)

StavkePorudbine(k:~i_~-~:_l!_~~~~~~.' ~~~~~?_<: koliinaRobe)

t kpa rtment( departmentiD. name)

Roba(ifraRobe, nazivRobe)
2. Postoji puno moguih reenja, proverite samo da vae ne kri pravila
normalizovanja.

tmployeeSkills(employeelD, skill)
tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)
. l ssi gnmcnt(~}~~~-~~~.' ~-~J?!~Y~:!:'?. workdate, hours)

U sledeem poglavlju
U poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", pretvoriete emu baze
podataka u stvarne MySQL tabele.

l >ok itate gradivo iz ovog poglavlja, moete unositi odgovarajue komande da biste
lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse
11111/l'tc praviti pomou bilo kojeg klijentskog programa za MySQL, ali u ovim primc' lllt.l , bazu podataka napraviemo pomou MySQL monitora. Opredelili smo se za to
11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa.

42

Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Trebalo bi da se najpre prijavite u MySQL monitor, na isti nain na koji ste to inili
u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak".
U ovom poglavlju koristi emo mogunosti za definisanje podataka koje prua jezik
SQL da bismo pravili baze podataka, tabele i indekse. ta to tano znai? SQL je skraenica od Structured Query Language (strukturirani jezik za upite), to je jezik koji
emo koristiti za izradu relacionih baza podataka i uitavanje podataka iz njih. ine ga
dve semantiki odvojene komponente: jezik za definisanje podataka (engl. Data Difinition Language, DDL), koji omoguava formiranje struktura baze podataka), i jezik za rad
s podacima (engl. Data Manipulation Language, DML), koji omoguava pretraivanje
baze podataka.
U narednim odeljcima saznaete kako se u MySQL-u prave baze podataka, tabele
i indeksi.

Razlikovanje malih i velikih slova


Pre nego to zaponemo upotrebu jezika SQL i definiemo identifikatore MySQL-ovih
objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u.
U rezervisanim reima jezika SQL ne pravi se razlika izmeu malih i velikih slova.
To je standardno u svim sistemima za rad s bazama podataka.
Da li e MySQL praviti razliku izmeu malih i velikih slova u imenima baza podataka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to to e
najee svakoj bazi podataka odgovarati odreeni direktorijum, a svaka tabela bie
smetena u odgovarajau datoteku. Imena tih direktorijuma i datoteka slede razliita
pravila, koja zavise od operativnog sistema.
To praktino znai da ako koristite Windows, u imenima baza podataka i tabela nee
se praviti razlika izmeu malih i velikih slova, ali e suprotno pravilo vaiti ako koristite
neki operativni sistem iz porodice Unix. To moe biti uzrok zbrke, naroito ako je va
operativni sistem OS X, koji moete podesiti tako da ne pravi razliku izmeu malih i
velikih slova (HFS+, standardno podeavanje), ili naprotiv, da je uzima u obzir (UFS).
Da biste smanjili mogunost zbrke, korisno je da se naviknete da sve identifikatore
tretirate kao da je ukljueno razlikovanje malih i velikih slova, ak i pod operativnim
sistemom Windows. To e vam omoguiti da lako preete na drugu platformu.
Namerna upotreba dva razliita oblika istog identifikatora, npr. Zaposleni i zaposleni,
moe zbuniti ljude koji itaju va kod, pa zato izbegavajte da to radite.
U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima e biti rei u
nastavku teksta) nikad ne pravi razlika izmeu malih i velikih slova.

ldentifikatori u MySOL-u
Identifikator je opta re koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili
indeksa. To je nain da se nedvosmisleno identifikuje odreeni objekat. Pre nego to
ponete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifikatori ispravni u MySQL-u.

Biranje baze podataka

lgl.tvnom, identifikatori mogu sadrati sve znakove koji postoje, osim sledeih:

/.nakove navoda, znakove ASCII(O) i ASCII(255).


Imena baza podataka mogu sadrati sve znakove koji su dozvoljeni u imenima
1hrcktorijuma, ali ne i znakove koji imaju posebno znaenje u imenima direkto1 Uu ma (/, \ i .) , iz oiglednih razloga.
Imena tabela mogu sadrati sve znakove koji su dozvoljeni u imenima datoteka,
osi m znakova . i l.
~vi identifikatori, osim alijasa, mogu se sastojati od najvie 64 znaka. Imena alijasa
(opt~ani

su u poglavlju 7 ",Sloeniji upiti") mogu sadrati najvie 255 znakova.


jtdno neobino pravilo u MySQL-u glasi da moete koristiti rezervisane rei kao
lo tlllflkatore, pod uslovom da ih piete izmeu navodnika. Na primer, moete imati
l ''" lu ije je ime TABLE . Razume se, ako je neto dozvoljeno, to ne znai da to morate
'd .t vezno i raditi, a u ovom sluaju, navedenu praksu bolje je izbegavati. ak i ako se
t 11 tome dobro snalazite dok radite s MySQL-om, to moe zbuniti program mysqld11111p, koji se esto koristi za izradu rezervnih kopija baze podataka.
!'ostoji kratak spisak rezervisanih rei koje MySQL prihvata kao identifikatore bez
tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je prilino uobiajeno u
' tkodnevnim poslovima. Najei primeri na koje ete nailaziti su upotreba rezervilitt h rei DATE i TIMESTAMP za imena kolona.

Pravljenje baze podataka


~~.tkon

projektovanja strukture baze podataka, naredni korak je, savim logino, da

"l' t semo MySQL-u da elimo da napravimo novu bazu podataka. To se radi pomou

'><>L-ove komande

~~ate

CREATE DATABASE,

na

sledei nain:

database employee;

Da li je ova komanda uspeno izvrena, moete proveriti ako izdate komandu:


rhow databases;

11,1

Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
vaem raunaru .
Sada imate praznu bazu podataka koja eka da u njoj napravite nekoliko tabela.

Biranje baze podataka


l'rc nego to u bazi podataka employee napravimo novu tabelu ili uradimo bilo ta
drugo u njoj, moramo obavestiti MySQL da elimo da radimo u naoj novoj bazi
podataka. To se radi pomou komande use, na sledei nain:
noe employee;

Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvrimo od
s.tda pa nadalje, podrazumevae se da se odnose na tu bazu podataka .

44

t'raviJenJe tiltlcla

Pog lavlje 4 Pravljenje baza podataka, tabela i indeksa

ultactPerson varchar ( 80) ,


t'lmtac tNumber char(l2)
ype= InnoDB;

Pravlj enje tabela


Tabele u bazi podataka employee napraviemo pomou SQL-ove komande CREATE
TABLE. Uobiajen oblik te komande je sledei:
create table

imetabele

( definicije kolona tabele )

tle table assignment

[type=tip_tabele];

Kao to vidite, komanda poinje reima create table, iza kojih sledi ime tabele
koju bismo eleli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na
kraju komande moete po potrebi zadati tip maine baze podataka koji biste eleli da
se koristi.

1 l lentiD int not null references client (clientiD),


111ployeeiD int not null references employee (employeeiD),
WtJrkda te date not null,
liours float,
p t i ma ry key (clientiD, employeeiD, workdate)
lype= InnoDB;

Primer izrade tabele


Postupak emo ilustrovati primerom izrade tabele. U listingu 4.1 prikazana je grupa
SQL-ovih komandi koja formira bazu podataka employee. Unesite ih runo, ili preuzmite datoteku (zajedno s neto pro bnih podataka za bazu) sa Web lokacije posveene
ovoj knjizi.
Listing 4.1

SQL-ove komande koje formiraju bazu podataka employee

drop database if exists employee;


create database employee;
use employee;
create table department
(

departmentiD int not null auto increment primary key,


name varchar(30)
type=InnoDB;
create table employee
employeeiD int not null auto increment primary key,
name varchar(BO),
job varchar (30),
departmentiD int not null references department(departmentiD)
type=InnoDB;
create table employeeSkills
employeeiD int not null references employee(employeeiD),
skill varchar(l5) not null,
primary key (employeeiD, skill)
type=InnoDB;
create table client
client ID int not null auto increment pri mary key',
name varchar(40),
address varchar(lOO),

Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci.


l'oc emo od:
ol t op database if exists employee;
()va komanda ispituje da li ve postoji baza podataka ije je ime employee; ako
l'" ' toji, ona se brie, to vam "priprema teren", ako se tako moe rei. To nije ba
111oph odno i moe biti ak i opasno, ali ovde smo to uradili da bismo obezbedili da
111"'1 skript za izradu baze podataka uvek bude delotvoran, ak i ako ste ranije neto
l ' pcrim.entisali s bazom podataka employee.
Ukoliko MySQL koristite u okruenju iji niste vlasnik, moe se dogoditi da koml'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop
1.11 , ba se. U tom sluaju uklonite taj red iz skripta (ali proverite da ne postoji baza
pnd.ltaka ije je ime employee) .
Z atim fonniramo bazu podataka i otvaramo je (biramo da je koristimo), kao to ste
1 1111j c radili:
11 c1te database employee;
11w employee;
Sada poinjemo izradu tabela unutar te baze podataka. Najpre pravimo tabelu
'it'partment, na sledei nain:
1" 1 .a te table department
(

departmentiD int not null auto increment primary key,


name varchar(20)
Lype =InnoDB;
Ova tabela ima dve kolone, departmentiD (ifra slube), koja je primarni klju,
1 tl.lmc (naziv slube). Kolone tabele deklariemo tako to zadamo listu deklaracija
kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne
111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona.
Ovo je naa prva SQL komanda koja se rasprostire u vie redova. Budui da su
ll.il'ziku SQL razmaci nebitni, komande moemo pisati u obliku koji nam najbolje
od govara. Uobiajeno je da se stavke komande CREATE piu svaka u svom redu, da bi
l l'l,l komanda bila itUivija . Interpretator jezika QL ne e pokuati da rastuma i valt

46

!'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa

komandu dok ne otkucate zavrni znak taka i zarez (;) i pritisnete taster Enter.
(Moete se opredeliti i da komande zavravate znacima \g, ali se znak taka i zarez
znatno ee koristi.)
U ovoj tabeli deklariemo dve kolone. Svaka deklaracija kolone poinje imenom
kolone, za ime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu
kolonu ovog primera jer se neto lake razume. Deklaracija
name varchar(20)
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znai
daje u pitanju znakovna vrednost promenljive duine, koja u ovom sluaju moe
sadrati najvie 20 znakova. Mogli smo da zadamo i tip char, to je znakovna vrednost
fiksne duine. Bez obzira na to da li zadate varchar ili char, nain rada s tim podacima se nee razlikovati, jedina razlika je u obliku u kojem se ti podaci smetaju u
memoriju. Podatak tipa varchar (2 o) zauzima onoliko prostora koliko je potrebno za
skladitenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 znakova, bez obzira na to da lije u njega smetena bilo kakva vrednost.Vie o relativnim
prednostima i nedostacima ovih tipova podataka bie rei odeljku "Tipovi podataka u
kolonama", u nastavku ovog poglavlja.
Pogledajmo sada definiciju prve kolone, koja izgleda ovako:
departmentiD int not null auto_increment primary key,
Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj
(ne ponavlja se) koji emo koristiti za identifikovanje pojedinih slubi i odeljaka
kompanije.
Deklaraciji tipa podataka kolone slede dodatni podaci o koloni.
Prvo smo zadali da je ta kolona tipa not null - drugim reima , u svakom redu
tabele, ta kolona mora sadrati neku vrednost.
Drugo, zadali smo daje ta kolona takoe tipa auto_increment. To je veoma
korisna mogunost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo
ifru slube, MySQL e sam do deli ti jedinstven broj koji e biti sledei po redosledu
auto_increment sekvence (niza). To e vam prilino olakati ivot.
Na kraju, odredba primary key znai da e ta kolona biti primarni klju tabele.
Ako se primarni klju sastoji od samo jedne kolone, moe se zadati u ovom obliku. Za
primarne kljueve sastavljene od vie kolona mora se upotrebiti drugi oblik komande,
koji emo razmotriti u nastavku ovog poglavlja.
Time se zavrava definicija tabele department. A sada, pogledajte sam kraj SQL-ove
komande. Iza zavrne zagrade nalazi se sledei red:
type=InnoDB
Time se zadaje da tabela treba da koristi mainu baze podataka InnoDB.Ako paljivije pogledate definicije tabela, uoiete da smo sve tabele deklarisali kao InnoDB
tabele.

l'raviJenje tabela

ta to tano znai? MySQL podrava razne maine baze podataka, koje emo detalj
nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
Ako elite da koristite My ISAM tabele, nije neophodno da na kraj komande create
database dodate odredbu type.
U ovom sluaju potrebne su nam InnoDB tabele zato to emo u nekoliko primera
koristiti spoljne kljueve. Maina baze podataka InnoDB podrava spoljne kljueve i
lra nsakcije, to nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele esto
H l bre od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
Mogli smo da zadamo tabele razliitih tipova i da imamo, na primer, nekoliko
lnnoDB tabela i nekoliko MyiSAM tabela (pa ak i tabele jo nekih drugih tipova,
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi emo iskljuivo
lnnoDB tabele.
Pogledajmo drugu komandu create table:
crea te table employee
employeeiD int not null auto_increment primary key,
name varchar(BO),
job varchar (15) ,
departmentiD int not null references department(departmentiD)
t ype=InnoDB;
U ovoj komandi samo je jedan deo sintakse nov. Posle dnja kolona tabele employee
JL' ifra slube (departmentiD) u kojoj zaposleni radi. To je spoljni klju. U definiciji
t.1bele to se deklarie pomou odredbe references, na sledei nain:
departmentiD int not null references department(departmentiD)
Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
kolonu (povezana je s kolonom) department ID tabele department.
Imajte u vidu da sintaksu za spoljni klju moemo koristiti zato to je tabela
employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih kljueva
nij e mogua. Prema planu razvoja, trebalo bi da spoljni kljuevi u MyiSAM tabelama
hudu podrani i jednoj od buduih verzija MySQL-a, verovatno u verziji 5.1.
Pogledajte sada treu komandu create table:
create table employeeSkills
employeeiD int not null references employee(employeeiD),
s kill varchar(15) not null,
p rimary key (employeeiD, skill)
type=InnoDB;
U ovoj tabeli takoe imamo spoljni klju; to je kolona employee ID. Zanimljivo u
vezi s definicijom ove tabele jeste to da ona ima primarni klju koji se sastoji od dve
kolone . Kao to vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim
JC rasebno deklarisan primarni klju u sledeem redu:
pt l.mary key

(employeeiD, skill)

48

"Uli ld ll Ud \..nCJ-\ lC l J-\ DLC

Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

definicija_kolone:

Budui da u sintaksi definicija drugih tabela nema nieg novog, neemo ih detaljno

ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT


podrazumevana_vrednost ] [AUTO_INCREMENT]
[PRIMARY KEY] [definicija_reference]
ili
PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili
KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili
INDEX [ime_indeksa] (ime_indeksirane_kolone, ... )
ili
UNIQUE [INDEX] [ime_ind eksirane_kolone , ... )
ili
FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
ili
[CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone , ... )
[definicija_reference]

objanjavati. Obratite panju na to da smo u tabeli assignment upotrebili nekoliko


novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokretnim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku
ovog poglavlja bie vie rei o tim tipovim kolona.
Pomou sledee komande moete proveriti da li su tabele na vaem sistemu tano
podeene:
show tables;
Trebalo bi da dobijete

sledee

rezultate:

ili

+-------- ------------+
l Tables_in_employee l
+--------------------+
assignment
client
department
employee
employeeSkills

+--------------------+
Detaljnije podatke o strukturi svake tabele moete dobiti pomou komande describe; na primer:
describe department;
Trebalo bi da na svom ekranu dobijete rezultate nalik na sledee:

+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field

Type

Collation

l
l

bina:ry
latinl_swedish_ci

Null

l
l

YES

Key

l
l

PRI

Default

l
l

NULL
NULL

Extra

l
l

auto_increment

+--------------+-------------+-------------------+------+-----+---------+----------------+
1 departmentiD l
1 name
l

int (ll)
varchar(20)

l
l

+--------------+-------------+-------------------+------+-----+---------+----------------+
U ovoj fazi korisno bi bilo da proverite i ostale tabele.

Komanda CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS]

ime tabele

[ (definicija_kolone, ... ) l
[ope i j e_ za_ tabel u] [komanda_ se l e ct l

ili

CREATE [TEMPORARY] TABLE [IF NOT EXISTS]


izvorna_ tabela;

ime tabele

Pogledajmo detaljnije opcije koje postoje u optoj definiciji.


Rezervisana re TEMPORARY omoguava izradu privremene tabele koja e biti
dosegljiva samo u tekuoj sesiji, a kada se veza s bazom podataka zatvori, tabela se
automatski brie.
Odredbu IF NOT EXISTS moete upotrebiti da biste napravili novu tabelu samo
ako ne postoji tabela s imenom koje ste zadali.
Pomou odredbe LIKE izvorna_ tabela moete napraviti novu tabelu koja ima
istu emu kao izvorna tabela.
U komandi CREATE TABLE deklariemo unutar zagrada kolone koje nam trebaju,
njihove tipove podataka i druge informacije koje se tiu strukture tabele. Najjednostavnija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U narednom odeljku ovog poglavlja objasniemo vaee tipove podataka za kolone tabele.
Svaku deklaraciju kolone moemo, po potrebi, proiriti sledeim opcijama:
Svaku kolonu moemo deklarisati kao NOT NULL ili NULL, to znai da ne dozvoljavamo da kolona sadri vrednost NULL (opcija NOT NULL) ili da prihvatamo vrednost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva.

Poto ste videli primer, moemo prei na opis cele sintakse komande CREATE TABLE.
U MySQL-ovoj dokumentaciji stoji da komanda ima sledei opti oblik:

LIKE

CHECK (izraz)

Pomou

rezervisane rei DEFAULT iza koje sledi neka vrednost moete zadati
podrazumevanu vrednost za kolonu.

Rezervisana re AUTO_INCREMENT omoguava generisanje rednog broja, kao to


smo to uinili u prethodnom primeru.Ta vrednost, koja se automatski generie
bie za jedan vea od tekue najvee vrednosti iz tabele. Prvi red podataka koji
un este u tabel u imae redni broj l. Tabela moe sadrati samo jednu kolonu tipa
AUTO_INCREMENT, koja mora biti indeksirana. Obratite panju na to da u prethodnim primerima nismo runo napravili nijedan indeks; meutim, neki su ipak bili
automatski napravljeni. Indeksi se automatski prave za kolone koje deklariete kao
primarne kljueve (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo
deklarisali kao AUTO INCREMENT.
Pojedine kolone moemo deklarisati kao primarne
KEY).

kljueve

(odredba PRIMARY

Pojedine kolone moemo deklarisati kao spoljne kljueve, pomou opcije REFERENCES, kao u ovom primeru.

rU~IdVIJC

..

rldVIJCIIJC UdLd fJUUdldl\d 0 ldUCid l IIIUCI\)d

1\.UIIIdllUd \..nC/"\1 C

Osim imena kolona i tipova podataka u njima, u ovom delu komande


TABLE moemo zadati i dodatne podatke:

CREATE

Moemo zadati primarni klju koji se sastoji od vie kolona, kao u ovom primeru, tako to iza opcije PRIMARY KEY navedemo imena kolona koje ine primarni klju. Na taj nain moe se zadati i primarni klju koji se sastoji od samo
jedne kolone. Kolona deklarisana kao PRI MARY KEY moe sadrati samo jedinstvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne moe
sadrati vrednost null.

Moemo zadati jo nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri''"w pre svega optimizaciji. Neke meu njima objasniemo u poglavlju 18",0ptimi"v.tnje baze podataka" . To su sledee opcij e:
AUTO_INCREMENT = #

po etnu

Pomou

opcije UNIQUE zadaje se da odreena kolona moe sadrati samo jedinstvene vrednosti. Kolone deklarisane kao UNIQUE takoe se automatski indeksiraju.

Pomou

opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pretraivanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraivanje
moete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9.

Opcija FOREIGN KEY


primarne kljueve.

omoguava

da deklariete spoljne

kljueve

na isti

nain

kao

Iza zatvarajue zagrade moete zadati odreene opcije koje se tiu tabele. Dosad
smo ve videli da to moe biti tip tabele.Tipovi tabela detaljnije su opisani u poglavlju 9.
Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele moe biti jedan
od sledeih:
My ISAM, koji se podrazumeva, veoma je brz i podrava indekse za tekstualno
pretraivanje; zamenjuje nekadanji podrazumevani tip ISAM.
ISAM je stariji tip tabela. Slian je tipu My ISAM ali prua manje mogunosti,
zbog ega bi trebalo da umesto njega uvek koristite MyiSAM.
InnoDB je maina baze podataka usklaena s grupom pravila ACID koja
podrava transakcije, spoljne kljueve i zakljuavanje podataka na nivou pojedinanog reda tabele.
BDB (Berkeley DB) je maina baze podataka koja podrava transakcije i zakljuavanje podataka na nivou stranice tabele.
Ceo sadraj tabela tipa HEAP uva se u memoriji i nikad se ne upisuje na disk;
zahvaljujui tome, te tabele su veoma brze, ali veliina im je ograniena i podaci
iz njih se ne mogu restaurirati ukoliko se sistem pokvari.
Tabele tipa MERGE omoguavaju kombinovanje vie tabela tipa MyiSAM koje
imaju istu strukturu, tako da se podaci iz njih itaju kao da radimo s jednom tabelom.To se moe iskoristiti kada operativni sistem ograniava maksimalnu veliinu
datoteka - pa zbog toga i tabela.

vrednost

Omoguava

razliitu

AVG_ROW_LENGTH = #

od

da u koloni tipa

auto_increment

zadate

1.

Omogu ava

prosenu

da zadate

duinu reda da biste

"pomogli" maini baze podataka.


Omoguava da ukljuite izraunavanje kontrolnog zbira u redovima tabele, to moe biti korisno kada reavate problem oteenog sadraja
tabele. Zadajte vrednost 1 da biste ukljuili izraunavanje. Ova opcija je standardno iskljuena a upotrebljiva je samo za My ISAM tabele.
COMMENT = "tekst" Omoguava da tabeli pridruite neku napomenu.

CHECKSUM = l

Opcije INDEX i KEY su sinonimi i znae da e zadata kolona (ili kolone) biti
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadre
jedinstvene vrednosti.

IMOLI:.

MAX ROWS = #

Ovom opcijom se zadaje maksimalan broj redova koji se moe

uneti u tabelu.
MIN ROWS = #

Ovom opcijom se zadaje minimalan broj redova koji tabela

moe sadrati.
{O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
sadraj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
vrednost 1, svi indeksi e se pakovati; ako zadate vrednost o, nijedan indeks se
n e e pakovati.
PASSWORD = "tekst U standardnoj verziji MySQL-a ova opcija na radi ba
nita.

PACK_KEYS =

{o l l } Omoguava da odloite auriranje indeksa dok


ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.

DELAY_KEY_WRITE =

ROW_FORMAT= {default

dynamic

fixed

compressed }

Omoguava

da zadate format u kojem se skladite podaci u redovima tabele. Upotrebljiva je


samo za MyiSAM tabele.
RAID_TYPE= { l

Omoguava

STRIPED

RAIDO

RAID_CHUNKS=# RAID_CHUNKSIZE=#

da u cilju optimizovanja servera zadate tip RAID grupe diskova koji

imate.
UNION=

(ime_tabele, [ime_tabele ])

tabelama tipa MERGE,

omoguava

Ovaopcija,namenjenaiskljuivo

da zadate tabele koje

ine

grupu MERGE.

l FIRST l LAST } Ova opcija je upotrebljiva iskljuivo


za tabele tipa MERGE i slui da se zada tabela u koju se podaci umeu.

INSERT_METHOD= {NO

Pomou ove opcije moete


zadati direktorijum u koji elite da se smetaju podaci tabele.

DATA DIRECTORY="apsolutna putanja

Pomou ove opcije moete


zadati direktorijum u koji elite da se smeta sadraj indeksa tabele.

INDEX DIRECTORY="apsolutna putanja"

izriito

izri ito

rU~IdVIJ'C

""t

rldVIJ'CIIJ'C UdLd JJUUdldl\d, lciU'Cicl l IIIU\..1\.>cl

Tipovi podataka u kolonama

I najzad, ako ponovo pogledate opti oblik komande CREATE TABLE, uoiete da
komandu CREATE TABLE moete zavriti komandom SELECT. SELECT je SQL-ova
komanda koja omoguava uitavanje redova iz jedne ili vie tabela. (Podrobnije je
opisana u poglavljima 6, 7 i 8 ove knjige.) Pomou tc opcije moete napuniti novu
tabelu podacima koje uitava zadata komanda select.

zauzima tri bajta (2 24 moguih vrednosti).


zauzima osam bajtova (2 64 moguih vrednosti).

MEDIUMINT
BIGINT

Aproksirnirani numeriki tipovi opisani su u nastavku teksta.

Tip FLOAT

Tipovi podataka u kolonama


U MySQL-u postoje tri osnovna tipa kolona: numeriki, znakovni ili tekstualni
i datumsko/vremenski. Objasniemo ih jedan po jedan u narednim odcljcima.
Numeriki

Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti.


Moe predstavljati pozitivan broj u opsegu od 1.18 x 10-38 do 3.40 x 10 38 i slian opseg
11egativnih brojeva.

Tip DOUBLE
tipovi podataka

Numeriki

tipovi se koriste za skladitenje brojeva. U naem primeru, upotrebili smo


tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva
primera podtipova numerikih tipova: tani numeriki tipovi i aproksimirani (priblini) numeriki tipovi.
Za numerike tipove moete zadati ukupan broj cifara koji sc prikazuje (irina, M)
i, za tipove s pokretnim zarezom, broj decimalnih mesta, D.Vrednosti tih parametara
zadaju se iza deklaracije tipa podatka; na primer:

Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi


'la DOUBLE SU REAL i DOUBLE PRECISION. Mogu predstavljati pozitivan broj u opsegu
308
od 2.23 x 10- do 1.80 x 10 308 i slian opseg negativnih brojeva.

Znakovni i tekstualni tipovi podataka


MySQL podrava vie znakovnih i tekstualnih tipova podataka. Osnovni tekstualni
tipovi SU CHAR, VARCHAR, TEXT, BLOB, ENUM i SET. Opisaemo ih jedan po jedan u
11astavku teksta.

plata decimal(lO, 2)

Ova komanda omoguava prikazivanje vrednosti sa ukupno 12 cifara i dva decimalna mesta.
Moete se opredeliti da ne zadate nijedan od ovih parametara, ili moete zadati
samo ukupnu irinu za prikazivanje, ili i irinu i broj decimala.
Uz numerike tipove moete zadati rezervisane rei UNSIGNED i/ili ZEROFILL.
Rezervisana re UNSIGNED znai da kolona moe sadrati samo nule ili pozitivne
vrednosti. Rezervisana re ZEROFILL znai da e se vrednosti iz kolone prikazivati
s vodeim nulama.
Tani numeriki tipovi opisani su u nastavku teksta.

Tip NUMERIC ili DECIMAL


O be rei oznaavaju potpuno isti tip podataka, a DECIMAL se moe skratiti na DEC. Ovi
tipovi omoguavaju uvanje tanih vrednosti s pokretnim zarezom i obino se koriste
za rad s novanim vrednostima. Opseg moguih vrednosti jednak je kao za brojeve
s pokretnim zarezom dvostruke preciznosti.

Tip INTEGER i varijante


Ovaj tip se moe skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se
smctaju u etiri bajta, to daje 232 mogue vrednosti. Tip INT ima nekoliko varijanti:
zauzima jedan bajt (28 moguih vrednosti). Rezervisane rei
su sinonimi za TINYINT.
16
SMALLINT zauzima dva bajta (2 moguih vrednosti).

TINYINT

BIT

i BOOL

Tip CHAR
l'ip CHAR omoguava skladitenje znakovnih vrednosti fiksne duine. Kao u primeru
haze podataka employee, rezervisanoj rei CHAR obino sledi duina (broj znakova) znakovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate duinu, podrazumeva se CHAR ( 1) .
Maksimalna duina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upie
ll kolo~ u ta?ele, on uvek ima duinu koju ste zadali u definiciji kolone. To se postie
d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri
liCJtavanJU podatka IZ kolone tipa CHAR.
Oigledno je da podaci tipa CHAR zauzimaju vie prostora na disku od ekvivail'J~tnih z~akovnih ~~ednosti promenljive duine. Prednost im je to to se podaci bre
u!tavaju 1z tabele CIJe su sve kolone fiksne irine (tj. CHAR, numeriki ili date).
ll udui da je brzina uitavanja podataka esto vanija od prostora koji oni zauzimaju
na disku, moda ete se opredeli ti da tekstualna polja u kojima se vrednosti ne razlikLUU mnogo po duini deklariete kao CHAR da biste (malo) optimizovali sistem.
Ispred deklaracija oba tipa, CHAR i VARCHAR, moete dodati rezervisanu re NATIONAL, to znai da elite da ograniite sadraj na standardni skup znakova. Poto se ova
opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibilllOSt izmeu razliitih platformi.
Deklaracijama tipova CHAR i VARCHAR moe slediti rezervisana re BINARY to znai
d.t sc pri poreer0u znakovnih vrednosti pravi razlika izmeu malih i velikih slova.
Podrazumevani nain poreenja je da se ta razlika ne pravi.

54

Pravljenje indeksa

Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Tip VARCHAR

fip TIME

..

Tip VARCHAR omoguava skladitenje znakovnih nizova promenljlVe duzme. Duzma


podataka zadaje se izmeu zagrada iza imena tipa, na primer, VARCHAR (l ol . Opseg

Ovaj tip <:n;oguava skladitenje podataka koji predstavljaju vreme, koje se prikazuje u
lormatu CC:MM:SS.

moguih vrednosti je od O do 255.

Tip DATETIME
Ovaj tip je kombinacija dva prethodna. Format je GGGG-MM-DD :MM:SS.

Tipovi TEXT, BLOB i njihove varijante


Tipovi TEXT omoguavaju skladitenje tekstualnih podataka duih od ono.g to m?.e

da stane u tipove CHAR i VARCHAR. BLOB je skraenica za Binary Large OBject (vehki
binarni objekat). Ovi tipovi se meusobno ni po emu ne razlikuju, jedino je BLOB
namenjen uvanju binarnih a ne tekstualnih podataka. Pri poreenju podataka tipa
BLOB pravi se razlika izmeu malih i velikih slova, dok se to ne ini pri poreenju P~.da
taka tipa TEXT. Oba tipa su promenljive duine i za oba postoje varijante razmh velicma:
Tip

TINYTEXT

ili

TINYBLOB

fip TIMESTAMP
<)vo je koristan tip podataka za kolone tabele. Ako u odreenom redu ne zada te vredIIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
t.tbcli ili kada je poslednji put izmenjen sadraj reda.
Kada uitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE'1'IME. To je znaajna razlika izmeu MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla' .tciji kolone tipa TIMESTAMP mogli da zadate irinu na kojoj se prikazuju podaci iz
ll' kolone .

moe sadrati najvie 255 (to je 2 -1) znakova ili

baj tova.
Tip TEXT ili BLOB moe sadrati najvie 65,535 (i 6 -1) znakova ili bajtova (64 KB).
24
Tip MEDIUMTEXT ili MEDIUMBLOB moe sadrati najvie 16,777,215 (2 -1) znakova

rip YEAR
()vaj tip omoguava skladitenje podataka koji predstavljaju godine. Kada deklariete
~o! onu ovog tipa, moete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podrat umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.

ili bajtova (16 MB).


32
Tip LONGTEXT ili LONGBLOB moe sadrati najvie 4,294,967,295 (2 -1) znakova
ili bajtova (4 GB).

Tip ENUM

,.

Pravljenje indeksa

Ovaj tip podataka omoguava da zadate hstu moguClh vrednost1. Kolona tabele ~oze
sadrati jednu vrednost iz nabroj anog skupa moguih. Tip podataka ENUM deklanse se
na

sledei nain:

pol enum('m', '')


Poto vrednost tipa ENUM moe biti i NULL, mogue vrednosti kolone pol su m,
, NULL ili error.

Tip SET
Tip

SET je

slian tipu ENUM s tom razlikom to kolone u redovima tabele mogu sadrzat1

i vie vrednosti iz nabrojanog skupa moguih.

Datumski i vremenski tipovi podataka


MySQL podrava vie tipova za rad s datumima i vremenima, koji su opisani u narednim odeljcima.

Tip DATE

Tip date omoguava skladitenje datuma. MySQL oekuje da datum bude u ISO
redosledu godina-mesec-dan, ime se izbegavaju problemi usled razliitih formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.

Sve indekse koji vam trebaju najee ete praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklariete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, autolll.ltski se formira i indeks.
Ponekad ete ustanoviti da koristite vei broj upita koji obuhvataju kolonu za koju
11istc definisali indeks; u takvim sluajevima moete dodati nov indeks pomou
~oman de CREATE INDEX.
Zanimljivo je to da se, pre izvravanja, komanda CREATE INDEX preslikava u
komandu ALTER TABLE. Komanda ALTER TABLE moe se upotrebiti i za mnoge druge
11.11ncne, koje emo opisati u poslednjem odeljku ovog poglavlja.
Na primer, tabeli employee moemo dodati nov indeks na sledei nain:
<'l' ate index name on employee (name) ;
Ova komanda pravi indeks ije je ime name nad kolonom name tabele employee.
Komanda create index nema puno opcija. Ispred rei index moete dodati re
liN J QUE ako elite indeks s jedinstvenim vrednostima. Osim toga, ispred rei index
111octe navesti rezervisanu re FULLTEXT da biste napravili indeks za tekstualno pre!I,J~ivanje MyiSAM tabele. (Vie detalja o tome nai ete u poglavlju 9.)

56

Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

tzmena struKture postoJece

t110e1e

Indeksi definisani nad kolonama tipa char i varchar mogu se ograniiti na prvih
nekoliko znakova u polju. To ete uraditi tako to iza imena indeksirane kolone zada te
izmeu zagrada broj znakova koji elite da se indeksira, na primer:

ll udui da komanda ALTER TABLE prua veliki broj mogunosti, ima i veliki broj
'Ja . Opti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
' '~. led a ovako:

create index part_name on employee(name(S));

/l.' i'I>R [IGNORE ] TABLE ime tabele vrsta_izmene [,

Poto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad
kolonama, indeksiranje samo nekoliko poetnih znakova poboljava
performanse.

lj H

t a_ izmene:

numerikim

Brisanje baza podataka, tabela i indeksa


Poto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da nauite
i da ih briete. Rezervisana re koja vam treba za tu namenu jeste DROP.
Celu bazu podataka, zajedno s njenim sadrajem, briete pomou sledee komande
(nemojte je jo zadati!):
drop database employee;
Ispred imena baze podataka moete dodati neobaveznu opciju IF EXISTS. Ako se
vratite na listing 4.1, videete da je u njemu upotrebljena ba ova verzija komande
DROP DATABASE.

pomou

Tabelu moete izbrisati

komande

DROP TABLE,

na primer:

drop table assignment;


Opti oblik komande
DROP

[TEMPORARY]

DROP TABLE

TABLE

izgleda ovako:

[IF EXISTS]

ime_tabele [, ime tabele, ... ]

Ako elite da izbriete privremenu tabelu, upotrebite rezervisanu re TEMPORARY


Istom komandom moete izbrisati vie tabela ako zadate listu njihovih imena razdvojenih zarezima. Neobavezna opcija IF EXISTS deluje na isti nain kao u komandi
DROP DATABASE.

Indeks briete

pomou

komande

DROP INDEX,

na primer:

drop index part_name on employee;


Kao to vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridruen.

lzmena strukture postojee tabele


Osim izrade novih tabela i brisanja postojeih, esto e vam zatrebati da izmenite
strukturu postojee tabele. To se moe uraditi pomou komande ALTER TABLE- ona
ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela.
Na primer, indeks nad ta belom employee mogli smo da napravimo na sledei nain:
alter table employee
add index name (name) ;

vrsta_izmene ... ]

il l
lli
l li
l li
l li
ll i

l li
l 1i
11 i

l ll
l Ji
l li
lli
1l i
lli

ll i
ll i

ADD
ADD
ADD
ADD
ADD
ADD
ADD

[COLUMN] definicija_kolone [FIRST l AFTER ime kolone


[COLUMN] (definicija_kolone, definicija kolon~, ... )
INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
PRIMARY KEY (ime indeksirane kolone, ... )
UNIQUE [ime_indeksa] (ime indeksirane kolone, . . . )
FULLTEXT [ime_indeksa] (i;e indeksira;e kolone, ... )
[CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]

(ime_indeksirane_kolone, ... )
[definicija_reference]
ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}
CHANGE [COLUMN] staro_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone]
MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
DROP [COLUMN] ime_kolone
DROP PRIMARY KEY
DROP INDEX ime_indeksa
DISABLE KEYS
ENABLE KEYS
RENAME [TO] novo_ime tabele
ORDER BY ime kolone

opcije_za_tabelu

Veina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
' 'll EATE TABLE, kao to je ADD PRI MARY KEY Opisaemo ukratko one koje moda nisu

t1.1[j asnije.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omoguavaju izmenu defilltnj e kolone ili njenog mesta u tabeli.
Opcija DROP COLUMN brie kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1NDEX briu samo indeks pridruen koloni.
Opcija DISABLE KEYS nalae MySQL-u da ne aurira sadraj indeksa, ali upotrei>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS ukljuuje auriranje indeksa.
Opcija RENAME omoguava promenu imena tabele.
Opcija ORDER BY e poreati zadatim redosledom redove tabele na koju je primeIIJCI1a, slino opciji ORDER BY u komandi SELECT, koju emo razmatrati u poglavlju 6,
.. Korienje upita u MySQL-u". Taj red o sled nee biti ouvan kada se kasnije unesu
Ilovi podaci u tabelu.
Opcija opcije_za_tabelu omoguava da na kraj komande zadate iste opcije za
t.ll>elu kao u komandi CREATE TABLE- vie detalja o tome nai ete u prethodnom
dl'lu ovog poglavlja.

58

Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

;:,azetaK

l ipovi podataka za kolone

Saetak
U ovom poglavlju, nauili ste da pravite i briete baze podataka, tabele i indekse, i da
izmenite strukturu postojee tabele.

ldentifikatori i razlikovanje malih i velikih slova


Za imena baza podataka vae ista pravila razlikovanja malih i velikih slova kao u
direktorij urnima vaeg operativnog sistema. Za imena tabela vae ista pravila kao
za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika
izmeu malih i velikih slova.
Svi identifikatori, osim alijasa, mogu sadrati najvie 64 znaka. Duina alijasa
moe biti najvie 255 znakova.
Identifikatori mogu da sadre veinu postojeih znakova, ali imena baze podataka
ne mogu sadrati znakove l, \ i . a imena tabela ne mogu sadrati znakove . i l.
Rezervisane rei moete koristiti kao identifikatore, pod uslovom da ih piete
izmeu navodnika.

Tani numeriki tipovi

SU

TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC

i DECIMAL.

Aproksimirani numeriki tipovi su FLOAT i DOUBLE.


Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB .
Za rad S datumima i vremenima slue tipovi DATE, TIME, DATETIME, TIMESTAMP
i YEAR.
Za navedena imena tipova podataka postoji i vie alijasa (sinonima).

Brisanje baza podataka, tabela i indeksa


Bazu podataka briete

pomou

komande

drop database ime_baze;

Tabelu briete

pomou

komande

drop table ime_tabele;

Indeks briete

pomou

komande

drop index ime_indeksa on ime_tabele;

Pravljenje baze podataka


create database ime_baze; pravi novu bazu podataka.
use database ime_baze; bira (otvara) bazu podataka za upotrebu.

Strukturu tabele menjate pomou komande ALTER TABLE, iji opti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]

Pravljenje tabela
Tome slui komanda create table,

lzmena strukture postojee tabele

iji

opti oblik izgleda ovako:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele


[ (definicija_kolone, ... ) l
[opcije_za_tabelu] [komanda_select]
ili
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE
ime_postojee_tabele;

definicija_kolone:
ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT
podrazumevana_vrednost] [AUTO_INCREMENT]
[PRIMARY KEY] [definicija_reference]
ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili
[CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili CHECK (izraz)

vrsta izmene:
ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
ili ADD [COLUMN] (definicija_kolone, definicija_kolo;e, ... )
ili ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili ADD UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... )
ili ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
(ime_indeksirane_kolone, ... )
[definicija_reference]
ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l
DROP DEFAULT}
ili CHANGE [COLUMN] tekue_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone]
ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone]
ili DROP [COLUMN] ime_kolone
ili DROP PRIMARY KEY
ili DROP INDEX ime_indeksa
ili DISABLE KEYS
ili ENABLE KEYS
ili RENAME [TO] novo_ime tabele
ili ORDER BY ime_kolone
ili opcije_za_tabelu

bU

roglaVIJe 4 rraVIJenJe oaza poaataKa, taoe1a 1 maeKsa

VU~UVUII

5. Da biste izbrisali bazu podataka (ije je ime dbname) i ceo njen sadraj, zadali biste

Pitanja

a) drop all tables on dbname;

1. ta od sledeeg nije ispravno ime tabele u MySQL-u?

b) drop database dbname;

a) employee

e) drop dbname;

b) select

e) employee.skill
d) employeeSkills
2. Od

sledeih

tvrdnji o tipovima podataka CHAR i VARCHAR, koje su tane?

d) delete database dbname;

Vebe
1. Napiite SQL komande koje formiraju bazu podataka porudzbine

a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadraj.
b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisivanju na disk.

porudzbina(porudzbinaiD, porudzbinaDatum, l_c_t.lP!l.cJQ)


porudzbinaStavka(B_'?:_':~~-~~~~-I_l?., r:<?.~~lP..robaKolicina)
roba(robaiD, robaN aziv)

d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na
sadraj.

Moete izabrati proizvoljne tipove podataka.

3. Pre nego to ponemo da pravimo tabele u bazi podataka, moramo prvo


a) napraviti indekse tabela
b) napraviti bazu podataka
e) napraviti bazu podataka i otvoriti je za upotrebu
d) napraviti sve kolone tabela
4. Od sledeih komandi CREATE TABLE, koja je sintaksno ispravna?

Testirajte komande u MySQL-u, a zatim pregledajte rezultujue tabele pomou


komandi SHOW i DESCRIBE.
2. Svakoj porudbini u tabeli porudzbine elimo da dodamo novo polje nazvano
napomena, koje e biti tipa TEXT. Obavite to pomou odgovarajue komande
ALTER TABLE, a zatim proverite rezultat pomou komande DESCRIBE.
3. Izbriite bazu podataka porudzbine.

a)

Odgovori
Pitanja
1. e

b)
create table department type=InnoDB

2. a

3. e
4. d
5. b

department ID int not null auto inc remen t pri mary key,
name varchar ( 2 o}
};

e)
create department
department ID int not null auto - increment pri mary key,
name varchar(20}
type=InnoDB;

Vebe
create database porudzbine;
use porudzbine;
cre ate table kupac

d)
create table department
(

department ID int not null auto- inc remen t pri mary key,
name varchar(20}
type =InnoDB;

ema

kupac(kupaciD, kupaclme, kupacAdresa)

e) Kolona tipa CHAR, u proseku, zauzima manje prostora na disku od ekvivalentne kolone tipa VARCHAR.

create table department


department ID int not null auto - inc remen t pri mary key,
name varchar(20}
type=InnoDB;

ija je

sledea:

kupaciD int not null auto increment primary key,


kupacime varchar(20},
kupacAdre sa varchar(BO}
t ype
I nnoDB ;

b.l

roglaVIJe 4 rraVIJenJe oaza pooaiaKa, Iaoe1a 1 moeKsa

create table porudzbine

III

porudzbinaiD int not null auto increment primary key,


porudzbinaDatum date,
kupaciD int not null references kupac(kupaciD)
type = InnoDB;
create table roba

Upotreba MySQL-a

robaiD int not null auto_increment primary key,


robaNaziv varchar(20)
type = InnoDB;
create table porudzbinaStavka
porudzbinaiD int not null references porudzbine(porudzbinaiD),
robaiD int not null references roba(robaiD),
robaKolicina int,
primary key (porudzbinaiD, robaiD)
type = InnoDB;

Korienje

upita u MySQL-u

7 Sloeniji upiti
8 Upotreba MySQL-ovih

alter table porudzbine


add column napomena text;
drop database porudzbine;

U sledeem poglavlju
U poglavlju S",Umetanje, brisanje i auriranje podataka", uneemo
u bazu podataka employee.

5 Umetanje, brisanje i auriranje podataka

odreene

podatke

ugraenih

funkcija u komandi SELECT

5
Umetanje, brisanje
i auriranje podataka

OBJASNIEMO

pomou

kako se
komande
i auriraju podaci u MySQL-ovoj bazi podataka .
Razmotriemo sledee teme:
OVOM POGLAVLJU

1 UPDATE umeu

Komanda
Komanda

DELETE

Komanda

UPDATE

INSERT

podataka

pomou

komande

Proirenja: komande

REPLACE

i TRUNCATE.

INSERT, DELETE

Uitavanje

LOAD DATA INFILE

Sada smo preli na komponentu DML (Data Manipulation Language, jezik za rad s
podacima) jezika SQL. Poto nauite kako da umeete nove podatke u bazu podataka,
11arcdnih nekoliko poglavlja proveemo uei mnogobrojne naine za uitavanje
podataka iz baze.

Koman da INSERT
"iQL-ova komanda INSERT slui za umetanje novih redova u tabele. Pogledaemo
najpre jedan primer. U ovom sluaju takoe, komande moete zadavati direktno u
MySQL monitoru ili pisati u datoteku, ili moete preuzeti datoteku s Web lokacije
posveene ovoj knjizi.
U listingu 5.1 prikazano je nekoliko primera komande insert.
employee_data.sql

Listing 5.1

use employee;
lete from department;
insert into department values
(42
'Finance')
(128
'Rs arch and Development')
(Nur.r,
'll um<~ n R aout ces' )

---~~~~~~-------~~~~~-~~----------------......- -

(NlJI,Io,

M II')U l__
l r_H
__,_' _) _; -~~~-~----~~~~~~-------

Komand a INSERT

t'oglaVIJe o umetanJe, onsanJe 1 azumanJe podataka

delete from employee;


insert into employee values
(7513, 'Nora Edwards', 'Programmer',l28),
(9842, 'Ben Smith', 'OBA', 42),
(6651, 'Ajay Patel', 'Programmer', 128),
(9006, candy Burnett, systems Administrator', 128);
delete
insert
(7513,
(7513,
(7513,
(9842,
(6651,
(6651,
(9006,
(9006,

from employeeSkills;
into employeeSkills values
e)'
Perl'),
'Java'),
'DB2'),
'VB'),

'Java'),
'NT'),
'Linux');

delete from client;


insert into client values
(NULL, 'Telco Inc', 'l Collins St Melbourne',
l 95551234 l) '
(NULL, 'The Bank', '100 Bourke St Melbourne',
l 95559876 l) ;

'Fred Smith',
'Jan Tristan',

delete from assignment;


insert into assignment values
(l, 7513, '2003-01-20'' 8.5);
Obratite panju na to da pre nego to dodamo nove podatke u tabelu, izvravamo
komandu DELETE- ni u ovom sluaju to nije neophodno, ali tako ete ukloniti iz
tabele probne podatke koje ste moda ranije uneli. U narednom odeljku vratiemo se
na komandu DELETE.
Osim toga, obratite panju i na to da smo uneli probne podatke koji odgovaraju
primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i
nekoliko dopunskih redova.
Sve navedene komande INSERT meusobno su veoma sline. Pogledajmo prvu da
biste shvatili kako deluju:
insert into department values
(42, 'Finance'),
(128, 'Research and Development'),
(NULL, 'Human Resources'),
(NULL, 'Marketing');
U prvom redu zadali smo ime tabele u koju elimo da unesemo podatke - u ovom
to je tabela department, u koju unosimo etiri reda s podacima. Moda se
seate da tabela department ima dve kolone, departmentiD i name. (U to se moete
uveriti ako izdate komandu describe department.)
sluaju,

U prva dva reda izriito smo zadali vrednosti za kolonu departmentiD. Pogledajmo ponovo definiciju kolone departmentiD. Verovatno se seate iz prethodnog
poglavlja da deklaracija te kolone izgleda ovako:
departmentiD int not null auto_increment primary key
Budui daje u pitanju kolona tipa auto_increment, moemo izriito zadati
vrednost za nju, ili prepustiti MySQL-u da sam generie neku vrednost. (Pri upotrebi
kolona tog tipa obino se preputa MySQL-u da sam izrauna vrednost, ali postoje
i sluajevi, kao to je ovaj, gde ete imati postojeu vrednost koju ete eleti da
upotrebite.)
U redovima s podacima o slubama Human Resources i Marketing, u koloni
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
koji izraunava novu vrednost. Pogledajmo ta emo dobiti s tom komandom
lNSERT.
Ako paljivije pogledate pojedine komande INSERT, uoiete da su podaci koji se
umeu u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Research and Development'. Polunavodnici se ne koriste za numerike tipove.
Ukoliko se podaci uokviruju polunavodnicima, ta treba uraditi kada podatak
sadri polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
Jednostavnije reeno, ispred svakog polunavodnika treba dodati obrnutu kosu crtu
(\), na primer, 'o\'Leary'.
ta treba uraditi ako elimo da obrnuta kosa crta bude ba obrnuta kosa crta, bez
ikakvog posebnog znaenja? U tom sluaju, morate na isti nain preslikati i obrnutu
kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke uitavamo iz baze pomou komande SELECT. Tu komandu emo veoma
detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da e se,
ako zadate:

selec t * from ime_tabele;


uitati

svi podaci koji se nalaze u tabeli.


Ako zadate:

select * from department;


trebalo bi da na ekranu dobijete rezultate nalik na

sledee:

----- ---------+----------------------+
l departmentiD l name
!---------------+----------------------+
~

42
128
129
130

Finance
Research and Develop
Human Resources
Marketing

----------- --+----------------------+
~

rows in set (0.01 sec)

Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment


vrtdnost koja je za jedan vea od tekue najvee vrednosti u koloni.

GB

Poglavlje 5 Umeta nje, brisanj e i auri ra nje podata ka

U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima

Komanda INSERT

sledei

opti oblik:

opcija LOW PRIORITY blokira klijentski program koji umee podatke, dok opcija
DELAYED to ne ini. Ukoliko izdate komandu za umetanje podataka s opcijom
LOW PRIORITY, moda ete morati da saekate pre nego to budete mogli da
nastavite izvravanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
DELAYED, bie vam dozvoljeno da zaponete izvravanje drugog upita, ali onda
morate imati u vidu da vai podaci nee biti upisani u tabelu dok ona ne bude
potpuno slobodna.

INSERT [LOW_PRIORITY l DELAYED] [IGNORE]


[INTO] ime_ tabele [ (ime_kolone, ... ) J
VALUES ((izraz l DEFAULT), ... ),( .. . ), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J
ili

ili

INSERT [LOW_PRIORITY l DELAYED] [IGNORE]


[INTO] ime tabele [ (ime_kolone, ... ) J
SELECT ...

Opcija IGNORE je korisna prvenstveno kada umeete vie redova istovremeno.


Standardno ponaanje je takvo da ukoliko jedan od redova koji pokuavate da
umetnete izazove greku tipa dupliran primarni klju ili duplirana vrednost u
koloni koja prihvata samo jedinstvene vrednosti, dolazi do greke a operacija
umetanja se ponitava. Ako upotrebite opciju IGNORE, greka se zanemaruje a
postupak umetanja se nastavlja s podacima iz sledeeg reda.

INSERT [LOW_PRIORITY l DELAYED] [IGNORE]


[INTO] ime_tabele
SET ime_kolone=(izraz l DEFAULT), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . J

U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite
panju na to da rezervisana re INTO nije obavezna. Mogli smo je izostaviti i zapoeti
upit s insert employee values, ali smatramo da re INTO doprinosi razumljivosti
upita.
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati
listu vrednosti poredanih istim redosledom kao odgovarajue ciljne kolone tabele.
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID,
a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik
omoguava da se jednom komandom INSERT umetne vie novih redova u tabel u.
Drugi oblik komande INSERT zavrava se komandom SELECT. Um.esto da vrednosti umeete runo, ovaj oblik omoguava da podatke uita te iz jedne ili vie tabela
baze podataka i da ih zatim umetnete u ciljnu tabelu.
Trei oblik komande INSERT omoguava da izriito zadate kolone u koje treba
umetnuti podatke. Primer upotrebe ovog oblika komande INSERT:
insert into department
set name='Asset Management';
Ovaj oblik omoguava da umetnete samo jedan red po komandi, ali ne morate da
zadate vrednosti za sve kolone. U ovom primeru, zadajemo vrednost samo za kolonu
name. Sve ostale kolone e preuzeti podrazumevane vrednosti (u kolonama u kojima su
takve vrednosti definisane) ili vrednost NULL. U ovom sluaju, koloni department ID
prosleuje se vrednost NULL, usled ega se aktivira mehanizam auto_increment koji
generie novu vrednost u toj koloni. (U to se moete uveriti ako ponovo izdate
komandu select * from department.)
Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako
one deluju:
Moete zadati da se komanda INSERT izvrava s niskim prioriteom (opcija LOW
PRIORITY), ili da se izvravanje odloi (opcija DELAYED). Obe opcije ine da se
umetanje podataka u tabelu odloi dok vie ne bude nijednog klijenta koji pokuava da uita podatke iz tabele. Razlika izmeu ove dve opcije je u tome to

Moete izriito zadati da kolona treba da preuzme svoju podrazumevanu vrednost ako umesto vrednosti za kolonu zadate opciju DEFAULT.
Opcija ON DUPLICATE KEY UPDATE prua elegantno reenje problema dupliranog primam og kljua ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
komanda update koja menja postojeu vrednost primarnog kljua ili postojeu
jedinstvenu vrednost u koloni tako da se ona vie "ne sudara" s podacima iz
novog reda.
~

N aredni kratak primer ilustruje uobiajeni nain upotrebe opcije ON DUPLICATE


UPDATE:

J,Y

t' teate table warning


(

employeeiD int primary key not null references employee(employI D),


count int default l
) t ype =InnoDB;

' t

insert into warning (employeeiD)


values (6651)
on duplicate key update count=count+l;
Ova opcija je korisna u sluajevima kada ne samo to elite da unesete jedinstvene
vrednosti, ve hoete i da izvrite neku akciju, npr. da poveate odreeni broja, kada
w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog dogaaja je korisna.
Nastavljajui s primerom baze podataka employee, zaposlene kojima je dupliran priIILlrni klju evidentirali bismo u tabeli warning (upozorenje).
Da biste evidentirali upozorenje koje se tie odreenog zaposlenog, izvrite ovu
komandu INSERT. Budui da kolona count ima podrazumevanu vrednost 1 i za nju
111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD bie upisana
vrtdnost 1 svaki put kada umetnete red u tabelu . Svaki naredni red koji u kolonu
mployeeiD umee istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE
ko1.1 povcbva broja.

70

Komanda DELETE

Poglavlje 5 Umetanje, brisanje i auriranje podataka

Komanda REPLACE

ili

Komanda REPLACE deluje slino komandi INSERT, s tom razlikom to ako doe do
dupliranja kljua, novi red koji umeete zamenjuje postojei r~d.
,. v

U MySQL-ovoj dokumentaciji stoji da komanda REPLACE Ima sledeCI opsti obhk:

IlE LETE

REPLACE [LOW PRIORITY l DELAYED]


[INTO] ime_ tabele [ (ime_kolone, ... l l
VALUES (izraz, ... ), ( ... ), ...

.il i

ili

ili

REPLACE [LOW PRIORITY l DELAYED]


[INTO] im~_ tabele [ (ime_kolone, ... l l
SELECT ...
REPLACE [LOW_PRIORITY l DELAYED]
[INTO] ime tabele
SET ime_kolone:izraz, ime_kolone:izraz, ...

Verovatno ste i sami uoili slinost s komandom INSERT.

Komanda DELETE

SQL-ova komanda DELETE omoguava brisanje redova iz tabele. U listingu 5.1 prikazano je nekoliko primera komandi delete, kao to je sledei:
delete from department;
U ovom obliku, komanda delete brie sve redove iz tabele department.
Pomou opcije WHERE moete zadati redove koji se briu, na primer:
delete from department where name:Asset Management';
Ova komanda brie samo redove koji ispunjavaju uslove zadate u odredbi where.
U ovom primeru, bie izbrisani samo redovi koji u koloni name sadre vrednost
Asset Management.
Nije uobiajeno da se briu ba svi redove. Meutim, poto je to najkrai oblik
komande delete, moe vam se dogoditi daje grekom zadate bez odredbe WHERE.
Moete potedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa .
mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano u.pogl.~vlju
2 Kratak obilazak". Te opcije e vas spreiti da izbriete redove (Ih da Izmemte nJihov
s~d~aj) ako pomou odredbe WHERE ne zadate uslov za klju, tj. morate zadati da elite
da izbriete samo redove koji sadre odreene vrednosti kljueva.
U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima sledei opti oblik:
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele
[WHERE uslov]
[ORDER BY ... ]
[LIMIT broj_redova]

[LOW_PRIORITY] [QUICK] ime tabele [. *]


FROM reference na tabele
[WHERE uslov]

[,

ime tabele [. *]

... ]

DELETE [LOW_PRIORITY] [QUICK]


FROM ime_tabele[.*] [, ime tabele[.*] ... ]
USING reference na tabele
[WHERE uslov]
Prvi oblik smo ve upotrebili u dosadanjim primerima.
Druga dva oblika omoguavaju brisanje redova iz jedne ili vie tabela uz referencil anje drugih tabela. Na primer:
de lete employee, employeeSkills
t r om employee, employeeSkills, department
where employee.employeeiD : employeeSkills.employeeiD
nd employee.departmentiD : department.departmentiD
nd department.name:'Finance;
Ovaj primer brie sve zaposlene koji rade u slubi Finance i sve zapise o njihovim
kvalifikacijama. Obratite panju na to da se redovi briu samo iz tabela
employee i employeeSkills Uer su navedene u odredbi delete), ali ne iz tabele department Uer je navedena samo u odredbi from).
Redovi e biti izbrisani iz tabela navedenih u odredbi delete, dok e tabele
navedene u odredbi from biti pretraene ali se redovi iz njih nee brisati, osim ako su
navedene i u odredbi delete.
Obratite panju na to da je ovaj primer prilino sloen jer obuhvata ak tri tabele!
Za ilustrovanje ovog primera potrebne su nam tri tabele. Takoe vam savetujemo da
ovaj primer i opciju WHERE ponovo prouite poto proitate odeljak o spajanju tabela
ll poglavlju 7, "Sloeniji upiti".
U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju
ta bela. kolona . Pomou operatora AND spojili smo vie uslova . To je primer jednostavnog logikog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija
~nai "kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije
e mo objasniti te koncepte.
Trei oblik komande DELETE slian je drugom obliku, s tom razlikom to u ovom
slu aju briemo redove samo iz tabela navedenih u odredbi FROM dok referenciramo
tabele u opciji USING. Na primer:
s trunim

de lete from employee, employeeSkills


\! s ing employee, employeeSkills, department
whe re employee.employeeiD : employeeSkills.employeeiD
tnd employee.departmentiD: department.departmentiD
,md department. name : ' Finance' ;

72

Grupno unoenje podataka pomou komande LOAD DATA INFILE

Poglavlje 5 Umetanje, brisanje i auriranje podataka

Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je


drugaija

sintaksa.
Opti oblik komande DELETE prihvata i druge neobavezne odredbe:
Odredba LOW_PRIORITY deluje na isti nain kao

komandi INSERT.

Odredba QUICK moe ubrzati komandu DELETE jer nalae MySQL-u da odloi
neke od poslova odravanja indeksa dok brie podatke iz tabele.
Odredba ORDER BY odreuje redosled brisanja redova. Najkorisnija je u kombinaciji sa opcijom LIMIT - na primer, kada elite da izbriete iz tabele samo n
najstarijih redova.
Odredba LIMIT odreuje maksimalan broj redova koji komanda DELETE srne da
izbrie. Korisna je u kombinaciji sa odredbom ORDER BY ili kada elite da sp reite brisanje prevelikog broja redova.

Komanda TRUNCATE

Moete dodati neobavezno opciju WHERE da biste aurirali samo odreene redove,
1 d o je izosta vite, auriraete sve redove tabele. U ovom sluaju takoe, moe vam se
,1, ,Koditi da zaboravite opciju WHERE- seam se kad je jedan moj povrni kolega zadao
111 liO nalik na sledee:
1

ul te user
l password='test';

Ovaj primer jo jednom istie korist od opcije -- i-am-a-dummy programa mysql,


kada imate posla s neznalicama.
Druga navedena verzija komande UPDATE omoguava auriranje vie tabela jednom
lnluandom. Postupak je slian brisanju podataka iz vie tabela istovremeno, koje smo
"hJ.ISnili u prethodnom odeljku. Imajte u vidu da e biti aurirane samo kolone koje
1 111.-ito navedete u odredbi SET.
Sve ostale odredbe komande UPDATE opisali smo ranije . Odredbe LOW_PRIORITY i
IIINORE deluju na isti nain kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju
11.1 1sti nain kao u komandi DELETE.
11.11o i to

Komanda TRUNCATE brie sve redove iz tabele. Na primer:


TRUNCATE TABLE employee;
Ovaj upit brie sve zaposlene iz tabele employee. Bri je od komande DELETE jer
radi tako to najpre fiziki uklanja celu tabelu a zatim pravi istu takvu ali praznu.
Vodite rauna o tome da komanda TRUNCATE nije ukljuena u transakcionu obradu.

Komanda UPDATE

SQL-ova komanda UPDATE omoguava auriranje postojeih redova u tabelama baze


podataka. Na primer, pretpostavimo da je jedan od zaposlenih preao na drugo radno
mesto:
update employee
set job='DBA'
where employeeiD='6651';
Ova komanda menja vednost u koloni j ob za zaposlenog ija je ifra 6651.
U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima sledei oblik:
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele
SET ime kolonel=izrazl [, ime kolone2=izraz2 ... )
[WHERE uslov]
[ORDER BY ... )
[LIMIT broj_redova]

rupno unoenje podataka


LOAD DATA INFILE

pomou

komande

l omanda LOAD DATA INFILE omoguava grupno prenoenje podataka iz tekstualne


d.tloteke u tabelu, bez potrebe da piete komande INSERT. Primenjujui ovu tehniku,
1110gli smo da napunimo podacima tabelu department na nain opisan u nastavku ovog
11kljka. U listingu 5.2 prikazan je sadraj datoteke s podacima o nazivima slubi koje
lll'ba uneti u tabelu department.

l bli ng 5.2
l

128

IWLL
NULL

department_infile.txt

Finance
Research and Development
Human Resources
Marketing

Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, to znai


d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna' una za tabulator. (To se moe podesiti i drugaije, to emo opisati u nastavku .)
Podatke moete uneti u tabelu department pomou sledee komande LOAD DATA
INFILE:
lo d data local infile 'department infile.txt'
-

Into table department;


ili

UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele [, ime_tabele ... )


SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... )
[WHERE uslov]
Komanda UPDATE je po mnogo emu slina komandi DELETE.

Ova mogunost je naroito korisna kada treba u itati podatke iz formata neke
1li ugc baze podataka, iz tabele programa za tabelarne proraune ili iz CSV (comma\l'parated values) datoteke .

lli

Saetak

Pn1JI;1vlj b Umetanje, brisanje i auriranje podataka

Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije
infom1acije o tome potraite u poglavlju ll, "Upravljanje pravima korisnika", naroito
ako imate problema pri izvravanju ove komande. Pravo izvravanja ove komande
esto je ogranieno iz ozbiljnih bezbednosnih razloga- na primer, da biste spreili
korisnike da bilo ta unesu u /etc/passwd.
Opti oblik komande LOAD DATA INFILE izgleda ovako:
LOAD DATA [LOW_PRIORITY

CONCURRENT]

[LOCAL]

INFILE

'imeDatoteke.txt'
[REPLACE l IGNORE]
INTO TABLE ime_tabele
[FIELDS
[TERMINATED BY ' \t' ]
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY ' \ \ ' ]
[LINES TERMINATED BY '\n']
[IGNORE broj LINES]

[ (ime_kolone, ... ) l

Komanda

LOAD DATA INFILE

ima sledee odredbe:

Odredba LOW PRIORITY deluje na isti nain kao u komandi INSERT, tj. eka da
drugi klijentski programi zavre uitavanje podataka iz tabele. Odredba CONCURRENT, s druge strane, omoguava drugim klijentskim programima da uitavaju
podatke iz tabele dok je vi punite podacima pomou komande LOAD DATA
INF ILE .

U navedenom primeru zadali smo neobaveznu rezervisanu re LOCAL, koja znai


da se datoteka s podacima nalazi na klijentskom (lokalnom) raunaru. Ako ne
zadate ovu odredbu, MySQL e traiti datoteku na serveru.
Ako se pri punjenju tabele podacima kljuevi dupliraju, odredbe REPLACE i
IGNORE pruaju dve mogunosti reavanja tog problema. Opcija REPLACE nalae
MySQL-u da postojei red zameni novim redom, dok opcija IGNORE nalae
MySQL-u da zadri postojei red.
Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U optem
obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih
opcija - svaki red s podacima smeten je u zaseban red datoteke, a vrednosti
kolona razdvojene su zarezima.Vrednosti kolona moete omeiti navodnicima,
a pomou obrnute kose crte moete preslikati svaki znak (kao to je polunavodnik) koji bi MySQL moda pogreno protumaio .
Odredba IGNORE broj LINES nalae MySQL-u da zanemari (preskoi) prvih
broj redova.
Poslcdnjom odredbom zadajete da elite da popunite podacima samo navedene
kolone tabele.

Za prenoenje podataka iz jednog formata u drugi, esto se koristi CSV format


(e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi itaju i
pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu
1. ) prikazana je kratka CSV datoteka dobijena iz Excela.
11\ting 5.3

new_programmers.csv

tMme, Job, DepartmentiD


.Julia Lenin,Programmer,128
1louglas Srni th, Programmer, 12 8
'l' i m O' Le ary, Programmer, 128

Ove podatke moete preneti u tabelu employee

pomou sledeeg

upita:

load data infile 'e:\\new_programmers.csv'


Into table employee
l ields terminated by ,
lines terminated by '\n'
lgnore 2 lines
(name, job, departmentiD);

Kao to vidite, za prenoenje ovih podataka naveli smo vie opcija nego kada su
podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istai
sledee:

Budui

da smo putanju datoteke zadali u formatu uobiajenom u Windowsu/


DOS-u, ~. pu tanja sadri obrnutu kosu crtu, morali smo da je preslikamo
pomou dodatne kose crte. Zbog toga je putanja zada ta u obliku
'e:\ \new_programmers. csv'.

Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se


to ipak mora izriito zadati u komandi .
Nije neophodno da izriito zadate da se redovi zavravaju znakom za nov red, ali
mi smo se opredelili da to ipak uinimo.
Poto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadre podatke i treba
ih izostaviti pri uitavanju podataka iz datoteke.
Poto datoteka ne sadri ifre zaposlenih (kolona employeeiD), da bismo preneli
tri kolone podataka u etiri kolone tabele, moraemo da navedemo ciljne kolone
(i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,
job, departmentiD).

Saetak
U ovom poglavlju razmatrali smo
tabelama baze podataka.

naine

umetanja, brisanja i auriranja podataka u

76

Poglavlje 5 Umetanje, brisanje i auriranje podataka

LOAD DATA INFILE

Umetanje podataka

Vrednosti znakovnog tipa treba da budu omeene navodnicima. Polunavodnike


ili obrnute kose crte unutar vrednosti treba preslikati pomou obrnute kose crte.
Komanda INSERT omoguava umetanje podataka u tabelu:
INSERT [LOW PRIORITY l DELAYED] [IGNORE]
[INTO] ime_ tabele [ (ime_kolone, ... ) l
VALUES ((izraz l DEFAULT), ... ),( ... ), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz,

ili

ili

... ]

INSERT [LOW_PRIORITY l DELAYED] [IGNORE]


[INTO] ime_tabele [(ime_kolone, .. . )]
SELECT ...
INSERT [LOW_PRIORITY l DELAYED] [IGNORE]
[INTO] ime_tabele
SET ime kolone=(izraz l DEFAULT), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz,

Komanda LOAD DATA INFILE


teke u tabelu:

prenoenje sadraja tekstualne dato-

LOAD DATA [LOW_PRIORITY l CONCURRENT]


ime_datoteke.txt
[REPLACE l IGNORE]
INTO TABLE ime tabele
[FIELDS
[TERMINATED BY '\t']
[ [OPTIONALLY] ENCLOSED BY ' ']
[ESCAPED BY '\\' ]

[LOCAL]

INFILE

[LINES TERMINATED BY \n']


[IGNORE broj LINES]
[ (ime_kolone, ... ) l

. .. l

Komanda REPLACE deluje na isti nain kao komanda INSERT, s tom razlikom to u
sluaju dupliranja kljua zamenjuje postojee redove. Ako se to dogodi u komandi
INSERT, komanda se ne izvrava ili aktivira odredbu ON DUPLICATE KEY UPDATE.

Pitanja
1. Koja od narednih komandi uspeno umee nov red u tabelu employee?

a)
insert into employee values
set employeeiD=NULL, name='Laura Thomson',
job='Programmer', departmentiD=128;

Brisanje podataka
Izbegnite katastrofu pomou opcije --i-am-a-dummy.
Komanda DELETE brie podatke iz atebele:
DELETE [LOW_PRIORITY]

omoguava

b)
insert employee values
(NULL, 'Laura Thomson',

[QUICK] FROM ime tabele

[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili DELETE [LOW_PRIORITY] [QUICK] ime tabele [. *]
[,ime tabele[.*] ... ]
FROM reference_na_tabele
[WHERE uslov]
ili DELETE [LOW_PRIORITY] [QUICK]
FROM ime_tabele[.*] [, ime_tabele[.*] ... ]
USING reference_na_tabele
[WHERE uslov]

Komanda TRUNCATE TABLE brie sve redove tabele.

Auriranje podataka
Podatke u tabelama aurirate pomou komande UPDATE TABLE:
UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele
SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ]
[WHERE uslov]
[ORDER BY ... ]
[LIMIT redova]
ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ]
SET ime_kolonelizrazl [, ime kolone2 izraz2 ... ]
[WIIERE us 1ov]

'Programmer', 128);

e)
insert into employee values
(NULL, Laura Thomson, Programmer, 128);

d)
insert employee values
(NULL, 'Laura O'Leary',

'Programmer', 128);

2. Komanda REPLACE
a) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zamenjuje novim redom
b) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zadrava a novi zanemaruje
e) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zamenjuje novim redom
d) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vrednosti kljua postojei red zadrava a novi zanemaruje
3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql
a) spreava unoenje podataka
b) spn:nva auriranje podataka ako ni rc zadat~ vrednost odgovarajueg kljua

78

Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa

e) spreava brisanje podataka ako nije zadata vrednost odgovarajueg kljua


d) i b) i e)
4. U standardnom forma tu datoteke koj u zadate u komandi
podaci su razdvojeni

LOAD DATA INFILE

a) zareztma
b) razmacima
e) znakovima za tabulator
d) znakovima vertikalna crta
5. Neobavezna opcija LOCAL U komandi

Korienje

upita u MySQL-u

LOAD DATA INFILE

a) zadaje da klijent i server rade na istom raunaru


b) zadaje da se datoteka s podacima nalazi na serveru
e) zadaje da se datoteka s podacima nalazi na klijentskom raunaru
d) zadaje da serverski program radi na lokalnom raunaru .

Vebe
1. Napiite grupu komandi INSERT pomou kojih ete napuniti podacima tabele
u svojoj bazi podataka porudzbine.

2. Izbriite podatke iz svojih tabela.


3. Napravite datoteku koja sadri iste podatke koje ste uneli u taki l i prenesite ih
u svoju bazu podataka porudzbine pomou komande LOAD DATA INFILE.

Odgovori
Pitanja
l. b
2.
3.
4.
5.

d
e

Vebe
Ne postoji jedno " tan o" reenj e vebi iz ovog poglavlj a. Potrudite se samo da ih sve
uradite do kraja .

U sledeem poglavlju
U poglavlju 6, "Korienje upita u MySQL-u", poeemo da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.

D o sAD SMO OBJASNILI PROJEKTOVANJE, izradu i punjenje podacima MySQL-ove


haze podataka. U ovom i u dva naredna poglavlja razmotriemo drugu stranu
postupka: uitavanje podataka iz baze.
U ovom poglavlju detaljnije emo objasniti SQL-ovu komandu SELECT. To je
wrovatno najvanija komanda jezika SQL, koja omoguava uitavanje redova iz
wdne ili vie tabela baze podataka.
U ovom poglavlju objasniemo kako se uitavaju redovi iz jedne tabele baze podaLika. Razmotriemo sledee teme:

Opti oblik komande

SELECT

Jednostavni upiti
U itavanje podataka samo iz
Alijasi kolona

odreenih

Upotreba odredbe

uitavanje

WHERE

za

kolona
samo

odreenih

redova

Upotreba odredbe GROUP BY


O graniavanje grupa podataka pomou odredbe HAVING
Sortiranje rezultata upita pomou opcije ORDER BY

O grani avanje

broj a redova rezultata pomou opcij e

LIMIT

U poglavlju 7, "Sloeniji upiti" , b aviemo se sloenijim upitima, a naro ito upitima koji obuhvataju vie tabela, te podupitima i raznim vrstama spoj eva izme u
tabela.
U poglavlju 8, "Upotreba M ySQL- ovih ugraeni h funkcija u komandi SELE CT",
razmotrie mo brojne fu nkcij e koj e postoj e u M ySQL- u da bi vam pomogle pri upotrebi upita.
Najpre emo pogledati opti oblik komande SELECT.

HU

roglaVIJe b K.OnscenJe up1ta u My:>uL-u

Apsolutna 1mena oaza pooataka 1 tabel;

Opti oblik komande SELECT


Komanda SELECT ima

sledei

rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
Sledei upit uitava samo vrednosti iz polja employeeiD i name tabele employee:

opti oblik:

SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupe
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;

aelec t name, employeeiD from employee;


Ako ovaj upit izvrite u bazi podataka employee, trebalo bi da dobijete rezultate
nalik na sledie:

Ovo nije potpuna sintaksa- objasniemo je u narednom poglavlju- ali ilustruje


opti oblik komande. Odredbe koje su ovde navedene opisacmo u ovom poglavlju.
Komanda SELECT ima veliki broj neobaveznih odredaba. Ne morate ih uvek navoditi, ali ako ih upotrebite, morate ih zadati redosledom koji je prikazan u opte m
obliku komande.

Jednostavni upiti
Primer najjednostavnijeg oblika komande SELECT izgleda ovako:

---------------+-------------+
l name
l employeeiD
---- -----------+-------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith

6651
7513
9006
9842

---- ---------+---------------+
~

rows in set (0.00 sec)

Kao to vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu.
Obratite panju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne
rcdosledom kojim su definisane u emi baze podataka.

select * from department;


Ako ovaj upit izvrite s podacima koji postoje u bazi podataka employee, trebalo bi
da dobijete rezultate nalik na sledee:

+---------------+--------------------------+
l departmentiD l name
l
+---------------+--------------------------+
42
Finance
l
128
Research and Development l
129
Human Resources
l
130
Marketing
l
+---------------+--------------------------+
4

rows in set (0.00 sec)

Ovaj upit je u itao sve podatke iz zadate tabele - tj. sve redove i sve kolone iz
tabele department.
Postupak moete isprobati i na nekoj drugoj tabeli- na primer, uitajte sve redove
i sve kolone iz tabele employeeSkills.
Razume se, sutina relacione baze podataka svakako nije u tome da vam daje sve
podatke koje ste u nju uneli, ve da vam omogui da naete odreene podatke.

Uitavanje

podataka iz

odreenih

Apsolutna imena baza podataka i tabela


Dodatan oblik notacije koji bi trebalo da imate u vidu omoguava zadavanje apsolutnih imena baze podataka i tabele s kojom elite da radite. Kolonu name tabele
employee moemo navesti u upitu kao employee. name.
select employee.name
from employee;
Trebalo bi da rezultati ovog upita budu nalik na sledee:

---------------+
l name
t---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith

--------- --- ---+


4

rows in set (0.41 sec)


Slino tome, moete izriito zadati koju tabelu u kojoj bazi podataka imate na umu,

nn primer:

kolona

U narednom koraku ograniiemo kolone iz kojih uitavamo podatke. Znak * u


prethodnom primeru upita (select * from department) znai "sve kolone tabele" .
Umesto zvezdice, moete zadati samo kolone iz kojih vam trebaju podaci. To moe
biti samo jedna kolona, nekoliko kolona tabele, ili ak sve kolone tabele poreane

selec t name
irom employee.employee;
(Trebalo bi da pomou ovog upita dobijete isti rezultat kao pomou prethodnog
upita.)

t"OglaVIJe O

upuucuct uurcuuc vvncnc Let ucnctVCifiJC

1\0riSCenJe UflllCI U IVIY.:>UL-U

U ovom primeru, izriito navodimo da elimo podatke iz tabele employee koja se


nalazi u bazi podataka employee. Notacija u ovom sluaju je baza_podataka . tabela.
Ako je potrebno, moete zadati kojoj bazi podataka i tabeli pripada odreena kolona.
Isti primer moe se napisati pomou sintakse baza_podataka. tabela . . kolona u sledeem obliku:

U poslednja dva primera rezervisana


da napiemo i u sledeem obliku:

select employee.employee.name
from employee;

se lect e.name
from employee e;

Ova sintaksa nije naroito korisna za ovakve jednostavne upite, ali kad budete
preli na sloenije upite, ona e vam omoguiti da na nedvosmislen nain zadajete
podatke koji su vam potrebni.

re

~ctrnu

uurcucr1111 rt:uuvd

AS nije bila neophodna. Upit smo mogli

oe lect name employeeName


Lrom employee;
ili

Upite moete pisati u obliku koji smatrate najpogodnijim. To je iskljuivo pitanje


stila programiranja. Kao to ete videti u ovom poglavlju i na mnogim drugim
mestima u knjizi, isti upit moe se napisati na vie razliitih naina. Kao i u drugim
programskim jezicima, lini stil svakog programera na SQL-u razlikuje se od ostalih .
li nog

Alijasi
Sada bi trebalo da objasnimo koncept alijasa kolona i tabela.
Kolonama i izrazima u komandi SELECT moete dodeliti drugaija imena, koja
se prikazivati u rezultatima. Na primer, moemo upotrebiti sledei upit:

select name as employeeName


from employee;
U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kontekstu ovog upita. Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako:

+---------------+
l employeeName
+---------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith

+---------------+
4

rows in set (0.01 sec)

Kao to vidite, sadraj kolone name sada je prikazan ispod zaglavlja employeeName .
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje odreena pravila o tome ta se moe a ta se ne moe raditi sa alijasima, koja emo objasniti kad
doemo na tu temu .
Navedeni primer alijasa nije naroito koristan. Meutim, pravu mo alijasa shvati ete kad ponete da piete sloenije upite i upite u kojima se neto izraunava.
Alijasi se mogu zadavati i za tabele, kao u sledeem primeru:
select e.name
from employee as e;
Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe alij asa. Ovaj nain notacije postae koristan kada u narednom poglavlju ponete da
izvravate upite koji obuhvataju vie tabela.

Upotreba odredbe WHERE za


samo odreenih redova

uitavanje

Dosad smo razmatrali uitavanje svih podataka sadranih u tabeli i uitavanje svih
podataka samo iz odreenih kolona. Sada emo prei na uitavanje samo odreenih
redova. To je korisno jer esto treba da iz jedne ili vie tabela uita te samo zapise koji
ispunjavaju odreene uslove. Ta mogunost postaje jo vanija kada je potrebno ui
tati samo nekoliko traenih redova iz veoma obinme tabele.
To se moe obaviti pomou odredbe WHERE komande SELECT. Jednostavan primer
bio bi sledei:
se lect employeeiD, name
from employee
where job='Programmer';
(Uzgred, imajte u vidu da se tekst upita moe rasporediti u vie redova. Svaki upit
se zavrava znakom taka i zarez. (;). Upite piemo na taj nain da bi bili itljiviji.)
Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako:

+- --- - --------+--------------+
l employeeiD l name
+--- ----------+--------------+
6651 l Ajay Patel
l
7513 l Nora Edwards l
+- ------------+--------------+
2

rows in set (0.42 sec)

U odredbi WHERE zadali smo uslov zbog kojeg se izdvajaju samo redovi tabele koji
ga ispunjavaju - u ovom primeru, to su zaposleni koji rade kao programeri.
Obratite panju na to da smo u upitu kombinovali uslov s kolonama koje nam trebaju (employeeiD i name) da bismo uitali samo podatke koji su nas zanimali .
U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite
pa nju na to da u SQL-u znak = slui za ispitivanje jednakosti. To je razliito od mn gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq.

84

PoglavlJe o KonscenJe up1ta u My:;>UL-u

Uklanj anje dupli ran ih vrednosti pomou opcije DISTINCT

Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje emo detaljno
objasniti u poglavlju 8. Zasad emo navesti samo operatore koji se najee koriste:
Jednakost, ili=, to smo

ve

d.IJ C ove podatke:

--- ------------------+

job

koristili.

Nejednakost (razliitost), koja se pie kao ! = ili <>.


Sve kombinacije > (vee od), < (manje od), >= Uednako ili
nako ili manje od).

--- ------------------+

vee

Programmer
Programmer
Sys tems Administrator

od), i <= Ued-

OBA

IS NULL i IS NOT NULL, pomou kojih se ispituje da li odreena vrednost jeste


ili nije NULL. To ne moete utvrivati pomou izraza nekavrednost=NULL. (Zbog
ega to ne moe, objasniemo u poglavlju 8.)

operatori koje biste oekivali i koji se najee koriste


u kombinaciji s operatorima za poreenje. Na primer, moete ispitati da li je
nekavrednost > nekadrugavrednost*lO.

-- -------------------+
rows in set (0 . 01 sec)
Obratite panju na to da se podatak Programmer pojavljuje dvaput jer postoji
dva reda tabele. Upit je u itao listu svih vrednosti iz kolone job tabele employee .
A sada, pogledajte sledei upit:

Uobiajeni aritmetiki

Standardni logiki operatori AND, OR i NOT, koji se koriste za povezivanje vie


uslova. Budui da imaju nii prioritet od operatora za poreenje, na primer,
izraz plata > 30000 AND plata < 50000 izraunava se kako biste i oekivali.
Osim operatora, u nekim primerima koristiemo i funkcije. Funkcija count
omoguava prebrojavanje redova koje je upit uitao. Na primer:

ll

lect distinct job


It om employee;
Ovaj upit daje sledee rezultate:

-- -------------------+

(l

job

--- -------- - ---------+

select count(*) from employee;


Ovaj upit pokazuje koliko redova sadri tabela employee.
I najzad, standardni redosled prioriteta izraunavanja delova izraza moete menjati
tako to ih grupiete izmeu zagrada.
Sledei primer je neto sloeniji upit u kojem je zada ta odredba WHERE:
select * from assignment
where employeeiD=6651 and hours >

8;

Ovaj upit uitava iz kolone assignment sve poslove na kojima je zaposleni ija je
ifra employeeiD 6651 (Ajay Pate!) radio vie od osam asova.
Vano je istai da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone
tabela, ve morate navesti izvorno ime kolone. To je ogranienje ANSI standarda za
jezik SQL. Razlog je to to vrednost kolone predstavljene alijasom moda nee biti
poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE.

Uklanjanje dupliranih vrednosti


opcije DISTINCT
Pomou

pomou

rezervisane rei DISTINCT navodite da u rezultatima upita ne elite da vidite


duplirane vrednosti. Na primer, sledei upit:
select job
from employee;

Programmer
Systems Administrator

OBA

- --------------------+
rows in set (0.04 sec)

U ovom primeru duplikati se ne pojavljuju.


U ovom sluaju razlika ne izgleda tako znaajna - naravno, drugi skup rezultata je
tlt'to uredniji, ali poboljanje i nije tako veliko. Bilo bi primetnije kada biste imali
opsenu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili tane
podatke.
S druge strane, pogledajte sledei upit:
mysql> select count(job) from employee;

--- -------+
count (job)

-- --------+
4 l
-- --------+
row in set (0 . 01 sec)
Prema rezultatima ovog upita, kolona j ob sadri etiri vrednosti . To navodi na
po~rean zakljuak jer nije tano da u toj koloni postoje etiri razliite vrednosti. Ako
pogledate podatke u tabeli, videete da kolona j ob sadri samo tri razliite vrednosti.
Lako vam se moe dogoditi da grekom zadate prethodni upit kada ste imali na
11111u sledei upit:
l

ct count(distinct job) from employee;

86

Sortiranje uitanih rezultata pomou odredbe ORDER BY

Poglavlje 6 Korienje upita u MySQL-u

ltlzultati

On daje sledei rezultat:

sledee:

ount (*)

row in set (0.05 sec)


Ovaj rezultat pokazuje koliko se razli{itih vrednosti nalazi u koloni job, to je koris-

niji podatak.

Upotreba odredbe GROUP BY

biti nalik na

-- ---+---------------------- -+
l job
l
--- ---+-----------------------+
l l Systems Administrator l
2 l Programmer
l
l l DBA
l
-- ----+-----------------------+

+---------------------+
l count(distinct job) l
+---------------------+
3 l
+---------------------+
1

. .

oows in set (0 . 04 sec)


)(Jo to vidite, nazivi radnih mesta sada su prikazani opadajuim abecednim redolodom. Moete da zadate opciju ASC (od engl. ascending, rastui redosled), ali poto se
1 q tlclosled podrazumeva, nema potrebe da ga izriito zadajete.

Sledea odredba koju emo razmotriti jeste GROUP BY koJa omogucava gruptsanJe u ct-

tanih redova. Ona je zaista korisna samo kada je upotrebite u kombinaciji s funkcijama
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 razmotriemo vie drugih.
Pogledajte sledei upit:
select count(*), job
from employee
group by job;
Ovaj upit prebrojava zaposlene po radnom mestu- tj. utvruje broj zaposlenih. po
svakom radnom mestu. Ako izvrite ovaj upit u bazi podataka employee, trebalo bt da
dobijete rezultat nalik na sledei:

+----------+-----------------------+
l count(*) l job
l
+----------+---------------- - ------+
l l DBA
l
2 l Programmer
l
1 l Systems Administrator l
+----------+----------------- - -----+
3

rows in set (0.04 sec)


Postoje dve razlike izmeu naina na koji odredba GROUP BY radi u MySQL-u

i u standardnom ANSI SQL-u.


U ANSI SQL-u, u odredbi GROUP BY morate navesti sve kolone koje ste zadali
u odredbi SELECT. MySQL dozvoljava da u odredbi GROUP BY zadate i dodatna polja
.
kojih nema u odredbi SELECT.
MySQL omoguava da izaberete redosled grupa kojim se prikazuju rezultati. Podrazumeva se rastui redosled. Ako elimo da ponovimo poslednji upit, ali tako da se
rezultati prikau opadajuim redosledom, moemo upotrebiti sledei upit:
select count(*), job
from employee
group by job dese;

l/dvajanje odreenih grupa podataka pomou


opcije HAVING
l c d ca odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je
olodata odredba HAVING deluje na slian nain kao komanda SELECT kojoj je dodata
ou lc cdba WHERE. Na primer:
ct count(*), job
employee
11 oup by job
lt.,ving count (*l =l;
1

l e om

O vaj upit uitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu:hl'nik. Trebalo bi da rezultati budu nalik na sledee:

---- ----+-----------------------+
l job
l
----- -- -+-----------------------+
l l DBA
l
l l Systems Administrator l
-- ------+---------------------- -+

count(*)

' rows in set (0.05 sec)


Prema naem dosadanjem iskustvu, poetnici u jeziku SQL esto brkaju odredbe
WII ERE i HAVING. Odredbu WHERE moete upotrebiti U gotovo svakom upitu koji snu\li tc da biste zadali uslove koji se odnose na pojedinane redove . Odredbu HAVING
~ oristite kada odreeni uslov treba da vai za celu grupu.

Sortiranje

uitanih

rezultata

S k-d e a

ct *
om employee
o td r by j ob a se , n me d sc ;
' 1

l t

odredbe ORDER BY

odredba komande SELECT jeste odredba ORDER BY koja omoguava sortiranje


redova po jednoj ili vie kolona. Redosled sortiranja moe biti rastui , to
ozna ava sa ASC, ili opadajui, to se oznaava sa DESC. Na primer:

t l'rttltujuih
st'

pomou

BB

Saetak

Poglavlje 6 Korienje upita u MySQL-u

Ovaj upit uitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani
po abecednom redosledu sadraja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.t o radno
mesto, oni e biti sortirani opadajuim abecedmm redosledom po unemma l prezlmenima. Rezultati upita izgledaju ovako:

+ --------------+-----------------------+--------------+
1 b

+------------ -

employeeiD

name

JO

l departmentiD l
--------------+

+------------+---------------+-----------------------i
9842 l Ben Smith
DBA
l
l
7513 l Nora Edwards
Programmer
l
l
6651 1 Ajay Patel

42
128
128

l
l
l

Programmer

9006 1 candy Burnett


Systems Administrator l
128 l
l
+------------+---------------+-----------------------+--------------+
4 rows in set (0.02 sec)

Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, p~~razumeva se
ASC. Ukoliko ne zadate odredbu ORDER BY, nita se ne moe pretpostav1t1 o redosledu
redova u skupu rezultata.

Saetak

Ograniavanje broja redova rezultata pomou


odredbe LIMIT
.

Komanda SELECT ima

. .

Poslednja odredba komande SELECT koju emo razmotriti u ovom poglavlju jeste
.
.
.

leodredba LIMIT.
Odredba LIMIT ograniava broj redova rezultata koje up1t daje. Na pnmer, pog

dajte

sledei

upit:

select *
from employeeSkills
limit 5;

Ovaj upit daje samo prvih pet redova koji ispunj.ava~u zadati uslov. U ovom sluaju, to je prvih pet redova uitanih uz tabele, kao sto je pnkazano:

+------------+-------+
1 employeeiD l skill

+------------+-------+
6651 l Java l
6651 l VB
l
7513 l e
l
7513 l Java
l
7513 l Perl
l
+----------- -+-- --- --+
5 rows in set (0.44 sec)

Moete zadati i da elite podskup redova drugaiji od prvih n. Ako pomo~u p:ethodnog upita hoemo da uitamo redove od 6 do 8, to emo uraditi na sledeCl nacm:
select *
from employeeSkills
limit 5, 3;

Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
kojeg poinje uitavanje) a drugi je maksimalni broj redova koji elimo da se uita.
Uporedite to s prethodnim sluajem: kada zadamo samo jedan parametar, on predstavlja maksimalni broj redova koji elimo da se uita.
Kada zadajemo pomak, on poinje od O (kao to se vidi u prethodnom primeruza esti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT uitava
redove od O do 4, a drugi primer uitava redove od 5 do 7.
Ako kao vrednost drugog parametra zadate -1, upit e uitati redove od pomaka
do kraja tabele.
Odreba LIMIT se najee koristi u kombinaciji sa odredbom ORDER BY da bi redesled redova u rezultatima upita imao odreeni smisao. Imajte u vidu da bez odredbe
ORDER BY, redosled redova rezultata nije predvidljiv.
Ova odredba je naroito korisna u We b ili GUI aplikacijama koje koriste MySQL
jer omoguava jednostavan mehanizam podele rezultata na stranice.

sledei

opti oblik:

SELECT kolone
FROM tabele
[WHERE uslovi]
[GROUP BY grupa
[HAVING uslovi_ za_grupe]]
[ORDER BY kolone_za_sortiranje]
[LIMIT broj] ;

Odredba select * uitava sve kolone; select ime kolone uitava samo navedenu kolonu.
Tabele moemo navoditi kao baza_podataka. tabela a kolone kao tabela. kolona ili baza_poda taka. tabela. kolona da bismo izbegli dvosmislenost.
Alijasi su alternativna imena za tabele i kolone, a zadaju se na sledei nain:
select kolona as alijas_kolone
from tabela as alijas_tabele;

Odredba WHERE slui za uitavanje redova koji ispunjavaju zadate uslove.


Rezervisana re DISTINCT uklanja duplirane podatke iz skupa rezultata.
Odredba GROUP BY obrauje redove rezultata grupu po grupu. Koristi se prvenstveno u kombinaciji s funkcijama koje deluju na grupe redova, kao to je funkcija count () .
Odredba HAVING deluje

slino

odredbi WHERE, ali na grupe.

Odredba ORDER BY sortira redove rezultata prema sadraju kolona koje navedete.
Odredba LIMIT odreuje koji e redovi biti uitani iz mogueg skupa rezultata.
Maksimalni broj redova zadaje se u obliku pomaka od kojeg poinje u itavanje.

90

Ud govon

Poglavlje 6 Korienje upita u MySQL-u

4. Gde se alijas ne moe zadati?

Pitanja

a) za kolone

1. Koji od narednih upita uitava sve podatke iz tabele client?

b) za tabele

a)
select *
from client
where clientiD=2;

e)

odredbi WHERE

d)

odredbi SELECT

S. Ako nam iz rezultata upita trebaju redovi od lS do 20, odgovarajua odredba


LIMIT je

b)

a) LIMIT lS, 20
b) LIMIT 14, 19

select clientiD, name, address, contactPerson, contactNumber


from client;

e) LIMIT 14, s

e)
select * from client
limit l;

d)
select all from client;
2. Koji od sledeih upita uitava sve programere iz tabele employee?

a)
select *
from employee
where job='Programmer';

d) LIMIT lS, s

Vebe
1. Napiite upit koji daje sve podatke o zaposlenima u slubi (tabela department)
ija je ifra 128.

2. Napiite upit koji iz kolone employeeiD uitava sve ifre zaposlenih koji su radili
za klijenta ija je ifra l.
strunu kvalifikaciju evidentiranu u tabeli employeeSkills daje ukupan broj zaposlenih koji je imaju.

3. Napiite upit koji za svaku

b)

select *
from employee
having job='Programmer';

Odgovori

e)
select *
from employee
where job='Programmer'
group by job
having job='Programmer';

d)
select job
from employee;
3. Koji od sledeih upita ne daje ukupan broj zaposlenih evidentiranih u tabeli
employee?

Pitanja
l. b
2. a
3. d
4. e

S. e

Vebe
1.
select *
from employee
where departmentiD=128;

a)
select count(employeeiD) from employee;
b)

select count(employeeiD) as total from employee;

2.
select employeeiD
from assignment
where clientiD=l;

e)
select count(distinct employeeiD) from employee;
3.

d)
select count(employeeiD) from employee group by employeeiD;

s l cL skill , count(skill)
f 1om mploy Skills
CJI Oll Jl

IJy ll k { ) J ;

92

Poglavlje 6

Korisenje

upita u

My~UL-u

U sledeem poglavlju

U sledeem poglavlju, "Sloeniji upiti", razmatraemo upite koji obuhvataju vie


tabela i druge detalje komande SELECT.

Sloeniji upiti

BAVIEMO

Razmatraemo

OVOM POGLAVLJU
SE sloenijim upitima.
prvenstveno kako se mogu izvravati upiti koji obuhvataju vie tabela istovremeno. Zbog
toga ete morati da savladate koncept spajanja tabela, tj. nain na koji se tabele mogu
meusobno povezati.
Razmotriemo sledee teme:

Izvravanje upita koji obuhvataju vie tabela primenom


Prirodnih, unutranjih i unakrsnih spojeva

sledeih

vrsta spojeva:

Jednakovrednih spojeva
Levih i desnih spojeva
Podupiti
Upotreba opcija komande

SELECT

Upotreba spojeva u upitima koji obuhvataju vie tabela


Svi upiti iz poglavlja 6, "Korienje upita u MySQL-u", uitavali su podatke iz samo
jedne tabele. Budui da smo se potrudili da doemo do normalizovane strukture baze
podataka u kojoj su podaci razmeteni u vie tabela, korist od mogunosti uitavanja iz
samo jedne tabele prilino je ograniena. Ono to je zaista zanimljivo u relacionim
bazama podataka jesu relacije, odnosno veze koje postoje izmeu pojedinih tabela. Kada
sc podaci uitavaju iz vie tabela istovremeno, te veze se nazivaju spojevi (engl.joins).
Pogledajmo prvo upite koji povezuju dve tabele.

Spajanje dve tabele


Pogledajte

sledei

upit:

select employee.name, department.name


trom employee, department
where employee.departmentiD = department.departmentiD;

rogtaVIJC l

Kao to vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom
elimo da uitamo imena zaposlenih i nazive slubi u kojima rade. Rezultati
ovog upita izgledaju ovako:

sluaju

+---------------+--------------------------+
l name
l name
+---------------+--------------------------+
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett

Finance
Research and Development
Research and Development
Research and Development

+---------------+--------------------------+
4 rows in set

(0.42 sec)

Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u razliitim
tabelama. (Obratite panju na to da smo upotrebili notaciju s takom, kako je opisano
u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene
kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da
navedemo imena obeju tabela u odredbi FROM.
Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvrite bez
odredbe WHERE, u sledeem obliku:
select employee.name, department.name
from employee, department;
dobiete sledee

rezultate:

+-- -- -----------+--------------------------+
l name
l name
+---------------+--------------------------+
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith

Finance
Finance
Finance
Finance
Research and Development
Research and Development
Research and Development
Research and Development
Human Resources
Human Resources
Human Resources
Human Resources
Marketing
Marketing
Marketing
Marketing

+- - -------------+--------------------------+
16

upotreoa spoJeva u up1t1ma KOJI oounvataJu v1se taoela

:>IOZCniJI Upili

rows in set (0.01 sec)

Prvi upit, kojem je pridruena odredba WHERE, prikazuje zaposlene s tanim podacima o slu bama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i
slu bi , pri e mu nij e mogue utvrditi koji redovi rezultata sadre ta n e pod.11 kl a koji

' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih moguih kombinacija
lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
Sasvim je oigledno da je odredba WHERE kljuna za dobijanje rezultata koji nam
li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomou kojih povet ujemo tabele zove se spojni uslov. U ovom sluaju, uslov je employee. department ID
de partment. department ID, to je veza izmeu tabela koju smo definisali preko
\poljnih kljueva jo u emi baze podataka.
Kada elite da istovremeno uita te podatke koji se nalaze u vie tabela, morate upotrebiti veze izmeu tih tabela da biste pronali podatke koje traite. Ponekad to znai
da morate pronai put od podataka koje znate do podataka koje traite. U narednom
odeljku opirnije emo objasniti tu ideju.
U prethodnom primeru rezultata obratite panju i na to da u zaglavljima obe
kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada.
ltezultati e biti razumljiviji ako upotrebite alijase, na primer:
sel ect employee.name as employeeName, department.name as departmentName
Jrom employee, department
where employee . departmentiD
department.departmentiD;
Ovaj upit daje

sledee

rezultate:

1---- -----------+--------------------------+
l employeeName l departmentName
1--- ------------+--------------------------+
Ben Smith
Ajay Patel
Nora Edwards
Candy Burnett

Finance
Research and Development
Research and Development
Research and Development

--- ------------+--------------------------+
1 rows in set (0.55 sec)

Sadraj ovog skupa rezultata je razumljiviji nego prethodni.

Spajanje vie od dve tabele


Spajanje vie tabela ne razlikuje se od spajanja samo dve tabele.
Recimo da treba utvrditi iz koje su slube zaposleni koji su radili za klijenta ije je
ime Tele o Inc. Kako da doemo do tih podataka?
Poto znamo ime klijenta, u koloni clientiD tabele client moemo pronai njegovu
i fru . Pomou tog podatka potrai~mo u tabeli assignment poslove obavljene za tog
klijenta i ifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima
moemo zatim pronai u tabeli employee ifre slubi u kojima rade ti zaposleni. I najzad,
p o mou tih podataka pronai emo u tabeli department odgovarajue nazive slubi!
Poto smo osmislili putanju traenja kroz sve etiri tabele, preostaje nam da tu
logiku preslikamo u odgovarajui upit, to daje sledee:
select department.name
irom c l ient, assignment, employee, department
wh re c li ent . name= 'Telco Inc '

I'U911VIJe

Vrste spoJeva 1zmeau tall'

::IIUZeniJI Ufllll

and client.clientiD = assignment.clientiD


and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD;
Nakon izvravanja upita, dobijamo ove rezultate:

+--------------------------+
l name
+--------------------------+
l Research and Development l
+--------------------------+
l row in set (0.00 sec)
U upitu koji smo napisali uoiete da smo morali navesti sve tabele u putanji koju
smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom sluaju
imamo jedan obian uslov- client. name = 'Tel co Inc' - i vie spojnih uslova.
Obratite panju na to da smo spojili etiri tabele pomou tri spojna uslova.
Primenom ovog pravila moete proveriti da li ste zadali sve potrebne uslove. Kada
spajate n tabela, u veini sluajeva, trebae vam po jedna veza izmeu svakog para tabela,
to znai da ete imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani
su na slici 7.1.Jasno se vidi zbog ega je za etiri tabele potrebno tri (n-1) spoja.

To moemo obaviti

pomou sledeeg

1:1

upita:

select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD;
Kao to vidite, u ovom upitu deklarisali smo dva razliita alijasa za tabelu employee.
Time smo opisali MySQL-u da emo raditi kao da imamo dve zasebne tabele, el i e2,
koje sluajno sadre iste podatke. Zatim smo te tabele spojili, na isti nain kao to
bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potraili
red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a
zatim smo u tabeli e2 potraili redove koji u koloni departmentiD sadre istu ifru
slube kao ona u kojoj radi Nora (el. department ID = e2. department ID).
Moda e vam trebati malo vremena da se naviknete, ali ako moete da zamislite da
radite s dve razliite tabele, ne bi trebalo da imate veih tekoa.
Ovo su rezultati prethodnog upita:

+--------- ------+
l name
l
+---------------+
Ajay Patel
l
l Nora Edwards l
l Candy Burnett l
+------ ---------+
3 rows in set (0.00 sec)

Prikazani su svi zaposleni koji rade u istoj slubi kao Nora. Kao to se vidi, na listi se
nalazi i Nora. Upitu moemo lako dodati nov uslov koji e je iskljuiti is skupa rezultata:
assignment.employeeiD=employee.employeeiD

assignment.departmentiD=department.departmentiD

select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD
and e2.name != 'Nora Edwards';

Vrste spojeva
Slika 7.1

Za povezivanje

etiri

tabele potrebna su tri spoja.

izmeu

tabela

Postoji vie vrsta spojeva koji se mogu uspostaviti

izmeu

MySQL-ovih tabela.

Osnovni spoj
Spajanje tabele same sa sobom - samospoj
Kao to jednu tabelu spajamo s drugom, isto tako moemo je spojiti i sa samom sobom.
Zato bismo to uradili? Ponekad ete traiti veze izmeu redova u istoj tabeli. Pretpostavimo da elimo da saznamo imena svih zaposlenih koji rade u istoj slubi kao Nora
Edwards. Da bismo doli do tih podataka, prvo moramo u tabeli employee pronai ifru
slu be (kolona department ID) u kojoj radi Nora, a zatim emo u tabeli employee
potra7iti i sve ostale zaposlene koji rade u toj slubi.

U prethodnom odeljku, pomenuli smo koncept Dekartovog proizvoda. On se ponekad


naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira
na ime, sastoji se od skupa svih moguih kombinacija redova tabela. Kada tom spoju
dodamo odreeni uslov (kao to je employee. department ID = department. departmentro), dobijamo neto to se ponekad nazivajednakovredni spoj (engl. equij"oin),
koji ograniava broj redova u skupu rezultata.

ruyli:IVIJt: l

.:>IULt:nljl Upili

Podu piti

Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time
se dobija unakrsni spoj, kao to je ve opisano, koji se pretvara u jednakovredni spoj kada
mu dodamo odredbu WHERE. MySQL podrava vie oblika sintakse za ou vrstu spoja.
Pogledajmo izvorni upit:
select employee.name, department . name
from employee, department
where employee.departmentiD ; department.departmentiD;
Umesto zareza, moe se zadati neobavezna rezervisana

re

JOIN:

select employee.name, department.name


from employee join department
where employee.departmentiD ; department.departmentiD;
Osim rei JOIN, moete zadati i CROSS JOIN ili INNER JOIN.
Kada zadate ovu vrstu spoja, MySQL pretrauje sve tabele koje ste zadali i pokuava
da pronae najefikasniji nain spajanja, pri emu ne spaja tabele obavezno redosledom
koji ste naveli. Dogaa se i to da upit ne bude uvek najbolje optimizovan, to emo
detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako elite da zanemarite
rezultate optimizatora i naloite MySQL-u da spoji tabele ba redosledom koji ste
naveli, zamenite re JOIN reima STRAIGHT JOIN.

Levi spoj radi tako to za sve redove tabele na levoj strani spoja (u ovom primeru to
ll' tabela employee) trai odgovarajue redove u tabeli na desnoj strani spoja. Pronaeni
1 dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u
desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL . Redove iz leve tabele bez
parnjaka u desnoj moete pronai ako zadate uslov daje vrednost kljua u desnoj tabeli
NULL.
Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za
nekog spoljnog klijenta, dobiemo red s podacima o zaposlenom i o poslu koji je
obavio. Kada za nekog zaposlenog ne postoji odgovarajui red u tabeli assignment, levi
spoj generie "prazan red" u kojem sve kolone sadre vrednost NULL. Te prazne redove
moemo pronai tako to potraimo sve zaposlene koji su neto radili za spoljnog
klijenta ija ifra (kolona clientiD) sadri vrednost NULL. (Ne bi trebalo da takav
s l uaj postoji u tabeli assignment budui daje clientiD polje kljua.)
U verzijama MySQL-a pre 4.1, ta tehnika se esto koristila jer nije bilo podu pita.
Podupiti su objanjeni u nastavku ovog poglavlja.
U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da
upotrebimo i operator RIGHT JOIN, koji deluje na isti nain, s tom razlikom to je
desna tabela osnova, a nedostajui redovi iz tabele na levoj strani dopunjuju se vrednostima NULL .

Levi i desni spoj


Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezervisane rei JOIN, CROSS JOIN, INNER JOIN ili moda STRAIGHT JOIN, i traili povezane redove u dve ili vie tabela. ta ako elimo da pronaemo sve redove u jednoj
tabeli za koje ne postoje odgovarajui redovi u drugoj tabeli?
Razmotrimo sluaj u kojem elimo da pronaemo zaposlene koji jo nisu radili na
poslovima za spoljne klijente kompanije, tj. zaposlene ije ifre (vrednosti u koloni
employeeiD) ne postoje u tabeli assignment .To se moe uraditi pomou levog spoja,
odnosno operatora LEFT JOIN, na sledei nain:
select employee . name
from employee left join assignment
on employee.employeeiD; assignment.employeeiD
where clientiD is null;
Ovaj upit daje

sledee

rezultate:

+- - -------------+
l name
l
+--- ------------+
l Ajay Patel
l
l Candy Burnett l
l Ben Smith
l
+-- -------------+
3 rows in set (0.49 sec)

Ako pogledate sadraj tabela, lako ete se uveriti da su rezultati tani, ali kako sm o
do njih doli ?

Pod upiti
Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit iji se rezultat
koristi u drugom upitu. Ponekad se nazivaju i ugneenim upitima (engl. nested queries).
Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogunost korisnici su ve due
vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti esto lake razunlljivi kada se, umesto sloenih spojeva izmeu tabela, upotrebe podupiti.
Ve ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i aurira nj e redova u vie tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
brisanje i auriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
U ovom poglavlju opisaemo upotrebu podupita u komandama SELECT.
MySQL-u su dodate dve osnovne vrste podupita:
Podupiti za izvedene tabele
Podupiti za izraze.
Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve
podvrste:
Pod upite

iji

je rezultat jedna vrednost ili red

Podupite za izraze
Po gledaemo

logikog

tipa

redom po jedan primer svake pomenute vrste pod upita.

l UU

ruyiCIVIJt: l

.:>IULt:IIIJI UfJill

Podupiti za izvedene tabele

Pod upiti

Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu.
Pogledajte sledei jednostavan upit:
select employeeiD, name from employee where job='Programmer';

Jasno je da ovaj upit uitava ifre i imena zaposlenih koji su programeri. Ovaj upit
moemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:
select programmer.name
from (select employeeiD, name from employee where job='Programmer')
as programmer,
assignment
where programmer.employeeiD = assignment.employeeiD;

U ovom primeru upotrebili smo podupit (select employeeiD, name from


employee where j ob= Programmer ') da bismo formirali izvedenu tabel u iji redovi

sadre samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'programmer . Tu tabel u moemo potom pretraivati na isti nain kao bilo koju drugu
tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili
za spoljne klijente i dobili smo sledee rezultate:

+--------------+
l name
+--------------+
l Nora Edwards l
+--------------+
1 row in set

U ovom primeru traimo zaposlenog koji bi mogao zasluiti "titulu" najvrednijeg


1.1dnika u firmi. Pita~ e je sledee: koji je zaposleni proveo najvie radnih sati dnevno
11~ nekom poslu?
Ovo su rezultati izvravanja upita:

1--- ----------+---------- ----+


l employeeiD l name
l -- ----------+--------------+
l
7513 l Nora Edwards l
1-- -----------+------------ --+
l row in set

(0.42 sec)

Mogu se napisati i upiti koji umesto jedne vrednosti, vraaju red s vie vrednosti, ali
.Jl: korist od toga esto ograniena. U nastavku teksta obradiemo primer takvog upita.

Podupiti za izraze logikog tipa


Podupiti za izraze logikog tipa (engl. Boolean expression subqueries) omoguavaju da se
u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima
l ogikog tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME.
Rezervisana re IN omoguava poree~e s grupom vrednosti. Pogledajte sledei
upit:
ne lect name
I r om employee
where employeeiD not in
(select employeeiD
from assignment);

(0.01 sec)

Podupiti koji daju jednu vrednost


Kao u prethodnom odeljku, poeemo jednostavnim upitom:
select max(hours)

from assignment;

Rezultat ovog upita je jedna vrednost, koja predstavlja najvei broj radnih sati utroenih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo
pominjali: to je funkcija max () , koja pronalazi najveu vrednost u zadatoj koloni_
tabele. Funkcijom max () baviemo se vie u poglavlju 8, "Upotreba MySQL-ov1h
ugraenih funkcija u komandi SELECT". U pod upitima koji vraaju jednu vrednost
(engl. single-value subqueries), esto se ova vrsta funkcija koristi za dobijanje meurezul
tata koji se potom koristi za druge proraune.
Kao u prethodnim odeljcima, ovaj upit emo upotrebiti unutar drugog upita.
Rezultat upita koji vraaju jednu vrednost jeste odreena vrednost koja se potom
obino poredi s nekom drugom vrednou. Pogledajte sledei upit:
select e.employeeiD, e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours = (select max(hours) from assignment);

Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT
JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog
klijenta. Rezervisana re IN omoguava da utvrdite da li se data vrednost nalazi u
odre enom skupu moguih vrednosti. U ovom sluaju dobijamo jednake rezultate
kao one koje smo dobili u primeru upita za operator LEFT JOIN:

1-- ---- ---------+


l name
1--- ------------+
/ Ajay Patel
l
l Candy Burnett l
l Ben Smith
l
1-- ------- ------+
3 rows in set

(0.45 sec)

Zanimljivo je da se pomou operatora IN podaci upita mogu porediti i s listom


navedenih vrednosti, kao u narednom primeru:
nelec t name
Irom employee
where employeeiD not in (6651, 1234);

102

Poglavlje 7 Sl oeniji upiti

Opcije komande SELECT

Rezervisana re EXISTS deluje na malo drugaiji nain od rezervisane rei IN.


U upitima u kojima je zada to EXISTS, pod upit zapravo koristi podatke iz spoljnog
(glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit.
Pogledajte sledei upit:
select e.name, e.employeeiD
from employee e
where not exists
(select *
from assignment
where employeeiD = e.employeeiD);
U ovom primeru takoe traimo zaposlene koji nisu nikad radili na poslovima za
spoljne klijente.
Pod upit uitava redove u kojima je ispunjen uslov da je vrednost u koloni
employee ID tabele assignment jednaka vrednosti u koloni employee. employee ID.
Vrednost e. employee ID potie iz glavnog upita. Evo ta MySQL zapravo radi: za
svaki red iz tabele employee ispituje rezultate podupita; ako u tom skupu ne postoji
nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom prosleuje
u konaan skup rezultata upita.
Mada e neki korisnici lake razumeti ovu sintaksu, rezultate jednake onima iz
prethodnog odeljka dobijamo i pomou upita s levim spojem (LEFT JOIN). Ovaj upit
daje potpuno jednake rezultate:

+---------------+-------------+
l

name

employeeiD

+---------------+-------------+
l
l
l

Ajay Patel
Candy Burnett
Ben Smith

l
l
l

6651
9006
9842

l
l

vei od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL,
gde se utvruje da li je broj radnih sati zaposlenog vei od broja radnih sati svakog
programera pojedinano.
Nee vas iznenaditi informacija da ovaj upit ne vraa nijedan red podataka, ime
dokazuje da niko u toj firmi ne radi vie od programera.

Opcije komande SELECT


Kada smo prvi put razmatrali komandu SELECT, opisali smo skraeni oblik opte
sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli ta jo
ne znamo.
U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima sledei opti oblik:
SELECT [STRAIGHT_JOIN)
[SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT)
[SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY)
[DISTINCT l DISTINCTROW l ALL) izraz_za_uitavanje,

...

[INTO {OUTFILE l DUMPFILE} 'ime_datoteke' opcije_pri_izvozu]


[FROM reference_tabela
[WHERE uslov]
[GROUP BY {celobrojna vrednost
ime kolone l formula}
[ASC l DESC) , . .. J
(HAVING uslov]
[ORDER BY {celobrojna vrednost
ime kolone l formula}
[ASC l DESC) , ... J
[LIMIT [pomak,] rows l rows OFFSET pomak]
[PROCEDURE ime_procedure(lista_argumenata)]
[FOR UPDATE l LOCK IN SHARE MODE))

+---------------+-------------+
3 rows in set (0.00 sec)

Veinu odredaba ve poznajete. Pogledajmo ukratko one koje dosad nismo


pominjali:

Rezervisane rei ALL, ANY i SOME omoguavaju poreenje sa skupom vrednosti koje
podupit.
Pretpostavimo da Nora Edwards, koje se moda seate kao programera koji najvie
radi, eli da dokae da niko nema vie radnih sati od programera . Da bi dokazala tu
injenicu, smislila je sledei upit:

Odredba STRAIGHT JOIN na samom poetku komande nalae optimizatoru


upita da spoji tabele ba redosledom koji ste zadali. Uinak ove opcije jednak je
kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao to je napomenuto u
prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proirenja ANSI
standarda za jezik SQL.

select e.name
from employee e, assignment a
where e.employeeiD = a.employeeiD
and a.hours > all
(select a.hours
from assignment a, employee e
where e.employeeiD = a.employeeiD
and e.job='Programmer');

Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT omogua


vaju optirnizovanje upita. Pomou opcija SQL_SMALL RESULT i SQL BIG RESULT
obevetavate MySQL da oekujete da e se skup rezul~ata upita sastoJati od malog,
odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalae MySQL-u da
skup rezultata smesti u privremenu tabel u. Tu opciju moete iskoristiti kada znate
da e slanje skupa rezultata klijentskom programu potrajati prilino dugo, a elite
da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se uitaju.
Ove opcije su MySQL-ova proirenja ANSI standarda za jezik SQL.

vraa

Podu pit uitava listu radnih sati, pojedinano po programeru i po poslu koji je
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni iji je broj r:~dnih sati

104

Poglavlje 7 Sloeniji upiti

i SQL NOCACHE nalau MySQL-u da rezultate smeta, odnosno ne


smeta u ostavu (i~e). Oo jedno proirenje ANSI standarda za jezik SQL.)
SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL izrauna
koliko bi ~kup no-redova upit vratio kada ne bi sadrao odredbu LIMIT. Taj broj
redova se zatim moe uitati pomou opcije select found_rows () ; Uo jedno
proirenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne
ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala,
isti rezultat je mogao da se postigne tako to se najpre izvri upit s funkcijom
COUNT (*),a zatim i drugi upit SELECT koji sadri opciju LIMIT.

SQL CACHE

obavetava MySQL da taj upit treba da ima prednost nad svim


komandama UPDATE koje ekaju pristup tabelama navedenim u upitu .
Ve smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima
suprotan efekat (uitava sve duplikate) a to je i podrazumevana opcija.
HIGH PRIORITY

deluje suprotno od komande LOAD DATA INFILE koju


smo razmatrali u poglavlju 5, "Umetanje, brisanje i auriranje podataka".
Ova komanda smeta rezultate komande SELECT u zadatu datoteku. Odredba
opcije_pri_izvozu ima isto znaenje kao u komandi LOAD DATA INFILE (vie
detalja o tome nai ete u poglavlju 5).
Odredba PROCEDURE omoguava da zadate proceduru koja se poziva pre nego to
se skup rezultata poalje klijentskom programu. Ta procedura mora biti napisana
na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba vie
informacija, potraite ih u MySQL-ovoj dokumentaciji.
SELECT INTO OUTFILE

Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaa maina baze
podataka zakljuava podatke na nivou stranice ili reda. U praksi, opcija je upotrebljiva ako koristite maine InnoDB i BDB.Ako zadate FOR UPDATE, zakljua
vanje podataka e biti iskljuivo, a ako zada te LOCK IN SHARE MODE, zakljuavanje
e biti deljeno.Vrste zakljuavanja razmotriemo u poglavlju lO",Upotreba transakcija u InnoDB tabelama".

Saetak
Spojevi
Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
odredbi FROM, zajedno s vrstom spoja. Treba takoe zadati i uslov koji opisuje na
koji nain bi tabele trebalo da budu spojene.
Operator zarez i rezervisane rei JOIN, INNER JOIN i CROSS JOIN deluju na isti
na in, tj. kombinuju zadate tabele tako da omogue traenje podataka u svim
tim tabelama.
Lev i desni spojevi omoguavaju pronalaenje redova u jednoj tabeli koji nemaju
odgovarajue redove u drugoj tabeli.

rrranJa

Pod upiti
Pod upit je upit ugneen unutar drugog upita.
Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koristiti i za ispitivanje logikih uslova pomou operatora SOME, ALL ili ANY
Pomou operatora EXISTS moe se utvrditi da li u rezultatima podupita postoji
red koji je povezan s nekim redom glavnog upita.

Opcije komande SELECT


Komandi SELECT mogu se pridruiti razne opcije koje optirnizuju izvravanje te
komande.
Pomou komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u
spoljnu datoteku, slino nainu na koji smo u poglavlju 5 uitavali podatke iz
datoteke u tabelu pomou komande LOAD DATA INFILE.
Komandi se mogu dodati procedure (napisane na jeziku C++) koje obrauju
podatke pre prenoenja u MySQL ili iz MySQL-a.

Pitanja
1. De kart ov proizvod je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
2. Levi spoj je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog
3. Jednakovredni spoj je
a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
d) nije nita od prethodnog

106

Poglavlje 7 Sloeniji upiti

u s1eaecem poglaVlJU

4. Korelirani podupit se tako zove zato to uspostavlja korelaciju


a) redova razliitih tabela
b) redova iste tabele

izmeu

e) dva spoja
d) redova glavnog upita i redova podupita
5. Razlika izmeu upita oznaenih sa 5.1 i 5.2 u nastavku teksta j e
a) nema razlike
b) uitavaju razliite podatke
e) uitavaju iste podatke ali je verovatno da
ui tavati
d) uitavaju iste podatke ali je verovatno da
ui tavati

1.
select name, skill
from employee, employeeSkills
where employee.employeeiD = e mpl oye e Skills.employeeiD;

2.

se levi spoj (upit 5.1) bre

se podupit (upit 5.2) bre

select employee.name
from employee left join assignment
on employee.employeeiD = assignment.employeeiD
where clientiD is null;

Upit 5.2:

e. employeeiD) ;

1. Napiite upit koji prikazuje imena zaposlenih i njihove strune kvalifikacije.


2. Napiite upit koji pomou operatora LEFT JOIN formira listu klijenata za koje
nijedan od zaposlenih nije obavio nijedan posao.
3. Upit iz vebe broj 2 napiite tako da koristi operator EXISTS.

Pitanja
1. a
2. e

3. b
4. d
5. e

3.
select clientiD, name
from client
where not exists
(select *
from assignment
where assignment . clientiD

client.clientiD);

U sledeem poglavlju
U poglavlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT",
razmatraemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.

Vebe

Odgovori

select client.clientiD, name


from client left join assignment
on client . clientiD = assignmen t. clientiD
where employeeiD is NULL;

sledea

Upit5 .1:

select e.name, e.employeeiD


from employee e
where not exists
(select *
from assignment
where employeeiD

Vebe

8
Upotreba MySQL- ovih ugraenih
funkcija u komandi SELECT

UGRAENIH

MYSQL SADRI IROK OPSEG


OPERATORA I FUNKCIJA koji mogu biti
korisni pri pisanju upita. Veina je namenjena upotrebi i odredbama SELECT i WHERE.
Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi
GROUP BY. Ve smo koristili osnovne operatore za poreenje i funkcije count () i
max (). U MySQL-u je na raspolaganju veliki broj ugraenih funkcija. U ovom poglavlju razmotriemo najkorisnije meu njima. Ovu knjigu nismo zamislili kao referentni
prirunik za MySQL-ove funkcije, ve samo pokuavamo da predoimo sliku funkcionalnosti koja je na raspolaganju.
Razmotriemo sledee teme:
Operatori
Funkcije za upravljanje tokom izvravanja
Funkcije za rad sa znakovnim vrednostima
Numerike funkcije

Funkcije za rad s datumima i vremenima


Funkcije za konverziju tipova podataka
Druge funkcije
Funkcije za upotrebu u odredbama GROUP

BY.

Vano je zapamtiti da se u MySQL-u svaki izraz koji sadri vrednost NULL svodi na
vrednost NULL, uz nekoliko izuzetaka koje emo istai kada budemo naili na njih. O
lome e biti vie rei u odeljku o operatorima za poreenje vrednosti.

Poglavlje 8 Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT

Uporedite to sa

ovom poglavlju koristiemo komandu SELECT bez navoenja tabela u njoj.


Komanda SELECT moe se upotrebiti kao jednostavan kalkulator. N a primer, ako

+--- - ----- - - - --+


l NULL IS NULL l
+--------------+

se lect 2+2;
rezultat

+- ----+
1 row in set (0.42 sec)
Moete izvravati izraze koji ne sadre imena tabela i u kojima moete zadavati irok
opseg matematikih i drugih operatora i funkcija. Izraun~:ranje 2+2 je ~aista trivijalno,
ali to svakako ne vai za izvravanje matematikih operaciJa u komandi SELECT. Na
primer, to vam omoguava da uradite finansijsku analizu vrednosti u tabelama i da

zatim prikaete rezultate u obliku izvetaja.


U svim MySQL izrazima moete zadavati zagrade da biste upravljali redosledom
kojim se izraunavaju pojedini delovi izraza, na isti nain kao u bilo kom drugom programskom jeziku.
Pogledajmo najpre operatore.

Operatori

MSQL-u postoje tri glavne grupe operatora: aritmetiki, za poreenJe vrednosti


i logiki . Operatore smo ukratko ve opisali u poglavlju 6, "Korienje upita u
MySQL-u". Sada emo ih detaljnije razmotriti.

Operatori za poreenje vrednosti

+-- -- - -- - -- - +
l NULL=NULL l
+-------- - - -+
NULL l

select * from department where name='marketing';


Ovaj upit e pronai
izgledaju ovako:

'marketing' bez obzira na to kako je napisana, a rezultati

+- ------- --- ----+-----------+


l departmentiD l name
+- -- - ---- - - -- ---+-----------+
130 l Marketing l
+---------------+-----------+
l row in set (0.41 sec)

Ovako napisan upit ne

re

uitava

nijedan red iz baze podataka employee:

Empty set (0.18 sec)


Posle ovog uvoda, moemo prei na operatore za
operatori navedeni u tabeli 8.1.

Tabela 8.1

Operator

Operatori za

poreenje
Znaenje

Jednako
!= ili <>

Razliito

<

Manje od
Jednako ili manje od
Vee od
Jednako ili vee od

<=

>

>=

sec )

re

select * from department where name = binary 'marketing';

N ajvanije to bi trebalo da zapamtite ~vezivs~ ope;atorima za poreenJe vr:~nosu


j este sledee : izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL,
uvek daje NULL. To vai i za poreenje NULL s NULL:
se lect NULL=NULL;

Ovaj primer istie ono to smo napomenuli u poglavlju 6, a to je da morate oprezno korisiti operatore za poreenje ukoliko se meu podacima moe pojaviti i NULL.
Druga injenica koju bi trebalo da zapamtite jeste da se u veini sluajeva , pri pareenju vrednosti znakovnog tipa u MySQL-u ne pravi razlika izmeu malih i velikih
slova. Ako elite da se znakovne vrednosti porede tako da se ipak pravi razlika izmeu
malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,

Ako je potrebno razlikovanje malih od velikih slova, dodajte rezervisanu


binary, na sledei nain:

Aritmetiki operatori
v

MySQL podrava uobiajene aritmetike operatore koje biste ocekivali: sabiranJe(+),


oduzimanje (-), mnoenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL.

-----------+
1 row i n set (0 . 00

+--------------+
l row in set (0.00 sec)

+-- ---+
l 2+2 l
+-- ---+
4

upitom:

select NULL IS NULL;

za date
dobiete

sledeim

od

poreenje. Najee

se koriste

ll

!'oglavlJe tl upotreoa My:>uL-ovm ugraaenm runKCIJa u KomanOI :>tLtLI

Tabela 8.1

Operatori za

poreenje

(nastavak)

Znaenje

Operator

n BETWEEN min AND max Poreenje da li se n nalazi u opsegu vrednosti od min do max.
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se moe zadati u obliku liste

vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah,


breskva)
Operator za jednakost koji se moe upotrebiti i za NULL. Kada se
pored e dve vrednosti NULL, rezultat je l (true).
Ispituje da li n ima vrednost NULL
Ispituje da li n ima vrednost NULL.

<=>

n IS NULL
ISNULL(n)

Logiki operatori
MySQL podrava sve uobiajene logike operatore koji povezt~u delove izraza.
Logiki izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
MySQL tumai kao true (istinito, tano) svaku vrednost razliitu od nule i razliitu od
NULL.
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugaiji
od onog to biste oekivali. Tabela 8.2 prikazuje logike operatore.
Tabela 8.2

Logiki

operatori

Operator

Primer

Znaenje

AND ili &&

n && m

Logiko

OR ili ll

NOT ili

XOR

n ll m

NOT n

n XOR m

I. Tabela istine izgleda ovako:


true&&true = true
false&&bilo ta = false
Svi ostali izrazi svode se na NULL.
Logiko ILI. Tabela istine izgleda ovako:
true l lbilo ta= true
NULLI l false= NULL
NULL l l NULL = NULL
false! l false = false
Logiko NE. Tabela istine izgleda ovako:
!true = false
!false = true
!NULL = NULL
Logiko iskljuivo ILI. Tabela istine izgleda ovako:
true XOR true = false
true XOR false = true
false XOR true = true
NULL XOR n = NULL
n XOR NULL = NULL

runkCIJe za upravlJanje tokom izvravanja komandi

Funkcije za upravljanje tokom izvravanja komandi


Najpre emo razmotriti grupu funkcija za upravljanje tokom izvrava~a komandi.
Meu njima su najkorisnije IF i CASE, koje deluju slino iskazu if, odnosno switch
ili case iz veine programskih jezika.
Prototip funkcije IF izgleda ovako
IF

(el,

e2,

e3)

Ako izraz el ima vrednost true, funkcija IF vraa rezultat e2; u suprotnom, rezultat
funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee,
moemo zadati sledei upit:
select name, if(job='Programmer', "nerd", "not a nerd")
from employee;
Ovaj upit daje sledee rezultate:

+---------------+--------------------------------------------+
l name

l if(job='Programmer', "nerd", "not a nerd")

+---------------+--------------------------------------------+
l
l
l
l

Ajay Patel
Nora Edwards
Candy Burnett
Ben Smith

nerd
nerd
not a nerd
not a nerd

+---------------+--------------------------------------------+
4 rows in set

(0.00 sec)

Funkcija CASE ima sledee mogue prototipe (prema MySQL-ovoj dokumentaciji):


CASE vrednost
WHEN [vrednost-za-poreenje] THEN rezultat
[WHEN [vrednost-za-poreenje] THEN rezultat .. . ]
[ELSE rezultat]
END
ili
CASE
WHEN [uslov] THEN rezultat
[WHEN [uslov] THEN rezultat ... ]
[ELSE rezultat]
END
Ovu funkciju moete upotrebiti da biste izdvojili jednu vrednost iz skupa od ~ih
nekoliko. Primera radi, pogledajte sledei upit:
select workdate, case
when workdate e 2000-01-01 then "archived"
when workdate e 2003-01-01 then "old"
else "current"
end
from assignment;

1'14

PoglavlJe 8 Upotreba My:>UL-ovlh

ugraenih

runKCIJe za raa sa znaKovnim vreanost1ma

tuni<CIJa u 1<omand1 :>tLtCI

Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele
assignment. Datumi iz prethodnog veka oznaavaju se sa "archived", datumi iz prethodne godine oznaavaju se sa "old", dok se svi ostali datumi oznaavaju kao
"current".

Funkcije za poreenje znakovnih vrednosti


Osim operatora jednakosti, u MySQL-u postoji i vie drugih funkcija za poreenje
dve znakovne vrednosti:
LIKE: Poreenje s dokerskim znacima.
RLIKE:

Poreenje

s regularnim izrazima.

Funkcije za rad sa znakovnim vrednostima

STRCMP: Poreenje znakovnih vrednosti, slino funkciji strcmp () u jeziku C.

MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funkcije za obradu znakovnih vrednosti i funkcije za poreenje znakovnih vrednosti.
Verovatno ete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.

MATCH: Tekstualno pretraivanje.

Funkcije za obradu znakovnih vrednosti


Tabela 8.3 prikazuje najkorisnije funkcije za obradu znakovnih vrednosti. U dokumentaciji su opisane i mnoge druge.
Tabela 8.3

Funkcije za obradu znakovnih vrednosti

Funkcija

Namena

concat(s1, s2, ... )


conv(n, izvorna_baza,

Spaja znakovne vrednosti sl, s2, ....


Pretvara broj n iz baze izvorna_baza u broj baze
nova_ baza. (Moda vas je iznenadilo to to je ova funkcija
nova_baza)
navedena meu funkcijama za rad sa znakovnim vrednostima,
ali se za notaciju nekih baza koriste slova, kao u heksadecimalnoj bazi.)
length (s)
Vraa ukupan broj znakova sadranih u s.
Vraa sadraj datoteke ime_ datoteke kao jedan niz
load file
znakova.
(ime_ datoteke)
locate (igla,plast_sena, Vraa poetnu poziciju niza znakova igla u nizu
pozicija)
plast_sena. Traenje poinje od pozicije pozicija.
lower (s) i upper (s)
Pretvara niz znakova s u mala, odnosno velika slova.
quote (s)
Preslikava niz znakova s u oblik pogodan za smetanje u bazu
podataka. To podrazumeva uokvirivanje znakovnog niza
polunavodnicima i umetanje obrnute kose crte.
replace(izvor, nai,
Vraa niz znakova izvor u kojem je podniz nai zamenjen
za mena)
nizom zamena na svim mestima gde se pojavljuje.
soundex(s)
Vraa soundex oblik izvornog niza znakova s. Soundex oblik
znakovne vrednosti predstavlja nain na koji znakovna
vrednost treba da se izgovara na engleskom jeziku . Na primer,
ponekad je lake pronai ime osobe ako se trai sound ex oblik
a ne kako je ime napisano .
substring(s, poetak,
Vraa ukupno znakova iz niza s, poev od poetak.
ukupno)

trim (s)

Uklanja poetne i zavrne beline iz niza znakova s. (Pomou


funkcije l trim () moete ukloniti samo poetne beline, a
funkcija rt rim () uklanja zavrne beline.)

U ovom odeljku objasniemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretraivanje je na raspolaganju samo u My ISAM tabelama. Vie informacija o tome nai ete
u poglavlju 9, "Tipovi tabela u MySQL-u".
Poreenje s dokerskim znacima pomou funkcije LIKE

Pogledajmo primer upotrebe operatora LIKE:


select *
from department
where name like '%research%';
U ovom primeru ne traimo nazive jednake rei 'research', ve nazive koji bilo
gde sadre re 'research'. Rezultati su sledei:

+---------------+--------------------------+
l departmentiD l name
+---------------+----------------- ---------+
128 l Research and Development l
+---------------+------ --------------------+
l row in set

(0.04 sec)

Funkcija LIKE podrava dva naina poreenja s dokerskim znacima. Znak za procenat (%), upotrebljen kao u navedenom primeru, utvruje poklapanje s grupom znakova bilo koje duine (ukljuujui i nula). To znai da se izraz '%research%' poklapa
sa svakom znakovnom vrednou koja sadri re research. Imajte u vidu da se pri
poreenju znakovnih vrednosti obino ne pravi razlika izmeu malih i velikih slova,
kao to je objanjeno u prethodnom delu ovog poglavlja.
Stariji dokerski znak je podvlaka U, kojim se utvruje poklapanje s jednim znakom. Na primer, '_at' se poklapa sa znakovnim vrednostima cat , mat , bat itd.
Poreenje s regularnim izrazima pomou funkcije RUKE

Funkcija RL IKE omoguava poreenje znakovnih vrednosti s regularnim izrazima.


Regularan izraz je ablon koji opisuje opti oblik znakovne vrednosti. Uslovi koje
bi trebalo da ispunjavaju znakovni nizovi koje traimo, opisuju se posebnom notacijom. Razmotriemo ukratko tu notaciju.
Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To znai da se ablon
'cat' poklapa s reju 'cat'. Meutim, poklapanje vai i za catacomb i the cat
sat on the mat'. ablon 'cat' pronalazi niz znakova cat na svim mestinu
unutar veeg niza znakova.

116

Poglavlje 8 Upotreba MySQL-ovih ugraenih tunkciJa u komano1 ::,tLtLI

Ako elite da ablon pronalazi samo re 'cat', onda ga morate izmeniti u '"'cat$'.
Znak karet ("') znai "fiksni poetak niza znakova"; drugim reima, niz znakova koji
traimo mora da poinje reju 'cat'. Znak za dolar($) znai "fiksni kraj niza znakova"; drugim reima, niz znakova koji traimo mora da se zavrava reju 'cat'.
Prema tome, ablon '"'cat$' prihvata samo re 'cat' i nita drugo.
U regularnim izrazima podrani su i dokerski znaci, isto kao u funkciji LIKE.
Meutim, dokerski znak je drugaiji. Postoji samo jedan - taka (.) - koji odreuje
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvruje poklapanje s
'cat', 'bat', 'mat' itd.
Dovoljan je samo jedan dokerski znak jer se u traenom nizu znakova moe zadati
i ponavljanje znakova (ukljuujui i dokerske znakove) odreen broj puta.
Kada iza nekog znaka postavite specijalni znak *, to znai da se prethodni znak
moe pojaviti nula ili vie puta. Na primer, ablon 'n*' prihvata ' ', 'n', 'nn', 'nnn'
itd. Znaci se mogu grupisati izmeu zagrada, tako da ablon ' (cat)*' prihvata ' ',
'cat', 'cat cat', 'catcatcat' itd. Mogua je i upoteba dokerskih znakova, pa
ablon ' . * ' prihvata neogranien broj znakova, to praktino znai svaki niz znakova.
Slino tome, znak plus(+) znai da se znak ili niz znakova ispred njega moe pojaviti jedanput ili vie puta, a upitnik (?) znai jednom ili nijednom. Moete zadati i
opseg vrednosti, tako da ablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i
'catcatcatcat'.
Osim pojedinanih znakova i nizova znakova, moete zadavati i skupove znakova,
koji se piu izmeu uglastih zagrada. Na primer, ablon ' [a-z] ' prihvata bilo koje
pojedinano slovo, dok ablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g
broja znakova.
I najzad, postoji vie klasa znakova, koje su zapravo unapred definisani skupovi
uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumeriki znak.
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL
podrava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih
regularnih izraza.
A sada, pogledajmo primer upotrebe ablona s funkcijom RLIKE. Razmotrite sledei upit:
select * from department where name rlike 'an';
Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadre niz znakova 'an':
+---------------+---------- ----------------+
l departmentiD l name
+------------ ---+-------------- ------- -----+
42
Finance
128 l Research and Development l
129 l Human Resources
l
+---------------+------- ------- --------- ---+
3 rows in set (0.00 sec)

Numerike funkcije

. Regularni izrazi mogu biti veoma moni, ali i veoma sloeni. Ako vam treba vie
pnmera i opirniji opis sintakse, na Webu ete nai mnogo dobrih tekstova na tu
temu.
Poreenje nizova znakova pomou funkcije STRCMP()

~a .funkciju s:RCMP (). ~ MySQL-u vae iste konvencije kao i u drugim programskim
JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
STRCMP(sl, s2)
a funkcija vraa sledee vrednosti:

o ako su nizovi znakova jednaki


ako je sl maqji od s2 - ~ ako po redosledu sortiranja sl dolazi ispred
ako je sl vei od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2

-l

s2

Rezultati narednih upita izgledaju ovako:


mysql> select strcmp ('cat , cat ) ;

+- ---------------------+
l strcmp ('cat', 'cat') 1
+- ---------------------+

o l

+- ---------------------+
l row in set (0.42 sec)

mysql> select strcmp('cat', 'dog');

- -------------- -------+
l strcmp( 'cat', 'dog') 1
+- ---------------------+

-1

1- ---------------------+
l row in set (0.00 sec)

mysql> select strcmp('cat', 'ant');

-- --------------------+
l

strcmp( 'cat', 'ant')

-- -------------------+
l
l l
l
- --------------------+
l

row in set

(0.00

sec)

Imajte u vidu da ~edosled s~rtiranja zavisi od lokalnog skupa znakova koji je aktivan . Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti e biti sortirane
kako biste i oekivali, pod uslovom da ste zadali odgovarajui skup znakova kada ste
11:tprav1h tabelu.

Numerike funkcije
l'.1bela .8.4
prikazuje
nekoliko korisnih numerikih funkciia.
U MySQL- OVOJ d O k ll _
..
" ,
~
rete opise mnogih drugih funkcijn iz ll' kategorije.

111\'lltnc~p nar1

118

Funkcije za rad s datumima i vremenima

Poglavlje 8 Upotreba MySQL-ovih ugraemh tunKCIJa u KomanOI ;:,tLtLI

Tabela 8.4

Funkcije za rad s datumima i vremenima

Numerike funkcije

Svrha

Funkcija

Vraa apsolutnu vrednost n, a to je vrednost bez predznaka.

abs (n)
ceiling (n)

Vraa vrednost n zaokruenu navie na najblii ceo broJ.


Vraa vrednost n zaokruenu nanie na najblii ceo broj.
Ove dve funkcije dele n sa m. Funkcija di v vraa celo brojni rezultat,

floor (n)
mod (n, m) i div

a funkcija mod () vraa celo brojni ostatak deljenJa.


Vraa

n podignuto na stepen m.
..
Vraa sluajno generisan broj u opsegu o~ O do l. Parametar n mJe
.
obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za g~nensanJe
pseudosluajnih brojeva. ~Za istu vrednost n prosleenu funkciJI rand
generie se ista pseudoslucaJna vrednost.)
Vraa n zaokrueno na najbliu celobrojnu vrednost. Ako zadate
i parametar d, n vrednost se zaokruuje na d dectmalruh mesta.

power (n, m)
rand(n)

round (n[, d])

Vraa kvadratni koren od n.

sqrt (n)

..

Pogledajmo primer upotrebe funkClj3 mod() l d~ v..


v
zbunjujue je sledee: dok se mod moe napisati u obhku

e zi sa ovim funkcijama

mod(9, 2)

Tabela 8.5 prikazuje nekoliko najkorisnijih funkcija za rad s datumima i vremenima.


Zahvaljujui MySQL-ovoj orijentisanosti na analizu podataka, skup funkcija za rad
s datumima i vremenima veoma je bogat. Naredni spisak daleko je od potpunog.
Tabela 8.5

Funkcije za rad s datumima i vremenima

Funkcija

adddate(datum , INTERVAL Ove funkcije slue za sabiranje i oduzimanje datuma. Vrednosti


n tip) i subdate (datum, zadatoj parametrom datum dodaju, odnosno od nje oduzim~u
INTERVAL n tip)
period zadat pomou rezervisane rei INTERVAL. Morate zadati
i koliinu n i tip te koliine.
Parametar tip moe imati vrednost SECOND, MINUTE, HOUR,
DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude
izraeno u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR
('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'),
DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s').
Ove funkcije su zaista korisne, ali poto je gotovo nemogue
zapamtiti sve formate za datume i vremena Qer se razlikuju),
moraete da ih potraite u MySQL-ovoj dokumentaciji.
curdate(), curtime(),
now()
date_format(datum,
format) i
time_format(vreme,
format)

ili
9 mod 2

ili ak
9 %2

funkcija di v moe se napisati samo kao


9 div 2
Primera radi
div(9, 2)

nee raditi ve e izazvati sintaksnu greku.

d i div u MySQL-u daje sledee rezultate:


U potre b a fiun k CIJa mo
mysql> select 9 mod 2;

+---------+

9 mod 2

+---------+

Namena

Ove funkcije vraaju tekui datum,


datum i vreme.

tekue

vreme, odnosno

tekui

Pomou ovih funkcija moete izraziti datume i vremena u


gotovo svakom fom1atu koji zamislite. To se radi tako to se
zada format u obliku niza znakova, kao u sledeem primeru:
date_format(workdate, '%W %D of %M, %Y').
Navedeni format prikazuje datum u obliku, na primer,
'Monday 16th of June, 2003 '. Poto je spisak moguih
formata prilino dugaak, detaljnije informacije potraite u
dokumentaciji.

dayname (datum)

Ova funkcija daje englesko ime dana u nedelji zadatog u


parametru da t um (na primer, ' Monday ').
extract(tip FROM datum) Ova funkcija izdvaja iz datuma datum komponentu iji tip
zadajete parametrom tip. Na primer, ako zadate YEAR, funkcija
izdvaja godinu iz datuma. Tipovi komponente su isti kao u
parametrima funkcija adddate () i subdate ().
unix_timestamp( [datum]) Ova funkcija daje tekui datum i vreme u Unixovom formatu
timestamp. (Vrednost je broj sekundi koji je protekao od 1.
januara 1970. godine.) Ako zadate i datum, rezultat je timestamp
vrednost koja odgovara tom da t umu.

+---------+
1 row in set (0.00 sec)

Pogledajmo primer upotrebe funkcije adddate (). Datumu 1. januar 1990. dodajemo godinu i est meseci:

mysql> select 9 div 2;

s elect adddate("l999-01-01", INTERVAL "1-6" YEAR_MONTH);

+---------+

9 div 2

+-- - -- ----+

----

L-------~--~--l_o_w__l_n~n--__(o . oo ae:c~)--------------~------------------------------~---

120

Fukcije za upotrebu u odredbi GROUP BY

Poglavlje 8 Upotreba MySQL-ovih ugraenih funkcija u komandi ~tltCI

Rezultat je sledei:

+--------------------------------------------------+
l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l
+------------------- ----------------------- --------+
l 2000-07-01
l
+------------------------------------------------- -+
1 row in set (0.41 sec)
U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom
programu, to moda nee biti najpogodniji oblik prosleivanja datuma. Unixov format timestamp nije razumljiv oveku, ali su vrednosti zadate u tom formatu potpuno
kompatibilne sa API funkcijama drugih programskih jezika.
Isti upit, ali s funkcijom unix_timestamp ()

Druge funkcije
U MySQL-u postoje i funkcije koje se mogu svrstati u grupu "ostalo". Na primer,
postoje funkcije za generisanje he vrednosti i ifrovanje, ali i mnoge druge veoma
korisne funkcije. U tabeli 8.6 navedene su najee koriene funkcije.
Tabela 8.6

Ostale funkcije

Funkcija

Namena

benchmark

vrednost izraza izraz zadati broj puta, Ova funkcija


nulu - njena svrha je da meri vreme potrebno za
izraunavanje izraza i prikae dobijena vreme.
ifruje vrednost s pomou Unixove sistemske funkcije crypt.
Neobavezni parametar zrnce je niz od dva znaka. Ako funkcija
crypt nije na raspolaganju u vaem sistemu Qer imate, na primer,
Windows), funkcija vraa rezultat NULL.
Daje podatak o ukupnom broju redova koji bi ui tao poslednji upit
kada ne bi sadrao odredbu limit. Deluje samo ako je u komandi
SELECT zadata opcija SQL_CALC_FOUND_ROWS, kao to je opisano
u poglavlju 7.
Vraa poslednju vrednost AUTO_INCREMENT koja je bila automatski generisana. To je korisno kada u tabel u dodate nov red i potreban vam je njegov identifikator da biste ga upisali kao vrednost
spoljnog kljua u drugu tabelu.
Vraa 128-bitni he ulaznog niza znakova s u MDS formatu. Ako
piete aplikaciju koja uva imena korisnika i lozinke, to je preporuljiv oblik skladitenja lozinki u bazu podataka.
Algoritmi za ifrovanje podataka imaju ogranien vek upotrebljivosti. Budui da snaga raunara neprekidno raste, neophodni su i
sve snaniji algoritmi za ifrovanje podataka. MDS se zasad smatra
prilino sigurnim.
Izraunava ifrovan oblik za lozinku zadatu parametrom s. To nije
oblik u kojem se interno uvaju lozinke korisnika MySQL-a, to je
opisano u poglav~ u 11, "Upravljanje pravima korisnika". Upotreba
funkcije password () za ifrovanje lozinki koje se uvaju u bazi
podataka ne preporuuje se.

(broj, izraz)

encrypt(s[,zrnce])

select unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6"


YEAR_MONTH) ) ;

generie rezultat neupotrebljiv za oveka ali direktno upotrebljiv u drugom program-

found_rows ()

skom kodu, kao to je PHP-ova funkcija date ():

+------------------------------------------------------------------+
l unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" YEAR_MONTH)) l
+------------------------------------------------------------------+
962373600 l
+------------------- -- ---------------------------------------------+
1 row in set (0.01 sec)

last_insert_id ()

md5 (s)

Funkcije za konverziju tipova podataka


Postoje samo dve funkcije za konverziju tipova podataka, cast () i convert (), koje
daju isti rezultat, ali se sintaksa malo razlikuje. Ove funkcije omoguavaju konverziju
tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer)
u drugi (na primer, char).
Prototipovi ovih funkcija su sledei:

password(s)

cast(izraz AS tip)
convert(izraz, tip)
Funkcija cast () podrana je u ANSI standardu, a funkcija convert () podrana je
u ODBC standardu.
Parametar tip moe imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
(INTEGER)

i UNSIGNED (INTEGER).

Veina konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba;


na primer, ako funkciji za rad s vrednostima znakovnog tipa prosledite broj, on e
automatski biti pretvoren u niz znakova.

Izraunava

uvek

vraa

Fukcije za upotrebu u odredbi GROUP BY


Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad
naziVaJU grupne ili agregatne funkcije. Moete ih primeniti i na ceo skup rezultata
upita, pri emu se svi redovi obrauju kao pripadnici jedne grupe. To smo ve upotrebili u upitima kao to je sledei:
select count(*)
from employee;
Ovaj upit daje ukupan broj redova u tabeli employee.

122

Poglavlje B Upotreba MySQL-ovih ugraenih funkcija u komandi SELI::CI

Ove funkcije se

obino

primenjuju na grupe podataka , kao u

Odgovo1

sledeem

primeru:

select job, count(job}


from employee
group by job;

3. Koju biste od sledeih funkcija upotrebili da dobijete ime meseca u datumu?


a) dayname ()
b) extract()
e) subdate ()
d) now()

Ovaj upit prebrojava koliko ima zaposlenih na svakom radnom mestu.


Tabela 8.7 prikazuje listu najkorisnijih grupnih funkcija .

4. Koju od sledeih funkcija poziva MySQL kada interno ifruje lozinke svojih
korisnika?

Funkcije za rad s grupama podataka

Tabela 8.7

Funkcija

avg (kolona)
count(kolona)
min (kolona)
max (kolona)
std (kolona)
sum (kol ona)

Namena

a) password()

Vraa

b) encrypt ()
e) rodS()
d) sha()

Vraa
Vraa
Vraa

Vraa
Vraa

prosek vrednosti sadranih u koloni kolona .


ukupan broj vrednosti u koloni kolona.
najmanju vrednost u koloni kolona.
n;Uveu vrednost u koloni kolona.
standardni otklon za vrednosti sadrane u koloni kol ona.
zbir vrednosti sadranih u koloni kolona .

5. Ako u komandi SELECT upotrebite grupnu funkciju a ne zadate odredbu GROUP


a) to je sintaksna greka
b) cela tabela se

d) svaki red se obrauje kao jedna grupa

MySQL prua izbor aritmetikih i logikih operatora, kao i operatora za pereenje vrednosti. Pri upotrebi operatora morate naroito obratiti panju na
mogunost pojave vrednosti NULL jer u tom sluaju rezultati nee uvek biti
kakve oekujete.
MySQL prua bogat izbor funkcija za rad s vrednostima znakovnog i numeri
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije .
Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama
tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funkcije deluju na sve vrednosti u koloni tabele.

Vebe
l. Napiite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
nog mesta 'Programmer', treba da se prikae 'Analyst 1 Programmer'.

2. Napiite upit koji u kolonu department dodaje novu slubu iji je naziv Property
Services. Zatim napiite upit koji dodaje novog zaposlenog, ije je ime Fred Smith
a radno mesto DBA i radi u toj slubi. Upotrebite funkciju last_insert_id (} da
biste dobili identifikator nove slube.
3. Napiite upit koji uitava najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .

Pitanja
l . Koji se od sledeih operatora ne mogu upotrebiti za ispitivanje da li je
vrednost jednaka NULL?
a) ISNULL ()
<=>

e) IS NULL
d)
2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste
a) -1
b)

kao jedna grupa

e) ceo skup rezultata se obrauje kao jedna grupa

Saetak

b)

obrauje

e) 1
d) 2

odreena

Odgovori
Pitanja
l. d
2. b

3. b
4. a

5. e

124

Poglavlje 8 Upotreba MySOL-ovih ugraen ih funkcija u komane11 ~tLtLI

Vebe

I~

l.
select name, replace(job,
from employee;

'Programmer',

'Analyst/Programmer')

2.
insert into department values
(NULL, 'Property Services');
insert into employee values
(NULL, 'Fred Smith', 'DBA', last_ins ert_id());

Tipovi tabela i transakcij

u MySOL-

3.
select max(workdate)

from assignment;

U sledeem poglavlju
Ovo poglavlje zavrava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi
tabela i transakcije u MySQL-u", razmotriemo pojedine maine baze podataka koje
MySQL podrava i posebne mogunosti koje one pruaju.

9 Tipovi tabela u MySQL-u


10 Upotreba transakcija u InnoDB tabelama

9
Tipovi ta bela u MySQL-u

RAZMOTRIEMO

OVOM POGLAVLJU
TIPOVE TABELA koje su na raspolaganju
projektantu MySQL aplikacija. U dosadanjim primerima koristili smo uglavnom
InnoDB ili My ISAM tabele, ali postoje i druge.
Projektovanje sistema za upravljanje bazama podataka, slino projektovanju sistema
za druge namene, podrazumeva mnogo kompromisa. Na primer, poeljno je da se
mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo,
treba vie vremena i troi se vie prostora na disku i vea koliina memorije. Deo posla
pronalaenja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta
baze podataka, tako to su vam prepustili izbor tipa tabela koje ete koristiti. Moete
se opredeliti zajedan od tipova koji podravaju transakcije, ukoliko je to neophodno
u vaoj aplikaciji, ili moete izabrati tip tabela koji obezbeuje bolje performanse, ali
ne podrava transakcije. U oba sluaja morate biti svesni kompromisa koje morate
da napravite.
Moda ete uti da se tipovi tabela nazivaju maine za skladitenje (engl. storage
engine). To odraava injenicu da je za upotrebu nekih tipova tabela neophodna znaajna koliina posebnog programskog koda koji upravlja smetanjem podataka, indeksiranjem, zakljuavanjem podataka i pristupanjem disku. To takoe odraava sutinu
baze podataka: skladitenje podataka.
Izrazi transakcij"a ili podrka za transakcije pojavljivae se esto u ovom poglavlju. To
je vaan uslov o kojem treba da vodite rauna kada birate tip tabele. U primerima koje
smo dosad naveli u ovoj knjizi, SQL upiti su se izvravali potpuno izolovana do drugih
korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne deava.
Zamislite da imate bazu podataka o prometu na bankovnim raunima. Ako elite
da prebacite 1.000 dinara s jednog rauna na drugi, potrebna su vam najmanje dva
SQL upita- jedan, koji na prvom raunu smanjuje stanje za 1.000 dinara i drugi, koji
poveava stanje na drugom raunu za 1.000 dinara. Bilo bi prava katastrofa kada bi se

128

Poglavlje 9 Tipovi tabela u My:;,uL-u

IVIYIJMIVI

zbog neeg (na primer, prestanka napajanja) prvi upit izvrio do kraja, ali ne i drugi.
U takvim sluajevima bilo bi neuporedivo bolje da se izvre ili oba upita, ili nijedan,
jer baza podataka mora uvek biti u usklaenom stanju.
Tabele koje podravaju transakcije omoguavaju da za date da je odreena grupa
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do
kraja, a ako to nije mogue, baza podataka mora da je po11iti (engl. roll back), odnosno
da se vrati u stanje u kojem je bila pre poetka transakcije.
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10,
"Upotreba transakcija u InnoDB tabelama".
U MySQL-u se mogu koristiti sledei tipovi tabela:

MyiSAM tabele su uvele

MERGE
Sve navedene tipove tabela objasniemo pojedinano, ali najvie prostora posvetiupotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
podravaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne ine.
U ovom poglavlju objasniemo i posebne mogunosti koje pruaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraivanje. Celo poglavlje 1O posveeno je
posebnim mogunostima maine za skladitenje InnoDB.
emo najee

ISAM tabele
ISAM tabele su ukljuene u MySQL samo radi podrke starijim aplikacijama. Budui
daje njihova funkcionalnost u potpunosti odrana MyiSAM tabelama, neemo ih
detaljno razmatrati. Planirano je da budu uklonjene iz budue verzije MySQL-a 5.0.
Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:
create table asset
assetiD int not null,
description varchar(255}
type=ISAM;

ISAM tabele omoguavaju brz pristup podacima ali ne podravaju transakcije. Vei
deo onoga to emo rei o My ISAM tabelama vai i za ISAM tabele, pri emu za starije ISAM tabele postoji vie ogranienja.

poboljanja:

Prenosivost tabela. Tabele smeten e na disk ili na druge medije mogu se prene ti na
drugi raunar na kojem radi MySQL, bez obzira na platformu. To ne vai za
ISAM tabele.
Podrka za veoma velike tabele. Veliina ISAM tabela je ograniena na 4 GB.
MyiSAM omoguava da tabela bude velika onoliko koliko to dozvoljava operativni sistem. Budui da e to biti vano samo nekim korisnicima, moraete
paljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
sistemi za rad s datotekama ograniavaju veliinu datoteka na najvie 2 GB.
(Imajte u vidu da to ogranienje moete zaobii ako upotrebite MERGE tabele.)
Efikasnije iskorienje prostora na disku. Manji su rascepkanost i praznine na disku.
Manja ograni{enja klju{eva. ISAM tabele podravaju najvie 16 kljueva po tabeli,
a podrazumevana maksimalna duina kljua je 256 bajtova. My ISAM tabele
podravaju 64 kljua po tabeli, a podrazumevana maksimalna duina kljua je
1024 bajta.

ISAM
MyiSAM
InnoDB
BerkeleyDB (BDB)

HEAP

sledea

ldU~I

ISAM tabele treba smatrati zastarelim. One i dalje postoje, ali ne bi trebalo da ih
koristite u novim aplikacijama koje razvijate. Ako upotrebljavate ISAM tabele, trebalo
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uloiti je
veoma mali, a prednosti su znaajne.

MyiSAM tabele
Mnogi ljudi godinama koriste MySQL ne znajui da moe da radi i s tabelama drugog
tipa. Razlog je to to se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a.
My ISAM tabele omoguavaju veoma brz pristup podacima ali ne podravaju
transakcije. One obezbeuju visoke performanse u mnogim situacijama, ak i kada
projektant napravi odreene greke, a u rukanu strunog administratora mogu da
podre i veoma obimne i/ili veoma optereene baze podataka.
Naredni kod formira MyiSAM tabelu:
create table article (
articleiD int not null auto_increment primary key,
title varchar(255},
body text
};

Nije obavezno, ali na kraj moete dodati

sledei

red

type=MyiSAM;

dobiete

isti rezultat.
MyiSAM tabele mogu biti jedne od sledee tri vrste: dinamike, statike ili kompri
movane.Tabela automatski postaje dinamika ili statika u zavisnosti od definicija njenih
kolona. Komprimovane tabele moete praviti samo runo, pomou alatke myisampack.

IJU

ruyodYIJC ::J

IVIYI.li'IIVI liiUCIC

IIJJUYI ldUCid U IYIY.>UL-U

Tabele iji su redovi fiksne duine automatski se prave kao statike, dok se tabele s
redovima promenljive duine prave kao dinamike tabele. Po emu moemo utvrditi
da li tabela ima redove fiksne ili promenljive veliine?
Tip podataka char i svi numeriki tipovi su fiksne veliinc . Veli ina kolona tipa
varchar, text i b lob menja se u zavisnosti od sadraja. Tabela ije su sve kolone tipa
char ili numerikog tipa, bie statika, ali tabela koja sadri barem jednu kolonu tipa
varchar, text ili blob bie dinamika.
U odeljku "Tekstualno pretraivanje My ISAM tabela", napraviemo tabel u koju
emo nazvati article. To e biti dinamika tabela zato to sadri kolonu tipa varchar
i kolonu tipa text. Prostor na disku koji e biti potreban za skladitenje svakog reda
tabele zavisie od tekuih podataka u poljima tabele.
Statika tabela prua vie prednosti. Pretrauje se bre od dinamike ili komprimovane tabele. Baza podataka moe veoma lako uitati zapis pronaen na osnovu indeksa
kada se svaki zapis nalazi na odreenom pomaku od poetka datoteke. Tabela se veoma
lako smeta u ostavu (ke). Manja je verovatno a nepovratnog oteenja podataka u
sluaju ozbiljnog kvara sistema- alatka za popravku tabela obino uspeva da restaurira
sve redove osim oteenog.
Nedostatak statikih tabela jeste to to se pri umetaqju stvarnih podataka u kolone
fiksne veli ne gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite ukoliko se veliina vaih podataka ne razlikuje previe. Na primer, to vai za imena i prezimena ljudi. Meutim, cena e vam moda biti previsoka ako se podaci veoma
mnogo razlikuju po veliini. Ako smatrate da e prezimena zaposlenih imati uvek
maqje od 80 znakova, moda neete eleti da nepotrebno rasipate po 75 znakova svaki
put kada se neko preziva Peri ili Jovi.
Za dinamike tabele potrebno je sloenije upravljanje unutar samog MySQL-a.
Posao keiranja, uitavanja ili popravljaqja zapisa nije tako jednostavan za mainu za
skladitenje. Razlog je delimino to to je veliina tabele promenljiva, ali i to to tabela
postaje rascepkana (fragmentirana).Ako je zbog promene sadraja red postao vei, deo
podataka e ostati na izvornom mestu, a deo e biti smeten u novi blok unutar datoteke.To znai da se ne moe garantovati da segment datoteke koji je operativni sistem
u itao u ke sadri sve delove reda. Osim toga, oteenje tabele moe biti tee popravljivo jer ako se izgube blokovi podataka ili veze izmeu njih, ne moe se lako utvrditi
koji delovi kojim redovima pripadaju.
Da biste popravili ili defragmentirali My ISAM tabelu, moete s komandne linije
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opirnije objanjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje
baze podataka, ali bez popravljanja, moete upotrebiti MySQL-ovu komandu OPTIMIZE TABLE. (To je opirnije opisano u poglavlju 18",0ptimizovanje baze podataka".)

KomprimovanjeMyiSAM tabela
Iako tabele nastaju kao statike ili dinamike bez vaeg izriitog zahteva (ali kao rezultat
odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
pack_isam, njena verzija iskljuivo za ISAM tabele, ukoliko ih koristite.)
Mada se komprimovanje na prvi pogled ini korisno, trebalo bi da ga primenjujetc
samo za neke aplikacije jer se komprimovane tabele mogu samo itati. Ako treba da
izmenite strukturu komprimovane tabele, ili da aurirate podatke u njoj, ili da joj
dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajue izmenc
i zatim ponovo komprimujete tabelu.
Postupak komprimovanja koji obavlja alatka myisampack ini kombinacija pravog
komprimovanja (Hafinanovim kodom) i vie optimizacija iji je cilj saimanje kolona,
na primer, konverzijom postojeih tipova podataka u manje, i konverzijom sadraja
kolona u nabrajanja . Budui da se svaki zapis komprimuje zasebno, dekomprimovanje
pojedinanog zapisa je relativno jednostavno. Na sporijim ureajima za skladiteqje
podataka trajanje operacije dekomprimovanja moe ak biti i zanemarljivo u pareenju s trajanjem uitavanja podataka s diska.

Tekstualno pretraivanje MyiSAM tabela


Jedna od mogunosti koju zasad pruaju samo My ISAM tabele jeste tekstualno pretraivanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba pronai
vrednost jednaku traenoj, ali esto se trae rei ili nizovi znakova unutar blokova teksta. U takvim sluajevima tekstualno pretraivanje je korisnije.
Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno
pretraivanje:
create table article (
articleiD int not null auto increment primary key,
title varchar(255),
body text,
fulltext (title,body)
) ;

Naredni upit uitava sve zapise koji sadre re 'merger :


select title
from article
where match (title,body) against ('merger');
Mogua su i sloenija pretraivanja. Naredni upit uitava zapise koji sadre bilo
koju re iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.

select title from article


where match (title,body) against ('merge acquisition acquire
takeover');

l ..lL

u~tdVIJI;;:

,,._,uv1

LdUCid u

tvty..JuL.-u

MyiSAM tabele

Obratite panju na to da uitavamo zapise koji sadre barem jednu od navedenih


U ovom sluaju ne traimo nizove znakova niti zapise koji sadre sve navedene
rei. Pomou modifikatora IN BOOLEAN MODE, koji emo objasniti u nastavku teksta,
mogu se zadati obe vrste pretrage istovremeno.
.
,
Rei acquire' i acquis i tions' morali smo da navedemo odvojeno zato sto
MySQL zasad jo ne podrava pretraivanje od korena (engl. stemming). Tehni~a pretraivanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe.
Ona omoguava da sistem prepoznaje da odreeni skup rei ima zajedniki koren.
Na primer, 'acquire' je koren drugih rei kao to su 'acquire s', 'acquired' 1
'acquisition'.
Za svako otkriveno poklapanje izraunava se koeficijent povezanosti s traenim
pojmom (engl. relevance value), a rezultati se automatski sortiraju po opadaju.oj vred-.
nosti tog koeficijenta. Ako elite, moete pogledati i koeficijente povezan os tr za svaki
uitani zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki
zapis koji ima koeficijent nula nije ni po emu povezan s traenim pojmom i zato se ne

U engleskom jeziku, rei kao to su 'the', 'and', 'then' i 'soon' neophodne su, ali
najee nisu korisni pojmovi za traenje. U MySQL-u postoje standardne liste takvih
rei (za engleski j ezik) , a moete i sami sastaviti takve liste za tekstove na drugim

rei.

govornim jezicima koje indeksirate.

Budui da je tekstu~no pretraivanje veoma sloen posao, vano je imati na umu


injenicu da postoje ozbiljna ogranie!* u pogledu performansi. Kada MySQL-ove
tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse tekstu~nog
pretraivanja osetno se pogoravaju. U manjim aplikacijama to ne bi treb~o da predstavlja problem, ~i imajte tu injenicu na umu kada pravite sloenije aplikacije.
Rei koje su este meu podacima ne koriste se pri pretraivanju.Ako vaa tabela
sadri tekstove objavljene u biltenu vae kompanije Acme PTY Ltd., verovatno e

nmogi tekstovi u zaglavlju sadrati re 'Acme'. Pretraga po toj rei e verovatno generisati mnogobrojne rezultate, koji ipak nee biti upotrebljivi. Ako 50% ili vie zapisa
sadri odreenu re, smatra se da ta re nema vrednosti za izraunavanje koeficijenta
povezanosti.

uitava.

Logiko tekstualno pretraivanje

select title, match (title,body)


against ('merge acquisition acquire takeover')
as relevance
from article;

Pri pretraivanju moete imati vei stepen kontrole ako upotrebite modifikator
BOOLEAN MODE.

Naredni upit e ui tati samo zapise koji sadre re 'linux' i izraz "Open source",
ali ne i re 'desktop'. Rei 'Java' i 'Oracle' nisu obavezne, ali kada se odreuje
koeficijent povezanosti, re 'Java' poveava rang zapisa, a re 'oracle' smanjuje
rang zapisa. Redosled traenih rei u nizu znakova ili u zapisu nije bitan.
nele ct title
from article
where match (title,body)
against ('+linux +"Open Source" -desktop Java -Oracle'
IN BOOLEAN MODE) ;

Obratite panju na to da relevance nije rezervisana re, ve samo alijas za


.
match(title,body) against ('merge acquisition acquire takeover').Zad~r
smo je samo zato da bi rezultati bili lake itljivi.
Korisniji je sledei upit, koji prikazuje naslove i koeficijente povezanosti uitanih
dokumenata. Budui da imamo uslov MATCH u odredbi WHERE, rezultati e biti sortirani, a redovi koji se ne odnose na traeni pojam bie zanemareni.
select title, match (title,body)
against ('merge acquisition acquire takeover')
as relevance
from article
where match (title,body) against ('merge acquisition acquire
takeover');
Postoje

Tabela 9.1 prikazuje listu svih operatora.


lobela 9.1

Operatori za

()pcrator

Znaenje

odreene rei

koje se ne mogu traiti. Da bi se poboljale performanse,


su iskljuene iz indeksa ili se zanemaruju pri pretraivanju.
Kratke rei se ne indeksiraju. Standardno se zanemaruju i sve rei koje sadre manje
od etiri slova. Na nekim instalacijama, kao to je Slashdot.org, to je ozbiljan problem,
poto su troslovni akronimi esto vaan deo sadraja tehnikih tekstova.To ogranie-nje
moete zaobii ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU
vrednost, ali onda morate ponovo generisati sve indekse.
U indeksima za tekstualno pretraivanje moete zadati nebitne rei (engl. stop words).
Nebitna re je bez semantike vrednosti. To su uglavnom rei koje su vane za sastavljanje reenice, ali za koje je malo verovatno da e biti vane za sadraj teksta.

IN

odreene rei

ll

ll

logiko

pretraivaqje

Ova re je obavezna.
Ova re ne treba da se pojavi u rezultatima.
Ova re je manje vana.
Ova re je vanija.
Grupie rei u podizraz.
Ova re se moe pojaviti u rezultatima ali smanjuje rang zapisa.
Dokerski sufiks. Na primer, merge nee pronai i merger, ali merge* e
pronai i merge i merger. Moe se upotrebiti samo na kraju rei za prctragu.
vo je izraz. Pronalazi samo identian sadraj, u istom redosledu .

--------------------

134

BerkeleyDB (B DB) tabele

Poglavlje 9 Tipovi ta bela u MySQL-u

Za logiko pretraivanje nije neophodno da postoje indeksi za tekstualno pretraivanje. Tako se mogu pretraivati i neindeksirane tabele, ali je postupak veo~a spo~.
Jo jedna mala razlika izmeu tekstualnog pretraivanja i logikog p~etr_a_lvanJa jeste
to to se pri logikom pretraivanju zanemaruju rei koje se esto poJaVlJUJU _me~u
podacima. U tom sluaju ne vai pravilo 50%. Ako pretraujemo tekstove obJaVlJene
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno uitao gotovo sve
redove, dok bi rezultat upita iza njega bio prazan skup.
select title from article
where match (title,body) against ('Acme' IN BOOLEAN MODE);
select title from article
where match (title,body) against ('Acme');

lnnoDB tabele

Sada emo razmotriti InnoDB tabele. InnoDB je maina za skladitenje koja je brza i
podrava transakcije. Njene mogunosti transakcione obrade su toliko vane da emo
njihovoj primeni posvetiti celo naredno poglavlje.
InnoDB table omoguavaju

Transakcionu obradu.Videti poglavlje 10.


Zakiju{avanje podataka na nivou reda. To znai da samo red koji se trenutno obrauje u nekom upitu nije na raspolaganju drugim korisnicima.Vema drug1h .
maina za skladitenje (osim BDB-a) primenjuje zakljuavanje podataka na mvou
cele tabele, tj. kada jedan proces aurira jedan red tabele, cela tabela nije dostupna
drugim procesima.
Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste
spoljni kljuevi nee raditi s tabelama drugog tipa.
Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je
pozajrnljena iz Oraclea.)
InnoDB ima vlastite konfiguracione opcije, vlastiti direktorijum i vlastiti nain skladitenja podataka. Dok My ISAM smeta svaku tabelu u zasebnu datoteku, InnoDB
smeta sve tabele i indekse u tabelarni prostor, to znai da se delovi jedne tabele mogu
nalaziti u vie datoteka. Zahvaljujui tome, InnoDB moe raditi s veoma obimnim
tabelama za iju veliinu ne vae ogranienja koja namee operativni sistem. Meutim,
imajte u vidu da u poreenju s MyiSAM tabelama,jedna InnoDB tabela zauz1ma
.. .
,
.
znatno vie prostora na disku za skladitenje istih zapisa.
Celo naredno poglavlje, 10, posveeno je upotrebi ovih speclJalmh mogucnost1
JnnoDB-a.
Podeavanje InnoDB-a zahteva odreeni napor. Osnovnu ~onfiguracij~ opisali :~10
u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslrnijl! u poglavlju 12",Podeavanje MySQL-a" .

Iako je razvijen odvojeno od veeg dela MySQL-a, InnoDB se moe koristiti pod
jednakim uslovima dve vrste licence.
Mnoge opsene i veoma poseene Web lokacije koje koriste MySQL, kao to su
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
finance. yahoo. com), koriste mainu InnoDB. Naroito je pogodna za obradu velikih
koliina podataka, velikom brzinom i u okruenju koje podrava transakcije.
InnoDB je jedan od najbrih sistema na svetu koji podrava transakcije, ali po cenu
izvesnih rtava. Pri veini upotreba, My ISAM e biti bri, ali razlika najee nee biti
tako znaajna.
InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najnovije informacije o InnoDB-u nai ete na www. innodb. com.

BerkeleyDB (BDB) tabel e


Druga mogunost koju imate kada za MySQL birate mainu za skladitenje koja podrava transakcije jeste BerkeleyDB (obino se skrauje na BDB). BDB se moe nabaviti
od kompanije Sleepycat software (www. sleepycat. com) . Ova maina se koristi za transakcionu obradu u MySQL-u ree nego InnoDB. Mada je BDB maina ve due vreme
na tritu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj
dokumentaciji stoji da je kvalitet usklaenosti s MySQL-om nivoa "gama". To znai da
j e pouzdanost bolja od verzije beta, ali postoje odreeni problemi. Ne zaboravite, u
MySQL-ovoj kvalifikaciji beta verzije, pouzdanost je bolja nego u verzijama softvera
koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".
BDB primenjuje zakljuavanje podataka na nivou stranice, usled ega su performanse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite vei
broj tabela.
Sve BDB tabele moraju imati primarni klju (to i nije neki problem, poto se to
ionako preporut~e) . U stvari, primarni klju e automatski biti napravljen ako ga
sami izriito ne zadate.
BDB tabele se uvaju u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite
to s drugim tipovima tabela za koje se indeksi uvaju u obliku b-stabala. Posledica je
sporije sekvencijalno uitavanje redova tabele (to se primenjuje, npr. kada bezuslovno
u itavate sve redove tabele ili izvravate upite u kojima su indeksi neupotrebljivi).
Osim toga, BDB tabele zauzimaju vie mesta na disku.
Vano ogranienje BDB tabela jeste to da ne moete po meri ti postojee podatke
na drugo mesto na disku. Razlog je to to se zajedno s podacima tabele skladiti i apsolutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate obavezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih neete moi da
pokrenete bazu podataka.

IVICn\JC taUt'll"

Poglavlje 9 Tipovi tabela u MySQL-u

MERGE tabele predstavljaju vet nain zaobilaenja ogranienja maksimalne veliine


datoteka koja namee operativni sistem. Poto se svaka MyiSAM tabela smeta u
zasebnu datoteku, veliina tabele je ograniena na maksimalnu veliinu datoteke koju
operativni sistem dozvoljava. To se moe zaobii pomou MERGE tabele,j:r one
omoguavaju da se u upitima vie My ISAM tabela obrauju kao Jedna log1cka tabela.
Pogledajmo primer. Listing 9 .l sadri kod koji formira MERGE tabel u od tn

osobine: ima istu strukturu kao tri tabele koje emo grupisati, njen tip je MERGE,
a sadraj je unija (UNION) tekueg sadraja sve tri tabele. Osim toga, zadali smo last
(poslednja) kao vrednost opcije INSERT_METHOD. To znai da e nov red koji unesemo
u ovu MERGE tabel u biti fiziki smeten u poslednju tabelu u grupi, u ovom sluaju,
log2003Mar. Ostale mogunosti su FIRST (podaci se umeu u prvu tabelu u grupi) ili
NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
Tako smo formirali tabelu s kojom moemo da radimo na uobiajeni nain i koja
prividno sadri sve podatke iz svih tabela u grupi. Ako izvrimo upit

tabele dnevnika promena.

select * from logs;

MERGE tabele

Listing 9.1

A MERGE Table Example

create database logs;


use logs;
create table log2003Jan
(logid int auto_increment primary key,
logts datetime,
entry char(255));
insert into log2003Jan values
(NULL, '2003-01-01', 'first jan entry');
create table log2003Feb
(logid int auto increment primary key,
logts datetime,
entry char(255));
insert into log2003Feb values
(NULL, 2003-02 -01', 'first feb entry');
create table log2003Mar
(logid int auto increment primary key,
logts datetime,
entry char(255));
insert into log2003Mar values
(NULL, '2003-03-01', 'first mar entry');
create table logs
(logid int auto increment primary key,
logLs datetime,
ntry char(255))
ype merge
Ullion (log2003Jan, log2003Feb, log2003Mar)
insert_method = last;
U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan,
lo~2003Fcb i log2003Mar. MERGE tabele se esto primenjuju za beleenje promena,

k.10 to ete videti u nastavku teksta.


N nkon umetanja nekih pro bnih podataka u te tri tabele, od njih smo naravi li jednu
M ERG E tabclu.To smo uradili tako to smo napravili tabelu logs, koj;l 1111.1 ''''lkc

dobiemo sledee

rezultate:

+-------+--------------- ------+-------- ---------+


l logid l logts
l entry
+-------+---------------------+----- ------------+
l

2003-01-01 00:00:00
2003-02-01 00:00:00
2003-03-01 00:00:00

l
l
l

first jan entry


first feb entry
first mar entry

l
l
l

+-------+---------------------+-----------------+
3 rows in set (0.01 sec)
Kao to vidite, prikazani su podaci iz sve tri tabele. Zaista je vano da zapamtite da,
iako smo zadali da je kolona log id primarni klju MERGE tabele, mehanizam radi
malo drugaije od naina na koji obino rade primarni kljuevi. Njihove vrednosti
obino moraju biti jedinstvene, ali poto MERGE tabela upravlja istovremeno s tri
skupa primarnih kljueva, nipoto nije iskljueno da postoji vie od jednog reda koji
sadre istu vrednost primarnog kljua, kao to je prikazano u rezultatima navedenog
upita.
ak i kad su tabele koje ine njene komponente grupisane u MERGE tabel u, nad
njima i dalje moemo izvravati upite na uobiajeni nain. Meutim, komande DROP,
ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se vie
izvriti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE)
ipak moete izvriti ukoliko MERGE tabela trenutno nije otvorena. Moete je zatvoriti
pomou komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon
komande FLUSH moete izvriti i bilo koju od navedenih komandi, ali mi smo ustanovili
da to nije uvek sasvim tano. Na primer, u vreme pisanja ove knjige, ako se pomou
komande DROP izbrie jedna od tabela u grupi, automatski se brie i sama MERGE
tabela. Ako je potrebno da neku od navedenih komandi izvrite nad jednom od tabela
u grupi, najbolje je da prethodno izbriete MERGE tabel u i da je zatim ponovo napravite. Brisanje MERGE tabele ni na koji nain ne utie na njene komponente niti na
podatke u njima.
Tabele koje ine MERGE tabelu moete komprimovati pomou alatke myisampack. To je naroito korisno u sluajevima kao to je na primer u kojem skladitima
datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati
budui da se novi podaci upisuju samo u poslednju datoteku.

'

138

.Jdl.l:ldl\

Poglavlje 9 Tipovi tabela u MySOL-u

MyiSAM

HEAP tabele

HEAP tabele su izuzetno brze i cele se uvaju u memoriji. Brzina se postie zahvalju-

My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podrava transakcije.


MyiSAM podrava komprimovanje tabela.

jui upotrebi heiranih indeksa.

Nedostatak uvanja cele tabele u memoriji jeste, naravno, to da u sluaju problema


s napajanjem raunara, podaci iz HEAP tabele nestaju zauvek. Meutim, tabele tog
tipa su savrene za uvanje privremenih podataka.
Tabelu tipa HEAP moete napraviti na sledei nain:

":eliina ~yiSAM

tabela je

ograniena

na maksimum koji dozvoljava operativni


s1stem, al1 se to ogranienje moe zaobii pomou MERGE tabela.
Datoteke u koje su smetene My ISAM tabele prenosive su izmeu razliitih operativnih sistema.
Jedna tabela moe imati najvie 64

create table testHeap


(id int not null primary key,
data char(lOO))
type=heap
max_rows = 100;

Kao to vidite, tip tabele zadali smo kao

kljua

a svaki moe sadrati najvie 1024 bajta.

lnnoDB

HEAP.

Osim toga, primenili smo i dobro

praktino pravilo ograniavanja maksimalnog broja redova u tabeli. Ako vaa HEAP
tabela previe naraste, lako se moe dogoditi da vam ponestane memorije. Maksimalan
broj redova u HEAP tabeli moe se zadati u konfiguracionoj opciji
max_heap_table_size.

HEAP tabele imaju sledea ogranienja:


Nisu podrane kolone tipa AUTO_ INCREMENT.
Nisu podrani tipovi podataka BLOB i TEXT.
U HEAP tabelama ne mogu se traiti redovi na osnovu poetnog dela indeksa.
(Ako ne znate ta tano ovo znai, vie informacija o indeksiranju nai ete u
poglavlju 19.)
Indeksi se mogu koristiti pri pretraivanju redova tabele samo u upitima koji u
uslovima za pretragu sadre operatore = ili <=>.

Saetak
MySQL podrava est tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE
i HEAP.
Samo tabele tipa InnoDB i BDB podravaju transakcije.
Samo MyiSAM tabele podravaju tekstualno pretraivanje i indeksiranje.

InnoDB tabele podravaju transakcije.


InnoDB podravaju zakljuavanje na nivou redova.
Ne postoji teorijska gornja granica veliine tabele jer jedna tabela moe biti
smetena u vie datoteka.
InnoDB omoguava dosledno uitavanje redova bez zakljuavanja u komandama
SELECT.

InnoDB tabele su prenosive izmeu razliitih operativnih sistema.


InnoDB tabele zauzimaju vie prostora na disku od MyiSAM tabela.
InnoDB tabele podravaju spoljne kljueve .

BDB
Kao i InnoDB tabele, BDB tabele podravaju transakcije. BDB tabele
koriste u MySQL-u od InnoDB tabela .
BDB podrava zakljuavanje podataka na nivou stranice.

ree

se

BDB tabele nisu prenosive.

MERGE
MERGE tabele omoguavaju da se vie My ISAM tabela tretira kao jedna
logika tabela, zahvaljujui emu se zaobilazi problem najvee dozvoljene
veliine MyiSAM tabela .

HEAP

ISAM je zastareli tip tabela, zamenjen tipom My ISAM.


ISAM tabele imaju ogranienu veliinu od najvie 4 GB.

HE~ t~bele se u celini uvaju u memoriji i njihova se


da b1 se Izbegla prevelika potronja memorije .

~o~aci ~meteni

ISAM tabele nisu prenosive izmeu dva sistema.


Jedna tabela moe imati najvie 16 kljueva, a svaki moe sadrati 256 bajtova

JanJa racunara .
HEAP tabele su superbrze, pod uslovom da imate dovoljno
koju ete ih smestiti.

ISAM

(znakova).

u HEAP tabelu nisu trajni i gube se u

I lEA l' tabele ne podravaju kolone tipa

veliina

sluaju

mora

ograniiti

prestanka napa-

fizike

AUTO_INCREMENT, TEXT

memorije u

BLOB.

140

Poglavlje 9 Tipovi tabela u MySUL-u

~1euecem

poglaVlJU

Vebe

Pitanja
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi operativni sistem. Za tu namenu pogodne su tabele tipa
a) ISAM
b) MyiSAM

Odgovori

e) InnoDB
d) BDB
2. Potrebna nam je privremena tabela za brzo pretraivanje. Trebalo bi da upotrebimo tabelu tipa

a) ISAM
b) MyiSAM
e) MERGE
d) HEAP
3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa
a) ISAM
e) InnoDB
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraivanje. Za tu namenu pogodne su tabele tipa

a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte sledei upit za tekstualno pretraiva~e:
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
sledeih

tvrdnji o ovom upitu nije

Pitanja
1. e

2. d
3. a

4. a

5. b

U sledeem poglavlju
U sled eem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraemo ta
ta no znai pojam transakcija, zbog ega su transakcije tako vane i kako se one primenJUJU u InnoDB tabelama.

b) MERGE

Koja od

Za ovo poglavlje nema formalnih vebi, ali bi bilo korisno da vebate pravljer~je
upotrebu tabela pojedinih tipova.

tana?

a) Teina traene rei 'tutorial' je poveana.


b) Rang rezultata koji sadre re 'reference' bie
e) Rezultati pretrage moraju sadrati re 'ph p' .
d) Rezultati pretrage koji sadre re 'pdfl ib'
koji je ne sadre.

bie

povean.

rangirani vie od onih

10
Upotreba transakcija
u lnnoDB tabelama

BAVIEMO

praktinim pri-

OVOM POGLAVLJU
SE transakcijama u MySQL-u. U
merima koristiemo tip tabela InnoDB, ali gotovo sve to bude reeno
nako i za BerkeleyDB tabele.
Razmotriemo sledee teme:

vaie

podjed-

ta je transakcija
Upotreba transakcija u MySQL-u
InnoDB-ov model transakcije i

usklaenost

s ACID pravilima

ta je transakcija?
U ovom poglavlju, prvo moramo razjasniti ta je transakcija. U kontekstu sistema za
upravljanje bazama podataka, transakcija je niz povezanih komandi koje se moraju
obraivati kao nedeljiva celina. Drugim reima, sve to treba da bude uraeno u transakciji mora se uraditi u celini, ili ne sme nita uraditi. Ovaj koncept je poznat kao
nedeljivost (engl. atomicity). Kae se da je transakcija atom obrade jer se ne moe razbiti
na manje delove - obrauje se u celini ili se uopte ne obrauje.
Ovaj koncept ima vane posledice kada se razmatra pristup podacima u okruenju s
vie korisnika, procesa i niti izvravanja (engl. threads) istovremeno, a vaan je i za obnavljanje podataka nakon kvara. Savremenim raunarima esto pristupa vie korisnika
istovremeno. Na njihovim raunarima obino je aktivno vie programa u isto vreme,
a esto koriste i programe kao to je softver za Web server koji formiraju vie istovremenih procesa ili niti izvravanja. Svakom od tih korisnika, programa, procesa ili niti
izvravanja moe biti neophodan pristup serveru baze podataka.
Vie niti izvravanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
doe do greke, pri obnavljanju podataka baza podataka mora zavriti otvorene transakcije. To znai da se baza podataka mora vratiti u stanje u kojem je bila pre poetka

..JI.d j\. ll dllltU\l.ljtll

Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

transakcije, ili mora da izvri celu transakciju do kraja. Uglavnom je bolje izgubiti celu
transakciju koja se sastoji od meusobno povezanih izmena nego doi u stanje delimino unetih izmena iji rezultat moe biti neusklaenost sadraja baze podataka.
Ovaj koncept se moe izraziti formalno, ali je verovatno najbolje da na primeru
shvatite o emu se tano radi. Recimo da imate vrlo jednostavnu (ali potencijalno
veoma vanu) bazu podataka u kojoj se uvaju podaci o prometu na bankovnim rau
nima. Za svaki raun postoje barem podaci o identifikatoru rauna i tekuem stanju.
Tabelu bankovnih rauna, accounts, moemo napraviti sa sledeom strukturom:
crea te table account
number int not null auto increment primary key,
balance float
type = InnoDB;
Verovatno vas nee iznenaditi nain na koji emo otvoriti tri nova rauna pomou
s l edei h upita:
insert into account (balance) values (O. O);
insert into account (balance) values (1000.0);
insert into account (balance) values (2000.0);
Poto dosad nita nije moglo da krene ba naopako, trebalo bi da rezultati budu sledei podaci:

+--------+---------+
l number l balance l
+ ------- +---------+
o l
l l
l
1000 l
2 l
l
2000 l
3 l
l
+--------+---------+

Ako nita unapred ne odreujemo u vezi s brojevima rauna koji se generiu u


koloni tipa auto-increment, nevaan je redosled kojim ete izvriti ove upite. Sasvim je
nebitno da li ete ih izvriti istovremeno s tri interaktivna klijentska raunara i ne
moete znati koji e upit biti izvren prvi.
To esto nije tano kada se izvravaju sloeniji upiti ili grupe upita . Pogledajte
naredne dve komande koje uplauju SOO dolara na raun broj 2:
uitavamo tekue stanje na raunu
balance from account where number = 2;
daje rezultat od 1000 dolara
upisujemo novo stanje
account set balance = 1500 where number= 2;

# najpre

select
ll upit
ll sada
\lpdate

Ova dva upita su meusobno povezana i moraju se izvriti zajedno. Ako klijentski
programi s drugih raunara mogu da izmene stanje na ovom raunu izmeu nae provere stanja i naeg aurira~a stanja, moe se dogoditi da ne dobijemo rezultate koje
SiliO oekivali.

Ukoliko dva klijentska programa izvravaju parove ovakvih upita istovremeno,


rezultati e zavisiti od toga koji se u kom trenutku izvrio. Ako smo pomou ovih
upita pokuali da upiemo uplatu od 500 dolara, a drugi klijentski program je pomou
naredna dva upita pokuao da uplati 1 OO dolara, konano stanje rauna moe biti 11 OO
dolara ili 1500 -a nijedno od toga nee biti taan rezultat.
# najpre

select
# upit
# sada
update

uitavamo tekue stanje na raunu


balance from account where number = 2;
daje rezultat od 1000 dolara
upisujemo novo stanje
account set balance = 1100 where number = 2;

Jasno je da bi to bilo neprihvatljivo, ali se u ovom suaju problem moe lako reiti.
Ako izmene zadamo kao relativne a ne kao apsolutne, postae nedeljive jedinice i reili
smo problem. Naredni upit e davati ispravne rezultate, bez obzira na to da li se u isto
vreme izvravaju i drugi upiti:
update account set balance = balance

SOO where number = 2;

U MySQL-u je jedna komanda update uvek nedeljiva. Ne moe je prekinuti


druga komanda, niti se moe izvriti samo delimino. Izvrie se cela, ili e u sluaju
greke cela biti ponitena.
Sloeniji sluajevi su malo tee shvatljivi. Pogledajte naredni par upita ija je svrha
prenoenje iznosa od 1000 dolara sa rauna 2 na raun l:
update account set balance = balance - 1000 where number = 2;
update account set balance = balance + 1000 where number = l;
Oba upita unose izmenu u relativnom obliku, ali je vano da se oba upita izvre da
bismo dobili smislene rezultate. Trebalo bi da nakon izvravanja upita iznos novca u
sistemu bude isti kao pre izvravanja upita. Novac treba da bude prebaen s jednog
rauna na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako doe
do prekida napajanja izmeu izvravanja prvog i drugog upita, podaci vie nee biti
usklaeni.

U jednostavnim sluajevima, problem se moe zaobii tako to se oba upita zdrue


u jednu SQL komandu. U ovom primeru moemo napisati sledei upit:
update account as source, account as dest
set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000
where source.number = 2 and dest.number = l;
Poto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili
smo da izmena postane nedeljiva i da se u potpunosti izvri ili da se uopte ne izvri.
Ne moramo da brinemo da li e server prestati da radi tokom izvravanja nekog dela
operacije koju smo zahtevali.
U ovom sluaju "stradala" je jedino razumljivost upita. Ovako kombinovan upit je
slabije razumljiv i tee se otkrivaju greke nego u prvoj verziji koju smo naveli.

ruyldVIjt:

lU

UJJUllt:Ud

lldll~dr\\:ljd

U IIIIIUUD l.dU'Cidllld

UjJUllt:Ui:l

U mnogim sluajevima nee biti mogue zdruivanje svih povezanih upita u jedan
kao u navedenom primeru.Jedino reenje u takvim sluajevima, ukoliko elite razumljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi
oznaite kao transakciju, time obavetava te bazu podataka da je to povezan i nedeljiv
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvriti ili sve komande u
skupu ili nijedna od njih. Pomenuta dva upita moete izvriti kao jednu transakciju
pomou sledeih SQL komandi:
s tart transaction;
update account set balance
update account set balance
commit;

balance
balance

1000
+ 1000

where number
where number

'
l
'

Vana osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu
zavrene i potvrene (tj. izmene unete u bazu podataka). Nijedna druga nit izvravanja
(proces) ne moe da ita neusklaene podatke iz tabele ili tabela dok se ne zavri
postupak auriranja koji ste zapoeli.
Druga prednost transakcija jeste to da se delimino izvrene transakcije mogu
ponititi. Ako transakciju ponitimo pre nego to je potvrdimo (engl. commit), sve
izmene koje su nainili upiti koji ine transakciju bie ponitene.
U naem primeru prenoenja novca na drugi raun, ako dodamo komandu SELECT
da bismo proverili da ne skidamo vie novca sa izvornog rauna nego to ga ima na
njemu, moemo upotrebiti rezervisanu re ROLLBACK ukoliko elimo da ponitimo
r clu transakciju. Sintaksa upita izgledala bi ovako:
aLart transaction;
update account set balance = balance - 1000 where number
\lpda t e account set balance = balance + 1000 where number
s lec t balance from account where number = 2;
ll select kae da je stanje na raunu broj 2 negativno!
ll bolj e da ponitimo promenu
ro llba ck;

lli:lll~i:ll\\:ljCI

IVIY;)UL- U

Podeavanje automatskog potvrivanja transakcije


U MySQL-uje standardno ukljueno automatsko potvrivanje transakcija (reim rada
autocommit). Svaki upit koji pokrenete, automatski se izvrava u okviru vlastite
transakcije. Moete zamisliti da se sve odvija kao da ste izriito zadali komande START
TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita
kao to su sledei
update account set balance = balance - 1000 where number
update account set balance = balance + 1000 where number

2
'
l
'

izvrava se kao da su bili napisani u ovom obliku:


s tart transaction;
update account set balance
commit;
s tart transaction;
update account set balance
commit;

balance - 1000 where number

2;

balance

+ 1000

where number

'

Ukoliko upiete
s tart transaction;
nita se nee dogoditi dok ne upiete i
commit;
Automatsko potvrivanje transakcija moete iskljuiti pomou komande

SET

na

sledei nain:

set autocommit=O;
2;

l;

Komanda ROLLBACK prekida transakciju i ponitava sve izmene nainjene od poetka


transakcij e. Transakcija koja je bila ponitena umesto da bude potvrena ne ostavlja
nikakav trag na podacima. Budui da delimini rezultati nisu bili vidljivi iz drugih
lt .msa kcija , konano stanje baze podataka isto je kao da transakcija nije ni bila zapoeta.

Upotreba transakcija u MySOL-u


l >.t bi ste mogli da koristite transakcije kako je opisano u prethodnom odeljku, morate
upotrebiti tip tabela koji podrava transakcije- to moe biti InnoDB ili BDB. Postoje
Lt l' !i it c sintakse koje daju isti konaan rezultat.
Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Moda ete
kori stiti jedan od ovih oblika da bi va kod ostao kompatibilan s drugom bazom podal ;tka koju imate, ali uglavnom se preporuuje sintaksa START TRANSACTION, budui da
Jl' propisana standardom SQL- 99 .

Kao to biste i sami zakljuili, sledea komanda vraa MySQL u reim autocommit:
set autocommit=l;
Poto je promenljiva autocommi t lokalna za sesiju, izmena reima rada vai samo za
upite koje pokree tekua sesija, dok je ta sesija aktivna.
Ako iskljuite automatsko potvrivanje transakcija, nije potrebno izriito zadati
komandu START TRANSACTION da biste zapoeli transakciju. Nipoto ne zaboravite da
povremeno izdate komandu COMMIT da biste izmene koje ste nainili trajno preneli u
bazu podataka.
Bez obzira na to da li je reim autocommit ukljuen ili iskljuen, u odreenim sluajevima se izmene koje nainite automatski potvruju (i prenose u bazu).Ako koristite
tip tabela koji ne podrava transakcije, kao to je My ISAM, sve izmene koje nainite
odmah se prosleuju u bazu, bez obzira na vrednost promenljive autocommit. Slobodno moete grupisati komande izmeu komandi START TRANSACTION i COMMIT, ali to
nee imati nikakvog uticaja ako tabela ne podrava transakcije. Moete ak upotrebiti
i komandu ROLLBACK. Time neete izazvati greku, ali u tabeli koja ne podrava transakcije, ta komanda prosto nee imati nikakvog efekta ni na ta to ste izmenili.To moe
biti korisno kada testirate kod ili kada iz datoteke slike stanja uitava te podatke na server
koji radi s drugim tipom tabela.

ruyldVIJt: lU

UfJUllt:Ud

lldll~d"~IJ<l

U IIIIIUUD ldUt:ldllld

H<~n~iKtiOnl

U tabelama koje podravaju transakcije, postoje akcije (osim izriitog izdavanja


komande COMMIT) koje e automatski pokrenuti komandu COMMIT. Ako zahtevate
zakljuavanje podataka, time ete implicitno potvrditi sve zapoete upite.
Zakljuavanje

podataka

Druga mogunost da iskoristite deo prednosti transakcija jeste da runo zakljuavate


i otkljuavate tabele.
Ako zaista elimo da primer koda za deponovanje novca na bankovni raun napieme s dva odvojena upita, to bi izgledalo ovako:
lock tables account write;
select balance from account where number = 2;
update account set balance = 1500 where number
unlock tables;

2;

Komanda LOCK TABLES pokuava da zakljua sve tabele koje navedete da bi tekua
nit izvrenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobaa sve
blokade koje je tekua nit postavila. Postupak deblokade tabela vrlo je jednostavan.
Ukoliko ste zakljuali tabel u, imajte u vidu da je morate to pre osloboditi da biste to
manje ometali druge niti. Zakljuavanje tabela je sloenije pitanje.
Sve tabele koje vam trebaju morate zakljuati istom komandom. U prethodnom
prim eru zahteva se zakljuavanje samo jedne tabele, ali ako nameravate da pristupate
grupi tabela istovremeno, ili ak razliitim alijasima iste tabele, morate ih sve navesti u
istoj komandi, na primer:
lock tables account write, account as a read, othertable low_priority
write;
Poto komanda LOCK TABLES oslobaa sve blokade koje ste pre nje postavili, ako
pokuate da grupiete blokade koje su vam potrebne za vie komandi, sve prethodne
blokade bie ukinute a blokada e vaiti samo za poslednju komandu u grupi.
Postoje dve vrste blokada: za itanje i za pisanje. Ako vam je potreban pristup tabeli
radi upisivanja podataka i ne moete dozvoliti da druge niti pristupaju tabeli u isto
vreme kad i vi, blokada za pisanje e spreiti da bilo koja druga nit ita tabelu ili pie
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da itate tabelu, nema
nik:lkvc tete ako dozvolite da i druge niti itaju tabelu u isto vreme. Blokada za itanje
sprcbva druge niti da piu u tabel u samo dok je vaa nit blokira.
nlokada za pisanje moe se zadati sa opcijom low_priority (nizak prioritet). U svakon! sistemu koji omoguava blokiranje tabela, ukljuujui i MySQL, neophodna su
pr.1v1Ll koja odreuju ko e u sluaju sukobljenih zahteva moi prvi da postavi blokadu.
MySQL obino daje vei prioritet zahtevima za blokade radi pisanja da bi omoguio da
mncnc uskladitenih podataka budu obavljene to pre. Ako vam takvo ponaanje ne
odgov:mt, moete zahtevati blokadu za pisanje niskog prioriteta kao to smo uradili
"' tabel u othertable u prethodnom primeru. Meutim, postoji zakoljica. Kad god
:t.illtcvatc blokadu tabele, moe se dogoditi da morate saekati da ona bude odobrena.

moae1

1nn on

Blokada niskog prioriteta bie odobrena samo ako nema nijedne druge niti koja je
zahtevala blokadu za itanje ili pisanje u toj tabeli. Meutim, ako je server veoma optereen, takva situacija se moda nikad nee dogoditi.
Verovatno neete esto runo upravljati blokadama na ovakav nain, ali postoje
izvesni razlozi zbog kojih biste to ipak uinili. Ako imate aplikaciju koja treba da obezbedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim sluajevima, moe biti isplativije da koristite brze tabele koje ne podravaju transakcije i da
runo postavljate blokade da biste reili problem nemogunosti transakcione obrade.
Jo jedan est sluaj u kojem ete izdavati komande LOCK TABLES jeste kada
direktno manipuliete MySQL-ovim datotekama s podacima. Na primer, ako elite da
obezbedite da sadraj datoteka na disku ostane usklaen i nepromenjen dok pravite
njihove rezervne kopije, morate zakljuati te datoteke.
Najvanije to treba da zapamtite u vezi sa zakljuavanjem podataka jeste da morate
to pre ukinuti sve blokade koje ste postavili inae e drugi sistemi i korisnici morati
da vas ekaju. Imajte u vidu da neki poslovi za ije obavljanje ete postavljati blokade,
kao to su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati prilino dugo.

Transakcioni model lnnoDB


Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-vie
iste ciljeve ali uz primenu razliitih pristupa problemu. Da bi izolovao transakcije
jedne od drugih, InnoDB primenjuje zakljuavanje podataka na nivou reda tabele. To
znai da se razliite transakcije mogu odvijati nad sadrajem iste tabele u isto vreme,
pod uslovom da samo itaju tabelu ili da ne menjaju iste redove kada upisuju podatke.
Nepotvrene izmene spreavaju da druge niti pristupaju samo redovima na koje
deluje tekua transakcija, ali ne i celoj tabeli. Zahvaljujui toj osobini, InnoDB obezbeuje visoke performanse uz prednosti koje biste oekivali od jednog savremenog
sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste usklaenost s grupom pravila ACID.
Usklaenost

sa ACID pravilima

Vaan pojam iz terminologije baza podataka koji jo nismo definisali jeste ACID. To je
akronim od engleskih rei Atomicity, Consistency, Isolation i Durability (nedeljivost,
usklaenost, izolovanost i trajnost). Mnogima smeta injenica da pri korienju
MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
MySQL je usklaen sa ACID pravilima.
Atomicity (nedeljivost) znai da je svaka transakcija nedeljiva celina. U bazu podataka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U sluaju
spoljne greke, jasno je da bi bilo savreno kada bi postupak obnavljanja baze podataka
bio u stanju da dovri sve transakcije koje su bile zapoete u trenutku greke; meu
tim, prihvatljivo je i da te transakcije budu ponitene.

l ransakciOni model lnnoDB


Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Consistency (usklaenost) znai da svaka operacija nad podacima treba da prebaci


bazu podataka iz jednog ispravnog stanja u drugo ispravno stanje. N~ sme biti "meu
stanja" u kojima podaci nisu potpuno usklaeni. Osim toga, trebalo b1 da baza pvodataka
spreava operacije koje naruavaju usklaenost podataka. Ako u baz1 podataka :uvate
bankovne raune koji pripadaju klijentima banke, ne b1 trebalo da bude moguce da
neko otvori raun koji pripada nepostojeem klijentu, niti bi trebalo dozvoliti brisanje
klijenta iz tabele klijenata ukoliko u tabeli rauna ima rauna koji mu pripadaju ....
Isolation (izolovanost) znai da transakcije ne deluju jedna na drugu dok se odviJaJU.
Svaka transakcija vidi svet oko sebe kao da je jedina koja ita i menja podatke.~ stvar~
nosti to nije uvek tako, ali se pomou blokada moe postii takav priv1d. U zav1snost1
od naina podeenosti baze podataka i opcija koje upotrebite, u praksi ete imati razliite nivoe izolovanosti. (Opirnije objanjenje nai ete u sledeem odeljku.)
Durability (trajnost) znai da izmene koje je transakcija nainila a prosleene su bazi
podataka, treba da postanu trajne. Ovaj uslov se moe lako ispuniti u jednostavn~~
programu, ali u sloenom sistemu za upravljanje relacionim bazama podataka, kojl
zakljuava podatke i odrava vie verzija istih podataka u isto vreme, problem se pretvara u pravo "minsko polje". Osim toga, trajnost znai i to da bi u sluaju kvara trebalo
da postoji mogunost povratka baze podataka u tekue stanje. Ako se pres~~nak napajanja, kvar diska ili druga katastrofa dogodi izmeu trenutka u kojem J~ klljentski program poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI
mogunost da se, pomou kombinacije rezervnih ko~ija baze podat~ka 1 dnev~1ka .
transakcija, baza podataka vrati u stanje pre kvara, pa cak 1 da se dovrse transakciJe koje
su bile zapoete ali ne i potvrene.
Ako koristite Inn oD B tabele (ili BerkeleyDB tabele), MySQL je usklaen sa ACID
pravilima. Nedeljivost je obezbeena upotrebom sinta~se za trans.a~cije. Transakcije i
spoljni kljuevi obezbeuju usklaenost podataka. Mozete podes1~1 mvo 1Zolovanost1
transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka ob~z
beuju trajnost izmena. (Replikovanje omoguava izgradnju sistema s vrlo v1sokun
stepenom trajnosti bez ijedne neusklaenosti.)

Izolovanost transakcija

InnoDB tabele mogu da se rade s etiri nivoa izolovanosti transakcija. Redosledom od


najjaeg ka najslabijem, to su sledei:

Serializable (transakcije se serijalizuju)


Repeatable read (podaci su ponovljivi pri svakom itanju)
Read committed (dozvoljava se itanje podataka iz potvrenih transakcija)
Read uncommitted (dozvoljava se itanje podataka iz nepotvrenih transakcija)

Kao i u mnogim drugim sluajevima, morate napraviti kompromis izmeu robusnesti i performansi.

Nivo izolovan osti serializable je savren gledano iz ugla usklaenosti i robusnosti


S ti~ ~ivoom izlov~osti , itanje podataka i njihove izmene odvijaju
se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego
to b.u~e dozvoljeno sledee itanje istog podatka. Transakcije ne moraju da se uvek
?dVIJaJU bez meusobnog preplitanja da bi se dobio privid serijalizovanih transakcija
Jer su mnoge potpuno nezavisne jedna od druge, ali ako dve transakcije deluju na iste
podatke u isto vreme, one e biti serijalizovane. Poto u tom sluaju mora doi do
z~klju.avanja podataka i ekanja na njih, kombinovano s obavezom ispitivanja i predvianp koje se transakcije meusobno prepliu, konaan rezultat je to da je nivo izolovanosti serializable naj sporiji nain transakcione obrade. Ako elite da radite s tim
nivoom izolovan osti, komanda je sledea:
izme~~ podat~a.

se t transaction isolation level serializable;

Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka
transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadraj k;o na
poetku transakcije. Garantuje se da je itanje reda ponovljivo, tj. da se iz istog reda
svaki put uitavaju isti podaci. Ako na poetku transakcije pozovete
sel ect

* from account where number=l;

a zatim isti upit ponovo izvrite kasnije u transakciji, oba puta dobiete isti rezultat.
Meutim, moete dobiti i ono to se zove jm1tomski podaci (engl. phantom reads). Moe
se dogoditi da druga transakcija koja se zavri pre vae doda nove redove u tabelu.Ako
dvaput izvrite isti upit koji sadri odreeni uslov, kao sledei
sele ct

* from account where balance>lOOO;

moe se dogoditi da pri drugom itanju dobijete nove redove - fantomske redove kojih nije bilo prvi put.
Trebalo bi da u praksi vrlo retko naiete na fantomske podatke u MySQL-u.
lnnoDB reava problem pomou algoritma nazvanog blokiranje sledeeg kljua (engl.
11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana.
Verovatno ve znate da InnoDB primenjuje zakljuavanje podataka na nivou redova .
~ad~ se transakcija odnosi na odreeni red tabele, taj red se zakljuava da bi transakcija
bila Izolovana od drugih. Osim zakljuavanja redova na koje se transakcija odnosi,
,tlgoritam blokiranja sledeeg kljua blokira i razmake izmeu redova koje nae u
tndeksu. Poto se problem fantomskih podataka reava na taj nain, nivo izolovanosti
wrializ able moraete da koristite samo u malom broju sistema .
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo vie
nece b1t1 ~asv1m 1z~~ovane. Ako izvrite neki upit, a zatim ga kasnije u transakciji ponoVIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u meuvremenu izmenila
podatke i prenela izmene u bazu. Ako vam ba to odgovara, komanda je sledea
Hl'L transaction isolation level read committed;

Poglavlje 1O Upotreba transakCIJa u lnnouts taoe1ama

Pri korienju najnieg nivoa izolovanosti, read uncommitted,javljaju se dva pitanjada li su transakcije izolovane i usklaene, pa prema tome, ne kre ACID pravila, i da li
se uopte moe priati o transakcijama. U ovom reimu rada, transakcije mogu da
itaju izmene koje su druge transakcije nainile a da te izmene jo nisu potvrene
(prenete u bazu podataka). To se zove itanje prljavih podataka (engl. dirty reads) i moe
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da e sve aktivne niti
samo itati ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read
uncommitted, upotrebite sledeu komandu:

2. Nedeljivost transakcije

a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava


b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
e) transakcije ne utiu jedna na drugu
d) izmene koje su nainile potvrene transakcije treba da ostanu trajne
3. Izolovanost transakcije znai sledee:
a) se izvravaju sve operacije koje transakcija zahteva ili se nijedna ne izvrava
b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
e) transakcije ne utiu jedna na drugu

set transaction isolation level read uncommitted;

Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti.


Tabela 10.1

d) izmene koje su nainile potvrene transakcije treba da ostanu trajne


4. Trajnost transakcije znai sledee:

Osobine nivoa izolovanosti transakcija


Prljavi podaci

Neponovljivi podaci

Fantomski podaci

Read Uncommitted
Read Committed
Repeatable Read

Mogui

Mogui

Mogui

Nisu
Nisu

mogui

Mogui

Mogui

mogui

Nisu

Serializable

Nisu

mogui

Nsu

Mogui

mogui

(ali malo
verovatni)
Nisu mogui

mogui

Saetak

a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava


b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
e) transakcije ne utiu jedna na drugu
d) izmene koje su nainile potvrene transakcije treba da ostanu trajne
5. U reimu ponovljivog itanja moe se dogoditi da
a) uitate prljave podatke
b) uitate neponovljive podatke
e)

Transakcija je grupa SQL upita koja se obrauje kao nedeljiva celina. Izvrava se
u potpunosti ili se ponitava u potpunosti.
Standardna SQL-ova sintaksa za

definisa~e

uitate

fantomske podatke

d) nijedno od prethodnog

transakcije izgleda ovako

Vebe

start transaction;
# do work
commit;

ali postoji i vie drugih ekvivalentnih

naina

da se postigne isti rezultat.

ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost,


usklaenost, izolovanost i trajnost). Trebalo bi da zapamtite ta ove rei znae
inae drugi zaluenici za raunare nee hteti da razgovaraju s vama.
Redosledom od najjaeg ka najslabijem, nivoi izolovanosti transakcija su sledei:
serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u
Inn o DB tabelama je repeatable read.

Pitanja
l. Ako je reim autocommit

znai sledee:

iskljuen,

transakcija

a) kada se izda komanda COMMIT


b) kada se zahteva blokada tabele

e) i a) i b)
d) ni u jednom od navedenih

sluajeva

biti

potvrena

Dokumentacija za MySQL/InnoDB sadri mnogo saveta za poboljanje performansi


sistema kada se koriste InnoDB tabele. Primenite to vei broj na svoj sistem.
Moete poeti od ovog mesta:
www.innodb.com/ibman.html#InnoDBTuning

Na serveru koji nije previe vaan za poslovanje firme, sruite MySQL dok ste
usred neke transakcije. Nije neophodno da gurnete kuite vrstih diskova s velike
visine, niti da iupate kabi za napajanje iz utinice. Dovoljno je da prekinete rad
MySQL-ovog procesa. Pregledajte sadraj dnevnika izmena i posmatrajte ta se dogaa
kada ponovo pokrenete server.

154

Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Odgovori
Pitanja
l. e
2. a

Administriranje MySQL-a

3. e

4. d
5. e

U sledeem poglavlju
U poglavlju ll razmotriemo MySQL-ov sloen sistem upravljanja pravima korisnika .
Na raspolaganju je bogat izbor mogunosti za mo koju ete dati korisnicima baze
podataka. U tom poglavlju savladaete postojee opcije i naine na koje se njima
upravlja.

11

Upravljanje pravima korisnika

12

Podeavanje MySQL-a

13 Administriranje baze podataka


14 Izrada rezervnih kopija i obnavljanje podataka
15 Zatita MySQL servera
16 Replikovanje baze podataka

11
Upravljanje pravima korisnika

EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov sloen sistem prava


korisnika. U ovom poglavlju baviemo se pravljenjem korisnikih naloga, pravima
koja su na raspolaganju i nainom na koji su ta prava predstavljena u MySQL-ovim
l<lbelama. Razmotriemo sledee teme:
Pravljenje korisnikih naloga
Nivoi korisnikih prava

pomou

komandi GRANT i REVOKE

Tabele prava

Pravljenje korisnikih naloga


GRANT i REVOKE

pomou

komandi

Prava za pristup podacima dodeljuju se korisnikim nalozima pomou komande GRANT,


n ukidaju se pomou komande REVOKE. To su standardne SQL-ove komande koje
moete izvriti na isti nain kao i bilo koju drugu komandu navedenu u ovoj knjizi. Svi
podaci o korisnicima MySQL-a i njihovim pravima pristupa uvaju se u MySQL-ovoj
bazi podataka, potpuno isto kao i podaci s kojima rade aplikacije koje ste vi napravili.
Da biste mogli da izvravate komande koji se pominju u ovom odeljku, potreban
vam je odreen nivo prava za pristup podacima. Ako ste sami instalirali MySQL,
imate pristup nalogu root, pa prema tome i odgovarajui nivo prava. Ako MySQL
koristite na raunaru koji neko drugi administrira (kao to je raunar na poslu ili iznajmljeni raunar), moda nemate odgovarajui nivo prava da biste izvravali te upite.
U tom sluaju, dobiete poruku o greci nalik na sledeu:
ERROR 1045: Access denied for user:
word: YES)

'laura127.0.0.1'

(Using pass-

Dodeljivanje prava
Najpre emo razmotriti komandu GRANT, koja omoguava da pravite nove korisnike
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funkcija mn. Pogledajte sledei primer:
gran l

liU

(e

158

Poglavlje 11 Up ravlj anje pravima korisn ika

Nivoi prava

Ova komanda fomura nalog za korisnika ije je ime l uke kada on pokua da se prijavi na MySQL server s raunara localhost. Tom nalogu dodeljuje lozinku (re
lozinka, koju je vrlo teko pogoditi - razume se, vi ete zadati neto bolje!). Re
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znai da korisnik
moe samo da se prijavi na server i nita vie. U odredbi ON zadajemo objekte na koje
se odnose prava koja dodeljujemo korisniku. Budui da korisniku dodeljujemo samo
pravo da se prijavi na server, ta odredba je u ovom sluaju izlina.
Opti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledei:
GRANT vrsta_prava [(lista_kolona)]

[, vrsta_prava [(lista_kolona)]

... ]
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ]
[REQUIRE
NONE l
[{SSLI X509}]
[CIPHER nain_ifrovanja [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX CONNECTIONS_PER_HOUR #]]

U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje,
saznaete u narednom odeljku . Neka prava su globalna (odnosno, vae za sve baze
podataka na serveru), dok druga vae samo za odreene objekte (baze podataka, tabele
ili pojedine kolone tabela).
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To moe biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim
tabelama (oblik ime_baze. *). Umesto imena objekta, moete zadati i *. *, to oznaava sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete
vae samo za tekuu otvorenu bazu podataka. Ako nije otvorena nijedna baza podataka, prava se dodeljuju kao da ste zadali *. * u odredbi ON.
U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik
ve ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL e ga
napraviti. U ovoj odredbi moete zadati vie od jednog korisnika te imena raunara s
kojih se mogu prijavljivati, na primer, fredlocalhost. Ako imate tekoa pri prijavUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite
i ime raunara s kojeg se prijavljujete. Ime MySQL-ovog korisnikog naloga ne mora
biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime korisnika moe sadrati najvie 16 znakova.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka postojeem korisniku.
Korisnici mogu da menjaju svoje lozinke pomou komande:
seL

password = password('novalozinka');

Korisnikovu lozinku moete izmeniti ako izdate komandu, na primer,


set password for fredlocalhost = password('novalozinka');
Da biste to uradili, morate imati pristup bazi podataka mysql.
Odredba WITH GRANT OPTION je specijalno pravo koje korisniku omoguava da
svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne moete da dodeljujete
prava drugim korisnicima, razlog je to to vam nedostaje ovo pravo. Osim toga, drugom korisniku ne moete dodeliti pravo koje sami nemate.
Odredbu WITH moete upotrebiti i da biste po satu ograniiti broj izvrenih upita,
unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih
parametara je nula, to znai da nema ogranienja.
Odredba REQUIRE omoguava da zahtevate da se korisnik prijavljtije iskljuivo
putem zatiene veze . Da biste mogli daje koristite, moraete da podesite MySQL na
odgovarajui nain. To emo podrobnije razmotriti u poglavlju 15, "Zatita MySQL
servera " .

Nivoi prava
Prava koja moete dodeliti pomou komande GRANT dele se u dve osnovne kategorije:
prava za obine korisnike i prava za adnunistratore.

Prava za
Prava za

ob i ne

obine

Ta be la 11 .1

korisn ike

korisnike pobrojana su u tabeli 11.1.

Prava za obine korisnike

Pravo

Zn aenje

CREATE

Korisniku je dozvoljeno pravljenje tabela.

CREATE TEMPORARY TABLES Korisniku je dozvoljeno prav ljene privremenih tabela.


DELETE
Korisniku je dozvoljeno da brie redove iz tabela.
EXECUTE
Korisniku je dozvoljeno da izvrava procedure.
INDEX
Korisniku je dozvoljeno da pravi indekse.
INSERT
LOCK TABLES

Korisniku je dozvoljeno da umee nove redove u table.


Korisniku je dozvoljeno da zakljuava tabele.

SELECT

Korisniku je dozvoljeno da uitava redove.

SHOW DATABASES

Korisniku je dozvoljeno da izdaje komandu SHOW DATABASES da bi dobio listu baza podataka koje postoje na serveru.
Korisniku je dozvoljeno da aurira podatke.

UPDATE
USAGE

Korisniku je dozvoljeno da se prijavi na server, ali osim toga,


ne moe da radi nita drugo.

Prava za administratore
U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 .
Neka meu njima moete dodeliti i odreenim korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obine korisnike.

..............

Poglavlje 11 Upravljanje pravima korisnika

Tabela 11.2

Prava za administratore
Znaenje

Pravo

ALL
ALTER

Korisnik ima sva prava osim WITH GRANT OPTION.


Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo
moete dodeliti korisnicima koji imaju dovoljno strunog znanja, ali
budite oprezni pri tome jer se moe (zlo)upotrebiti i za promenu
sadraja tabela prava.
DROP
Korisniku je dozvoljeno da brie tabele. Ovo pravo moete dodeliti
korisnicima u koje imate dovoljno poverenja.
FILE
Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili
menja sadraj druge datoteke. Ovo pravo takoe moete dodeliti
korisnicima u koje imate dovoljno poverenja. Pazite se korisnika
koji pokuavaju da proslede podatke u datoteku koju slobodno
izaberu, kao to je /etc/passwd ili slina datoteka!
PROCES S
Korisniku je dozvoljeno da prikae listu svih procesa- tj. da vidi sve
tekue procese koje MySQL izvrava.
RE LOAD
Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda
ima vie namena. U nastavku ovog poglavlja razmotriemo
komandu FLUSH PRIVILEGES, a komandom FLUSH baviemo se
detaljnije u poglavlju 13.
REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni
serven.
REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na
zavisnom serveru.Vie informacija o tome nai ete u poglavlju 16.
SHUTDOWN

Korisniku je dozvoljeno da izdaje komandu mysqladmin


shutdown.Vie informacija o tome nai ete u poglavlju 13.

SUPER

Korisniku je dozvoljeno da se prijavljuje na server ak i kada je s


MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih
veza i moe da izvrava komande CHANGE MASTER, KILL (thread) ,
mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.

WI TH GRANT OPTION

Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam


1ma.

Postoji jo jedno pravo koje se zove REFERENCES. Rezervisano je za buduu upotrebu i mada ga moete dodeljivati, zasad nema nikakvog efekta.

Utvrivanje

ukupnih prava

Pomou komande GRANT moete dodeliti prava na etiri nivoa:

Globalna prava koja vae za sve baze podataka na serveru. Zadaju se pomou
niza znakova*.* u komandi GRANT. Na primer:
grant all on*.* to fred;
Prava koja vae samo za odreenu bazu podataka. Zadaju se izrazom
irne_ba z e . * u komandi GRANT:
a ll on e mpl oy ee .* to fred;

q n mL

,., ......

Pravo pristupa odreenoj tabeli. Dodeljuje se tako to se navede ime te tabele


u komandi GRANT:
grant select on department to fred;
Prava pristupa odreenoj koloni. Dodeljuje se tako to se zada ime kolone
u odredbi GRANT komande GRANT. Na primer:
grant select (employeeiD) on employee to fred;
Kada utvruje da li korisnik ima pravo da izvri odreeni posao, MySQL kombinuje pomou operatora OR korisnikova globalna prava, prava koja ima za bazu podataka, prava koja ima za tabelu i prava koja ima za kolonu .

Upotreba komande REVOKE


Komanda REVOKE suprotna je komandi GRANT i slui za ukidanje prava koja korisnik
ima. Na primer:
revoke all on employee.* from fred;
Opti oblik komande revoke izgleda ovako:
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l
... l
ON {irne_tabele l * l ** l ime_baze.*}
FROM ime korisnika [, ime_korisnika ... l
Kao to vidite, odredbe su u sutini iste kao u komandi GRANT i omoguavaju ukidanje odgovarajuih prava.

Tabele prava
Podaci koje menjate pomou komandi GRANT i REVOKE uvaju se u bazi podataka koja
se zove mysql. Umesto pomou komandi GRANT i REVOKE, tabele u toj bazi podataka
moete me~ati i direktno, ukoliko tano znate ta treba da uradite. Osim toga,
podatke iz tih tabela moete i da uitavate da biste lake reili probleme u vezi s pravima ukoliko se pojave.
Ako sadraj tih tabela menjate direktno, morate izdati komandu
flush privileges;
da bi izmene poele da vae.
U bazi podataka mysql nalazi se est tabela:
user

tables_priv

db

columns_priv

host

func

Prvih pet tabela koristi se za uvanje podataka u vezi s pravima korisnika. (U tabeli
func skladite se podaci koji se tiu funkcija koje korisnici piu, ali to je tema koja
izlazi izvan okvira ove knjige.)

t"091CIVIjt: ll

Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d

Prve tri tabele- user, db i host -koriste se kada se utvruje da li imate pravo pristupa bazi podataka. Svih pet tabela se koristi kada se utvruje imate li pravo da
izvrite odreenu komandu.

Tabela user
Tabela user sadri podatke o globalnim pravima korisnika.
Ova tabela ima sledee kolone:

Kolone za opseg vidljivosti Na osnovu sadraja ovih kolona utvruje se koji red
treba uitati. Ovoj grupi pripadaju sledee kolone:
Host: Ime raunara s kojeg korisnik uspostavlja vezu
user: Ime korisnika
Password: Korisnikova lozinka, u formatu ifrovanom pomou funkcije
PASSWORD ()
Kolone za prava Svaka kolona odgovara jednom globalnom pravu i moe
sadrati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to globalno pravo). Ovoj grupi pripadaju sledee kolone:
Select_priv
Insert _pri v
Update_priv
Delete _pri v
Index_pri v
Alter_pri v
Create_priv
Drop _pr iv
Grant _pri v
References _pri v
Reload_priv

Shutdown_priv
Process_priv
File _pri v
'i' db _pri v
'shOW'_
Super_pr iv
Create_tmp_table_priv
Lock_tables_priv
Execute _pr iv
Repl_slave_priv
Repl_client_priv

Kolone za uspostavljanje zatiene veze Odgovaraju podacima koji se zadaju


u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju sledee kolone:
ssl_type
ssl_cypher
x509_issuer
x509_subject
Kolone za ograniavanje upotrebe resursa Sadre podatke o eventualnim ogranie
njima upotrebe odreenih resursa koje zadajete na kraju komande GRANT. Ovoj
grupi pripadaju sledee kolone:
max_questions
max_updates
max_ connections

Tabela db
U ovoj tabeli uvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela
se sastoji od sledeih kolona:

Kolone za opseg vidlj'ivosti Na osnovu njihovog sadraja, MySQL utvruje koji


red treba uitati. Ako imate razliita pravila za razliite raunare, ostavite polje
host prazno, a u tabeli host dodajte odgovarajuu grupu redova da biste obezbedili detaljnije podatke. Ovoj grupi pripadaju sledee kolone:
Host
Db
User
Kolone za prava Njihov sadraj odreuje koja sve prava ima kombinacija Host,
Db i User. Ove kolone takoe mogu sadrati samo vrednosti Y ili N. Kolone za
prava su sledee:
Select_priv
Insert _pr iv
Update_priv
Delete _pri v
Index_pri v
Alter_pri v

Create _pri v
Drop_pri v
Grant_priv
Create_tmp_table_priv
Lock_tables_priv

Tabela host
MySQL pretrauje tabelu host kad god naie na prazno polje u tabeli db. Takvo
ponaanje ne moete zadati komandom GRANT, ali moete ga runo podesiti. Tabela
ima sledee kolone:

Kolone za opseg vidljivosti Na osnovu njihovog sadraja, MySQL utvruje koji


red treba u itati. Svaki red u ovoj tabeli sadri podatke o jednoj bazi podataka
kojoj se pristupa s jednog raunara. Ovoj grupi pripadaju sledee kolone:
Host
Db
Kolone za prava Njihov sadraj odreuje koja sve prava ima kombinacija Host i
Db. Ove kolone takoe mogu sadrati samo vrednosti Y ili N. Kolone za prava su
sledee:

Select _pri v
Insert_priv
Update_priv
Delete_priv
Index_pr iv
Alter_pri v

Create _pri v
Drop_pr iv
Grant_priv
Create_tmp_table_priv
Lock_tables_priv

ou-.

Sa ela

Tabela tables_priv
U tabeli tables_priv uvaju se podaci o pravima koje korisnici imaju za pojedine
tabele. Ova tabela ima sledee kolone:

Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U
ovom sluaju imamo i kolonu Table_name, koja sadri podatke o tabeli na koju
se pravo odnosi. Kolone za opseg vidljivosti su sledee:
Host
Db
User
Table name

Kolone o dodeli uvaju podatke o tome ko je i kada dodelio pravo. Ovoj grupi
pripadaju sledee kolone:
Gran tor
Time stamp

Kolona Table_priv uva podatak o pravu koje je dodeljena kombinaciji


Host/Db/User za tabelu navedenu u koloni Table_name. Kolona moe sadrati
jednu iz skupa sledeih vrednosti: Select, Insert, Update, Delete, Create,
Drop, Grant, References, Index i Al ter.

uva podatak o pravu koje korisnik ima za sve kolone


tabele. Moe sadrati jednu iz skupa sledeih vrednosti: Select, Insert, Update
i References. Ako je ova kolona prazna, MySQL e potraiti u tabeli
columns_priv detaljnije podatke o tome ta jeste a ta nije dozvoljeno
u kolonama tekue tabele.

Kolona Column_pri v

Saetak
GRANT i REVOKE
Komanda GRANT omoguava da korisniku dodelite prava pristupa ili da napravite
nov korisniki nalog. Format komande je sledei:
GRANT vrsta_prava [ (lista_kolona) J [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] ... ]
[REQUIRE
NONE l
[{SSLI X509}J
[CIPHER nain_ifriranja [AND]]
[ISSUER davalac_sertifikata [AND]]
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
MAX_UPDATES_PER_HOUR # l
MAX_CONNECTIONS_PER_HOUR #JJ
Komanda REVOKE ukida prava dodeljena korisniku. Format komande je sledei:
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) J
... ]
ON {ime_tabele l * l *.* l ime_baze.*)
FROM ime_korisnika [, ime_korisnika ... ]

Prava
Prava se mogu dodeljivati korisnicima pojedinano.

Tabela columns_priv
U tabeli columns _pri v uvaju se podaci o pravima korisnika za pojedine kolone.
Tabela ima sledee kolone:

Kolone za opseg vidlj"ivosti Na osnovu njihovog sadraja, MySQL

utvruje

koji

red treba uitati. Ovoj grupi pripadaju sledee kolone:


Host
Db
User
Table name
Column_name

Kolona column_pri v

uva podatak o pravu dodeljenom kombinaciji vrednosti

navedenoj u kolonama za opseg vidljivosti. Moe sadrati jednu iz skupa sledeih vrednosti: Select, Insert, Update i References.

Kolo/la Time stamp Pokazuje kad je pravo bilo dodeljena.

Ovo su prava namenjena obinim korisnicima:


CREATE
LOCK TABLES
CREATE TEMPORARY TABLES
SELECT
DELETE
SHOW DATABASES
EXECUTE

UPDATE

INDEX

USAGE

INSERT
Ovo su prava name~ena administratorima:
ALL
ALTER

REPLICATION CLIENT

DROP

SHUTDOWN

FILE

SUPER

PROCES S

WITH GRANT OPTION

RE LOAD

REPLICATION SLAVE

Poglavlje 11 Upravljanje pravima korisnika

U sledeem po!Jiavl u

Tabele prava

5. Podatak u koloni tables_priv.table_priv

Podatke o korisnikim nalozima i njihovim pravima MySQL


taka mysql.

uva

u bazi poda-

a) opisuje pravo koje korisnik ima za tu tabel u u obliku jedne iz skupa


vrednosti

Postoji pet tabela prava.


U tabeli user
pravima .

uvaju

b) ima vrednost Y ili N kada je korisniku dozvolj en pristup toj bazi podataka
e) opisuje jedno od prava koje korisnik ima za tu tabel u

se imena korisnika, njihove lozinke i podaci o globalnim

d) pokazuje da li za tu tabelu postoji odgovarajui red u tabeli columns_priv

U tabeli db uvaju se podaci o pravima za pojedine baze podataka.


U tabeli host uvaju se podaci o tome kojoj se bazi podataka s kojeg
moe pristupati.
U tabeli tables _pri v

uvaju

U tabeli columns_priv
u tabelama.

raunara

se podaci o pravima za pojedine tabele.

uvaju

se podaci o pravima za pojedine kolone

Pitanja

Vebe
l. Napiite komandu GRANT koja pravi korisniki nalog bill, ija je lozinka
secret i kome je dozvoljeno da uitava podatke iz tabele department, aurira ih,

dodaje u tabelu i brie iz ~e.


2. Napiite komandu

koja ukida prava tog korisnika.

Odgovori

l . Pravo GRANT OPTION omoguava korisniku da


a) uitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu

FLUSH

2. Pravo USAGE omoguava korisniku da


a) uitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH

Pitanja
l. b
2. e
3. d
4. a

5. a

Vebe
l.

grant select, update, insert, delete


on employee.department
to billlocalhost
identified by 'secret';

3. Pravo RELOAD omoguava korisniku da


a) uitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie
d) izdaje komandu FLUSH
4. Pravo
a)

REVOKE

FILE omoguava

uitava

korisniku da
podatke iz datoteke

2.

revoke select, update, insert, delete


on employee.department
from bill;

b) drugima dodeljuje prava koja sam ima

U sledeem poglavlju

e) se prijavljuje na server, ali nita vie


d) izdaje komandu FLUSH

U sledeem poglavlju, "Podeavanje MySQL-a", razmotriemo mnogobrojne opcije


za podeavanje MySQL-a.

12
Podeavanje MySOL-a

OVOM POGLAVLJU nadovezujemo se na kratak uvod u podeavanje MySQL-a iz


poglavlja l, "Instaliranje MySQL-a". Razmotriemo razne opcije za podeavanje
MySQL servera, s posebnim osvrtom na internacionalizovanje servera.
Obradiemo sledee teme:

Podeavanje MySQL-ovih konfiguracionih opcija


Konfiguracione opcije za vie servera na istom raunaru
Internacionalizovanje

Podeavanje MySQL-ovih konfiguracionih opcija


Kao to ste iz dosadanjeg itanja ove knjige saznali, mnogi programi za rad s MySQL-om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji,
ali u mnogim sluajevima moete ih zadati i u obliku datoteke opcija. U istoj datoteci
opcija moete zadati vrednosti opcija za komandne linije vie programa za rad s
MySQL-om, kao to su mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack.
Prednost upotrebe datoteke opcija jeste to to vam omoguava da na jednom
mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL
podrava i upotrebu zasebnih datoteka opcija koje vae za ceo server i za pojedinane
korisnike.
Reenje s datotekama opcija naroito je pogodno kada upravljate s vie servera.
Ako svi serveri imaju istu konfiguraciju, to je est sluaj kada se primenjuje replikavanje, moete koristiti istu konfiguracionu datoteku za svaki server.
Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada emo ih ponovo
razmotriti, ali opirnije. Datoteku ili datoteke opcija nai ete u direktorijumima
navedenim u nastavku teksta.
Kada je MySQL instaliran na Windowsu, datoteku opcija moete smesti ti u sistemski direktoriju m Windowsa i nazvati je my. ini, a moete je smesti ti i u kore nski
din:ktorijulll diska na koji je instaliran server (na primer, C :\) i nazvati my. cnf. To j~:
glob.dn.t d.tlnlt~ .1 opcija tj. vrednosti opcija u njoj vah 1'<1 sve korisnike serv~.:r,t

170

ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll

Poglavlje 12 Podeavanje MySQL-a

Kada je MySQL instaliran na Unixu, moete imati jednu globalnu datoteku opcija,
po jednu datoteku opcija za svaki MySQL server instaliran na raunaru i po jednu
datoteku opcija za svakog korisnika. (Na jednom fizikom raunaru moe raditi
istovremeno vie MySQL servera, to je objanjeno u nastavku ovog poglavlja.)
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za
pojedine korisnike nalaze se u matinom direktorijumu svakog korisnika. Imajte u
vidu da imena datoteka opcija za korisnike imaju prefiks taku- tj. ime datoteke je
.my.cnf a ne my.cnf.
Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer
sintakse za tu vrstu datoteka. Njen sadraj ponovo prikazujemo u listingu 12.1.
Listing 12.1

Primer datoteke opcija my.cnf

[mysqld]
# binarno beleenje i beleenje sporih upita

log-bin
log-slow-queries
podeavanje za InnoDB tabele
ovo je osnovna datoteka opcija predloena u dokumentaciji.
Datoteke za podatke treba da omogue
skladitenje podataka i indeksa.
obezbedite dovoljno slobodnog
prostora na disku.
innodb_data_file_path = ibdatal:lOM:autoextend
# podesite veliinu rezerve za bafere na
# so-so% koliine memorije
# na raunaru
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=lOM
# podesite veliinu dnevnika na priblino
# 25% veliine rezerve za bafere
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
# podesite .. flush_log_at_trx_commit
# na o ako moete da prihvatite gubljenje
u nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=l

#
#
#
#
#
#

Pogledajmo format ove datoteke.


Prvi red u datoteci je
[mysqld]
To znai da su opcije navedene iza ovog reda namenjene programu mysqld. Ako
elite da zadate opcije za drugi program, navedite njegovo ime na poetku grupe
opcija. Imc mora biti napisano unutar uglastih zagrada.

upnJA

Na isti nain kao to zadajete opcije za pojedine programe, moete zadati i grup11
opcija [client], koje e vaiti za sve programe.
Redovi koji poinju znakom # su komentari .
Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Moete navesti ime opcije koju elite da ukljuite; na primer:
log-bin
Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
Moete navesti ime opcije i vrednost koju joj dodeljujete; na primer:
innodb_flush_log_at_trx_commit=l
Moete navesti ime opcije i do deli ti joj vrednost pomou sintakse set -vari able; na primer:
set-variable = innodb_log_buffer_size=BM
Trei oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Poto
ete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da
znate ta on znai. Na primer, to je sluaj s primerom datoteke my. cnf, koju
smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
Neke opcije koje

odreuju

--no-defaults

znai

kako

se koristiti datoteke opcija vae za sve programe:

da nema datoteka opcija

iji

bi sadraj trebalo

- -print-defaults prikazuje sve vrednosti opcija koje vae za

uitati.

tekui

program.

--defaults-file=/putanja/do/datoteke nalae programu da koristi zadatu


datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena
konfiguracije.
--defaults-extra-file=/putanja/do/datoteke uitae navedenu datoteku
nakon uitavanja globalne datoteke opcija, ali pre uitavanja datoteka opcija za
pojedinane korisnike.
Opcije za mnoge programe koje moete podesiti pomou datoteka opcija opisane
su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmotriemo najvanije i najkorisnije opcije za komandnu liniju programa MySQL server.

Opcije za program mysqld


Naredna lista opcija nije potpuna, a svrha joj je da predoi najee koriene opcije
za mysqld. Svaka opcija se moe zadati na komandnoj liniji pri pokretanju programa
mysqld ili, kao to smo ve pomenuli, putem datoteke opcija.
Listu svih opcija (upozorenje: prilino je dugaka) dobiete ako na komandnoj
liniji otkucate
mysqld --help

1/2

Pog lavlje 12 Podeavanje MySQL-a

Evo nekoliko korisnih opcija:


ansi: Pokree server u reimu kompatibilnosti sa standardom ANSI. U tom sluaju, MySQL prihvata samo sintaksu koja je u skladu sa standardom ANSI-99 SQL.
basedir: Zadaje kerenski direktorijum instalacije ukoliko elite da server radi
u nestandardnom direktorijumu.
datadir: Isto kao basedir, ali za direktorijum data.
log-bin: Ukljuuje binarno beleenje u dnevnik izmena. Moete zadati ime
i direktorijum datoteke dnevnika izmena.
log-error: Ukljuuje beleenje greaka. Moete zadati ime i direktorijum datoteke dnevnika greaka.
log-slow-queries: Ukljuuje beleenje sporih upita.
port: Zadaje TCP prikljuak na kojem server oslukuje. Podrazumeva se
prikljuak broj 3306.
user: Zadaje ime korisnikog naloga pod kojim MySQL server treba da radi.
Tokom ovog poglavlja razmotriemo jo nekoliko drugih opcija, a to
i u poglavlju 17, "Optimizovanje MySQL Servera".

emo

uraditi

Opcije za lnnoDB
U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na
InnoDB. Komponentu InnoDB moete koristiti i ako ne zadate izriito vrednosti za
te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sledee opcije:
innodb_data_file_path = ibdatal : lOM:autoextend
Ova opcija opisuje MySQL-u gde da smeta podatke kojima upravlja InnoDB.
Za razliku od My ISAM tabela koje su smetene svaka u svojoj datoteci, InnoDB
tabele se uvaju u deljenom prostoru za tabele, koji se moe sastojati od jedne ili
od vie datoteka. U ovom primeru nalaemo MySQL-u da sve InnoDB podatke
smeta u istu datoteku ije je ime ibdatal, a poetna veliina 10 MB automatski
se poveava (u koracima od po 8 MB) kada se prostor za tabele popuni.
Opti format ove opcije je
imedatoteke : veliina [; imedatoteke:veliina; .. . ] [ :autoextend [:max: veliina]]
Opcija autoextend omoguava da se veliina prostora za tabele poveava prema
potrebama. Opcija max omoguava da zadate maksimalnu veliinu do koje datoteka moe da naraste.
innodb_buffer_pool_size=70M
Ova opcija podeava veliinu bafera koji se koristi kao ostava za (ke) pri radu
s podacima u InnoDB tabelama i indeksima . Kao i svaka druga ostava, to vea,
to bolja- omoguava manje direktnih pristupa disku . Koliko ete memorije
odvojiti za rezervu bafera zavisie od toga da li na serveru ima i drugih aplikacija
i kmisnik.l, ali i ml koliine memorijl' s kojo111 raspolaete.

innodb_additional_mem_pool_size=lOM
Ova opcija odvaja memoriju koja e sluiti za smeta~e MySQL-ovih internih
struktura podataka. Ako MySQL- u ponestane ove vrste memorije, poee da
upisuje upozorenja u dnevnik greaka .
innodb_log_file_size=20M
Ova opcija podeava veliinu datoteka dnevnika . InnoDB cikli no popunjava n
datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_ log_ files_
in_group; podrazumevana vrednost je 2 i preporu uje se.
innodb_log_buffer_size=8M
Ova opcija podeava veliinu bafera u koji sc upisuje dnevnik izmena pre nego
to se upie na disk.
innodb_flush_log_at_trx_commit=l
Ako ovoj opciji zadate vrednost 1, to znai da se sadraj dnevnika izmena iz
bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponaanje.
Kada je ova opcija podeena na vrednost nula, dnevnik se upisuje i prenosi na
disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upisuju u dnevnik kad god potvrdite transakciju, ali se sadraj bafera prazni i upisuje
na disk jedanput svake sekunde.Vrednosti o ili 2 poboljavaju performanse, ali
verovatno ne treba da objanjavamo koliko je to rizino.
Postoje i druge konfiguracione opcije za InnoDB. Vie informacija o tome
u MySQL-ovoj dokumentaciji.

nai

ete

Konfiguracione opcije za vie instalacija


na istom raunaru
esto je korisno omoguiti da vie MySQL servera radi na istom raunaru. Na primer, korisnici dobavljaa Internet usluga mogu imate vlastite instalacije. Ovu odliku
MySQL-a koristimo kada elimo da polaznicima kursa o MySQL-u omoguimo da
svako podeava svoj server.
Za svaki server koji pokreete morate zadati razliite vrednosti sledeih opcija za
mysqld:
port: Svaki server mora oslukivati na drugom TCP

prikljuku.

socket: Na Unixu, svaki server mora koristiti drugu datoteku utinice. Na


Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server
koristi. U oba sluaja, vrednost opcije socket mora biti razliita za svaki server.
shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti
drugi blok deljene memorije.
pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju
upisuje identifikator svog procesa (picl).
Opcije za beleenje podataka u dnevnike izmena: Ako zadate vrednost bilo koje
opcije koja se odnosi na datoteke dnevnika, za svaki server moractc da zadatl~
1h 111-1i direktorij um za datoteke dnevnika.

1 14

Poglavlje 12 Podeavanje MyS UL-a

Jednostavan nain da to postignete jeste da opciji basedir dodelite razliitu vrednost za svaki server. Tako e direktorijumi data i datoteke dnevnika automatski biti
razliiti. Toplo preporuujemo da svaki server ima svoj direktorijum data, tako izbegavate razne neprijatnosti.
Opcija --defaults-fileje veoma korisnajer omoguava da se svaki server
pokrene s razliitim skupom podrazumevanih vrednosti opcija (ili da se svaki server
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija).
Vano je da zapamtite sledee: kada na istom raunaru radi vie servera, klijentskim
programima i drugim programima koji uspostavljaju veze sa serverom, kao to je mysqladmin, morate zadati server s kojim treba da se poveu. U takvim situacijama moe
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
kojoj ete zadati odgovarajui broj TCP prikljuka- tako korisniku omoguavate da
automatski uspostavi vezu sa svojim serverom.

lnternacionalizovanje
Postoje dve opcije za mysqld koje omoguavaju da se zada podrazumevani skup znakova i jezikih pravila. Skup znakova je skup simbola koji se moe koristiti na serveru.
Jezika pravila odreuju nain na koji se parede nizovi znakova iz tog skupa- ime se
odreuje i redosled sortiranja- to zavisi od govornog jezika.
Podrazumevani skup znakova moete zadati pomou opcije --default -character-set. Svakom skupu znakova pridruen je i podrazumevani skup jezikih pravila,
ali moete zadati i neki drugi pomou opcije --default-collation option. Ako
kombinacija skupa znakova i skupa jezikih pravila nije ispravna, mysqld e prikazati
poruku o greci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup
jezikih pravila latinl_swedish_ci. Taj skup znakova se takoe oznaava kao IS0-8859-1 West European. Jezika pravila latinl_swedish_ci odreuju redosled sortiranja teksta na vedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l.
(Moda niste znali da za rei napisane istim slovima vae razliita pravila sortiranja u
razliitim jezicima.) Postoje i jezika pravila koja se mogu pridruiti skupu znakova
latinl koja opisuju kako se sortira tekst na nemakom, danskom i norvekom jeziku.
Vie informacija o skupovima znakova koje MySQL podrava, naroito ako vas
z~nima ba odreeni skup, potraite u MySQL-ovoj dokumentaciji.

Saetak
MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podravaju upotrebu zajednikih datoteka opcija.
Opcije moete podesiti tako da vae na globalnom nivou, na nivou pojedina
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.

Sintaksa datoteke poinje imenom programa izmeu uglastih zagrada, l'lllll


slede opcije koje se odnose na taj program. Komentari poinju znakom ll. Sv.d.;,1
opcija moe se zadati u obliku opcija, opcija=vrednost, ili set-variabl
opcija=vrednost.

Listu svih opcija za program mysqld moete dobiti pomou komande mysqlcl
--help.
Vie MySQL servera moe raditi na istoj maini u isto vreme, pod uslovom da
podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate
zadati razliite brojeve TCP prikljuka, utinica i datoteka dnevnika.
U datoteci opcija moete zadati podrazumevani skup znakova i jezikih pravila
koja e vaiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola .
Jezika pravila odreuju redosled sortiranja.

Pitanja
l. Opcija --no-defaults za mysqld znai

a) ne vae podrazumevane vrednosti, ve samo vrednosti zadate u datoteci


opcija
b) ne uitavati nita iz datoteka opcija
e) uitati vrednosti samo iz globalnih datoteka opcija
d) nijedno od prethodnih
2. Opcija za Inn oD B koja podeava

veliinu

prostora za tabele je

a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
3. Opcija za InnoDB koja podeava veliinu bafera za podatke je
a) innodb_buffer_pool_size
b) innodb_data_file_path
e) innodb_log_buffer_size
d) nijedna od prethodnih
4. Kada vie servera radi na istom raunaru, nUe neophodno da
budu odvojeni:
a) datoteke dnevnika
b) TCP prikljuci
e) utinice
d) klijentski programi

sledei

elementi

~G

Poglavlje 12 Podeavanje MySOL-a

S. ta je od sledeeg tano?

a) Jedan skup jezikih pravila moe se pridruiti samo jednom skupu znakova.
b) Jedan skup jezikih pravila moe se pridruiti svakom skupu znakova.
e) Jednom skupu znakova moe se pridruiti samo jedan skup jezikih pravila.
d) Nijedno od prethodnih.

Administriranje baze podataka

Vebe
Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj raunar. Podesite sistem
tako da imate i tekuu i stariju verziju servera koje rade na istom fizikom raunaru
Pokuajte da uspostavite vezu sa obe verzije.
.

Odgovori
Pitanja

Pokretanje i sputanje srevera


Prikazivanje podataka o serveru i bazama podataka na njemu

l. b
2. b

Podeavanje serverskih promenljivih


Unitavanje niti
Pranjenje ostava

3. a
4. d
S. a

Analiziranje tabela
Pregledanje datoteka dnevnika izmena

U sledeem poglavlju
U sledeem poglavlju, "Administriranje baze podataka", razmotriemo uobiajene
t svakodnevne poslove odravanja koje treba obavljati u MySQL-ovoj bazi podataka.

RAZMOTRIEMO uobiajene

OVOM POGLAVLJU
poslove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata sledee aktivnosti:

Mada prvenstveno objanjava poslove koje treba da obavlja administrator baze


podataka, ovo poglavlje opisuje i jedan vaan skript, mysqladmin, koji omoguava da
automatizujete neke od tih poslova.
Zadavanjem odgovarajuih parametara, skript mysqladmin se moe upotrebiti za
obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja nai ete
njihov spisak.
U ovom poglavlju razmotriemo i upotrebu skriptova mysqlshow i mysqlcheck, te
SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.

Pokretanje i sputanje MySQL servera


Kao to smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server ete najverovatnije podesiti tako da se automatski pokree zajedno sa operativnim sistemom.
Meutim, postoje situacije u kojima ete morati da spustite, pa da ponovo pokrenete
server jer je dolo do greke.
Ve smo objasnili kako se pokree MySQL server. Nain na koji ete to uraditi
zavisi od vaeg operativnog sistema, sadraja standardnih putanja i opcija koje ste
izabrali kada ste instalirali MySQL server. Na Linuxu, server moete pokrenuti
pomou komande

/t

Lc/lnit ,d/ mysqld start

18

Poglavlje 13 Administriranje baze podataka

III~UL.I.UIIJ'-

f'i'"""" ... '-""''"'..,- ... ...,,._,_.

-- ---.---------~

ali samo ako imate kopiju izvrne datoteke mysqld u direktorijumu koji se podrazumeva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraete da
zadate tanu putanju. Vie informacija o tome nai ete u poglavlju l. Server moete
pokrenuti i pomou skripta
safe_mysqld
Ovaj skript najpre pokuava da automatski odredi odgovar~ue opcije za pokretanje MySQL-a, a zatim pokree MySQL s tim opcijama.Ako skript nije na vaoj
podrazumevanoj putanji, moraete da zadate celu putanju na kojoj se on nalazi.
Da biste na Linuxu spustili MySQL server, imate dve mogunosti. Moete izdati
komandu

.......
........

1'1-0Yidosn..,
~o

...

~'-
Atltritvw:t ...
l'rl;wlcle$p . .

Stted

Crut

5tted

Mlnoqei: ...

PnNidest ...
~t

ili

,...,"..,.
NetWOik.S...

51:ted
51:ted

loadJNe. ... Stted

/etc/init.d/mysqld stop

Locd~~Sys;t~

Lout5o,ostem

Cohdtpe ...

fnobiH ...

toc~

'"""""'

(alecb ..... ..

...

........ ,....
............-

-.......

Local~

"..,

Locals-,.tem
LCIUIISyod:em

........
""""".......
.........
,....
.........
Loct/Sysl:.-!1
LQ(also,stem

"""....
Net.-lo.S ...
lCIUIISerw;

ENbletrl ...

Stttd

Offeru- . ..

.....
.....

.........
........

5tt..:l

.-

"._

su..-.....

~-

mysqladmin -u root -p shutdown

Sl4IPCIUI'i...

-.....
...
..... 5lted

Stt..:l

Razume se, moete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
uvek upotrebljiv. Nalozi pod kojima rade obini korisnici ne bi trebalo da imaju pravo
sputanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
nain da pokrenete bilo koji servis jeste da otvorite Control Panel i preete u Administrative Tools, Services. Ako izaberete servis MySQL,Windows e vam za njega ponuditi
opcije Stop (sputanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao to je
prikazano na slici 13.1. (Poto je ovo ekranska slika iz Windowsa XP Professional, sadraj
vaeg ekrana e se moda malo razlikovati, to zavisi od verzije operativnog sistema.)
Server moete spustiti i pomou skripta mysqladmin za Linux, na opisani nain.

Prikazivanje podataka o serveru i bazama podataka


na nJemu
Skript mysqlshow i SQL-ova komanda SHOW pruaju vam, kao administratoru, puno
informacija o onome to se odvija u bazama podataka i na samom serveru.

J~W~eoet:e ...
fNtllessu .. .

~-..
Tr.:boy~.

Slika 13.1

.......

Lou!So,lt.,..

"....

,....
,.... ,.,...
Loul System
"._

Loul Sylt. .
LouoiSeMc:e

loc.. s.r.t:e
Lauls,.st. .
Loul~
LocdiiSytten~

Prozor Services alatke Windows


Administrative Tools.

Kao i veinu skriptova koji se pokreu s komandne linije, skript mysqlshow moete
pokrenuti s parametrom -u kojem sledi ime korisnikog naloga, i parametrom -p,
kojim se prosleuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
prikazae

se lista svih opcija na raspolaganju.


Jedna od njih omoguava da zadate ime baze podataka da biste prikazali podatke
samo o odreenoj bazi koja vas zanima. Na primer, ako ime baze podataka zadate u
sledeem obliku, prikazae se lista tabela u toj bazi podataka:
mysqlshow -u ime_korisnika -p ime_baze

Prikazivanje podataka o bazama podataka


Skript mysqlshow prikazuje podatke o bazama podataka. Ako ga pokrenete bez parametara, na sledei nain:

Ako na kraj ovog reda dodate i parametar --status, dobiete detaljnije podatke
o tabelama. Isprobajte to na bazi podataka employee, na sledei nain:

mysqlshow

mysqlshow -u imekorisnika --status employee

prikazae se lista baza podataka u koje vam je dozvoljen pristup pod vaim tekuim
korisnikim nalogom. Rezultat je isti kao kada zada te

Rezultati su malo tee itljivi zbog dugakih redova, ali se za svaku tabelu prikazuju podaci o maini za skladitenje podataka koja se koristi, koliini podataka u tabeli,
tekuoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
o skupu znakova koji vai za tabelu.

show databases;
u programu mysql ili u nekom drugom

korisnikom

interfejsu.

l tlU

Podatke o bazi podataka i stanju servera moete pribaviti i pomou SQL-ove


komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi trebalo da ve znate da izdate komande

111'-U"-IWUIIJ"'-

t'"'._.._. ..... ,....,.""'-- - - ..,._"_,.._. .,,.,_.

r----~----

-''l

"'

Vrednosti veine serverskih promenljivih moete zadati u konfigur a<:tonoj datoteci,


na komandnoj liniji kada pokreete server ili dinamiki, unutar MySQL ,t, ponto u
kon1ande

SET.

Podeavanje servera opisano je u poglavlju 12",Podeavanjc MyS(~J

.t'',

a upotreba komande SET opisana je u nastavku ovog poglavlja.

show databases;

Prikazivanje podataka o procesima


da biste prikazali podatke o bazama podataka i tabelama u njima. Meutim, komanda

Koji su sve procesi aktivni na serveru moete videti ako unutar MySQL-a izdate sledeu komandu:

SHOW ima veliki broj drugih opcija koje moete iskoristiti.

show processlist;

show tables;

Na primer, zadajte

Prikazae se podaci barem o upitu koji ste upravo poslali (show processlist).

show columns from ime_tabele;

da biste dobili iste podatke kao

Iste podatke moete dobiti i s komandne linije, ako zadate

pomou

komande DESC.

Slino

pomou

skripta mysqlshow --status.

tome, moete zadati

mysqladmin -u imekorisnika -p showprocesslist

show table status

da biste dobili iste podatke kao

Prikazivanje statusa servera i vredn..asti serverskih promenljivih

Prikazivanje podataka o dodeljenim pravima


Koja su sve prava dodeljena odreenom korisniku moete saznati pomou sledee
komande
show grants for imekorisnika@imeraunara;

Da biste dobili podatke o !l!!rveru i nainu na koji radi, pogledajte status servera i vrednosti serverskih promenljivih
Da biste saznali kakav je tekui-sta~us MY_SQL-a, moete izdati komandu

Rezultat je izraen u obliku komande GRANT pomou koje moete zadati drugom
korisniku ista prava kao tekui korisnik. Na primer,

SHOW STATUS

mysql> show grants for root@localhost;

unutar MySQL-a, ili komandu

na mom sistemu daje

mysqladmin -u imekorisnika -p -extended-status

+--------------------------------------------------------------------+
l Grants for root@localhost
l
+--------------------------------------------------------------------+
l GRANT ALL PRIVILEGES ON* * TO 'root'@'localhost' WITH GRANT OPTION!
+--------------------------------------------------------------------+

na komandnoj liniji.
Time ete dobiti veu koliinu statistikih podataka o tome ta se sve dogaalo na
serveru od trenutka pokretanja. Moe vas zanimati da pogledate vrednosti svih promenljivih ije ime poinje s com_*- na primer, promenljiva com_ select pokazuje
koliko je server izvrio komandi select.
Ovo su neke od najzanimljivijih vrednosti:
threads_connected: Broj otvorenih i aktivnih veza izmeu korisnika i servera.

sledee

rezultate:

l row in set (0.40 sec)

Moete se podsetiti i koja sve prava postoje ako zadate


show privileges;

Time ete prikazati spisak svih prava koja postoje u sistemu.

slow_queries: Ukupan broj upita koje je server izvrio i ije je izvravanje trajalo

due od granine vrednosti zadate u serverskoj promenljivoj long_query_time.


Ti upiti se belee u dnevnik sporih upita (Slow Query Log). Sporim upitima
baviemo se vie u poglavlju 19",0ptimizovanje upita".
uptime: Broj sekundi koji je protekao od trenutka pokretanja servera.
Da biste videli vrednosti serverskih promenljivih, moete izdati komandu
show variables;

unutar MySQL-a, ili komandu


mysqladmin -u imekorisnika -p variables

na komandnoj liniji.

Prikazivanje sistemskih podataka o tabelama


Saznaete koji se sve tipovi tabela mogu koristiti u sistemu ako zadate
show table types;

Ako vas zanima kako bi izgledala komanda create koja formira odreenu tabelu
koja postoji u sistemu, zadajte
show create table ime_tabele;

Na primer, ako u bazi podataka employee zadate


show create table department;

182

Uatoteke dnevnTk.t

Poglavlje 13 Administriranje baze podataka

dobiete sledei

Komanda RESET koristi se na isti


zadati

rezultat:

CREATE TABLE 'department'


'departmentiD' int(ll) NOT NULL auto_increment,
name' varchar(30) default NULL,
PRIMARY KEY ('departmentiD')
TYPE=InnoDB CHARSET=latinl

kao komanda FLUSH. Na primer, moete

reset query cache;


Umesto da samo defragmentira ostavu za upite, ova komanda je prazni.
Listu svih promenljivih na koje deluju komande FLUSH i RESET nai ete u
MySQL-ovoj dokumentaciji.

(Obratite panju na to da su, za svaki sluaj, imena ko~ona napisa~:. izmeu polunavodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada

Datoteke dnevnika

smo napravili tabel u).

Podeavanje serverskih promenljivih

.. .

Komanda SET omoguava da zadajete vrednosti serverskih promenljlVlh - koje ste


mogli da vidite pomou komande show variables. Sintaksa komande izgleda ovako:
set promenljiva=vrednost;
Na primer, moete zadati:
set sql_safe_updates=l;
Time se ukljuuje bezbedno auriranje podataka (isto se postie i ako na komandnoj liniji zadate --i-am-a-dummy).
v.
.
.
.
Ovu komandu koristiemo esto kada budemo dosh do opt1m1zovanp servera u
poglavlju 17 ",Optimizovanje MySQL Servera".

Unitavanje niti

Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja
omoguava da vidite koje se sve niti izvravaju na serveru. Izmeu ostalog, komanda
prikazuje i jedinstveni identifikator dodeljen svakoj niti. Ak~ za ~:~~ m.~ sum~jate da
je uzrok problema (na primer, upit koji s; izv.rava "celu vecnos: ih klljentskl program zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
kill id_procesa;

Pranjenje ostava

nain

MySQL koristi pri radu grupu internih ostava (keova), koje m.ozete 1spra~mt1 pom~cu
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno
izmenili sadraj tabela prava, te izn1.ene e poeti da vae u celom sistemu tek kad izdate
komandu:
flush privileges;
Druga esta upotreba komande FLUSHjeste pranjenje bafera za upite:
(lush query cache;
Time ete defragmentirati bafer za upite, ime se poboljavaju performanse.

MySQL odrava vie datoteka dnevnika koje mogu biti korisne. Budui da beleenje
u veinu tih datoteka dnevnika nije ukljueno u standardnoj konfiguraciji servera,
to ete morati sami da uinite. Svaki dnevnik se aktivira pomou opcije zadate na
komandnoj liniji pri pokretanju servera ili pomou komande set.
Moete odravati sledee dnevnike:

Dnevnik greaka (engl. Error log): tu se belee sve greke nastale pri radu servera.
Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu
data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je
mysql. err. Moete je smestiti i u neki drugi direktorij um, koji morate navesti u
opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.
Dnevnik upita (engl. Query log): tu se belee svi upiti koji se izvravaju u sistemu.
Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku
pomou opcije log=imedatoteke.
Dnevnik izmena (engl. Binary log): tu se belee rezultati svih upita koji menjaju
podatke. Ovaj dnevnik zamenjuje nekadanji Update log, koji e ostati na raspolaganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku pomou opcije
log-bin=imedatoteke.
Dnevnik sporih upita (engl. Slow query log): tu se belee svi upiti ije izvravanje
traje due od vremena zadat og u promenljivoj long_query_t ime. Ovaj dnevnik
moete aktivirati i zadati direktorijum za njegovu datoteku pomou opcije
log-slow-queries=imedatoteke
Svi navedeni dnevnici, osim dnevnika izmena, obine su tekstualne datoteke.
Sadraj dnevnika izmena moete videti pomou komande
mysqlbinlog logfile
Upotrebu dnevnika sporih upita razmotriemo u poglavlju 19.
Poto veliina datoteka dnevnika raste, trebalo bi da ih ciklino zamenjujete dru gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
koji formira grupu datoteka za ciklinu upotrebu.

R4

Poglavlje 13 Administriranje baze podataka

Ako koristite neki drugi operativni sistem, stare datoteke dnevnika moete runo
premestiti na bezbedno mesto a zatim naloiti MySQL-u da zapone upisivanje u
novu datoteku dnevnika, pomou sledee komande

Vrednosti serverskih promenljivih moete zadati

pomou

konlalhh

menlj iva=vrednost;.

mysqladmin flush-logs

Listu aktivnih niti moete prikazati pomou komande show proceoo l l t 1


moete unititi pomou komande kill id_procesa.

Opcije za skript mysqladmin

Brzinu upita u kojima se spajaju tabele moete

Ostave se prazne
Za skript mysqladmin postoje mnogobrojne, manje ili vie korisne opcije.
Neki poslovi, kao to je pravljenje i brisanje baza podataka, mogu se obaviti
pomou SQL-ovih komandi ili pomou skripta mysqladmin:
mysqladmin create databasename
mysqladmin drop databasename

Skript mysqladmin se esto upotrebljava za prikazivanje podataka o serveru i


njegovom. tekuem stanju. Podatak moe biti bilo ta u opsegu od vrlo jednostavnog,
npr. "Da li server radi?'' (ping), do neeg znatno detaljnijeg, kao to je lista vrednosti
serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta
mysqladmin za mnoge takve poslove.
Da biste saznali da li server uopte radi, zadajte sledee:
raunaru,

dugaak

opis statusa servera, zadajte

RESET.

poveati pomou

komandl"

111,

Pitanja
1. Koji su od

sledeih

dnevnika standardno aktivni?

a) dnevnik upita
b) dnevnik sporih upita
e) dnevnik greaka
d) dnevnik izmena
e) svi prethodni
2. SQL-ova komanda

SHOW

moe se upotrebiti za prikazivanje

odreenoj

e) liste svih kolona u

bazi podataka

odreenoj

tabeli

d) svega prethodnog
3. Skript mysqladmin moe se upotrebiti za

sledee:

a)

mysqladmin processlist

Ako se prikae lista procesa (niti), neeljene niti moete unititi na

MySQL belei podatke u dnevnik greaka, dnevnik upita (svi upiti), dnevnik
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti ije izvrava liJI'
traje due nego to je zadato upromenljivoj long_query_time).

b) liste svih tabela u

sledee:

mysqladmin status
mysqladmin extended-status

Da biste prikazali listu aktivnih niti na serveru, zadajte

FLUSH

a) liste svih baza podataka na serveru

mysqladmin version

Da biste prikazali kratak ili

komandi

lyze table ime_tabele; .

mysqladmin ping

Da biste saznali koja je verzija softvera za MySQL server instalirana na


zadajte sledee:

pomou

1 11

uitavanje

prava nakon izmena da bi se obezbedile da izmene

ponu

da

vae
sledei nain:

mysqladmin kill idl,id2,id3 ...

Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte

b) prikazivanje tekueg statusa servera


e) sputanje i pokretanje servera

sledee:

d) zatvaranje i ponovno otvaranje datoteka dnevnika

mysqladmin variables

Saetak
Server se moe pokrenuti pomou skripta mysqladmin, pokretanjem izvrne
datoteke mysqld, ili pomou Windowsove alatke Services manager.
Server se moe spustiti pomou komande mysql. server stop ili pomou
skripta mysqladmin shutdown .
Komanda mysqlshow omoguava prikazivanje podataka o tekuoj bazi ili
o MySQL serveru .

e) sve prethodno

Vebe
Aktivirajte sva etiri dnevnika. Poto izvrite vie upita, pregledajte sadraje dnevnika .
Ako nemate pristup veoj bazi podataka, moda neete postii da se neto upie u
dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .

186

Poglavlje 13 Administriranje baze podataka

Odgovori
Pitanja
l. e

2. d

Izrada rezervnih kopiJ


i obnavljanje podatak

3. e

U sledeem poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objanjavamo izradu
rezervnih kopija baza podataka i ta treba uraditi kad neto krene naopako.

OVOM POGLAVLJU

RAZMOTRIEMO

se one mogu preneti na drugi


naopako.
Obradiemo sledee teme:

raunar

KAKO SE prave kopije baze podataka, bko


i kako se podaci obnavljaju kada neto krene

Izrada rezervnih kopija baze podataka


Obnavljanje baze podataka iz rezervne kopije
Proveravanje i popravljanje tabela

Izrada rezervnih kopija baze podataka


Razume se, kao i za svaku drugu datoteku koju uvate na nekom elektronskom ureaju, morate praviti rezervne kopije datoteka baze podataka. To moete initi i radi
replikovanja baze podataka ili prelaska na drugi raunar.
Rezervnu kopiju MySQL-ove baze podataka moete napraviti na etiri naina:
Pomou

skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj.
datoteku koja sadri sve SQL komande koji su neophodne da biste obnovili
tekue stanje baze podataka.
Pomou skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript
direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.
Sami direktno napravite obinu kopiju datoteka s podacima. Time zapravo runo
radite ono to skript mysqlhotcopy radi. Ako se opredeli te za ovu mogunost,
moraete da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da
zakljuate tabele da biste obezbedili da podaci u njima ostanu meusobno uskla
eni. Poto skriptovi mysqldump i mysqlhotcopy prazne ostave i zakljuavaj u
tabele umesto vas, oni su bezbednije reenje .
Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne
koptjt :tadatc tabele ili grupe tabela.

188

Poglavlje 14 lzraaa rezervnih Koplja 1 oonaviJanje poaataKa

ILiaUO

Objasniemo redom sve navedene mogunosti.


Ako je izrada rezervnih kopija od kljune vanosti, imajte u vidu da se za vreme tog
postupka korisnicima spreava pristup podacima. Zbog ega? Da bi se napravila usklaena kopija stanja baze podataka, baferi tabela moraju se isprazniti a tekui sadraj
tabela mora ostati nepromenjen dok traje kopiranje. To se moe obezbediti zakljuava
njem tabela (u veini sluajeva) ili iskljuivanjem servera iz upotrebe (to se ne preporuuje), ali u oba sluaja pristup bazi podataka nee biti mogu dok traje izrada kopije
podataka.
Jedno reenje problema jeste replikovanje. Jedan od zavisnih servera moete iskljuiti
iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju
svoje uobiajene poslove. Replikovanje emo razmotriti u poglavlju 16",Replikovanje
baze podataka".

Najuobiajeniji nain izrade rezervnih kopija baze podataka jeste pomou skripta
mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu
s MySQL serverom i formira datoteku slike stanja, koja sadri sve SQL komande
potrebne za rekonstruisanje tekueg stanja baze podataka.
Tipian primer upotrebe ovog skripta izgledao bi ovako
>

backup.sql

U ovom primeru zadali smo samo opciju--opt; ona grupie nekoliko drugih
opcija, koje su opisane u nastavku teksta. Naveli smo ime baze podataka, a rezultat
preusmeravamo u datoteku rezervne kopije koju elimo da napravimo.
Ako skript pri meni te na jednostavnu bazu podataka employee, dobiete rezultujuu datoteku iji e sadraj biti nalik na listing 14.1.
Listing 14.1

Primer rezultata skripta mysqldump

MySQL dump 10.2


Host: localhost
Server version

Database: employee
4.1.0-alpha-max-debug

"VtJIJU

t VVIIU"IJUIIJ'- t-'vuu .. uou.o ,.....,,,,._..._ _

hours float default NULL,


PRIMARY KEY (clientiD,employeeiD,workdate)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'assignment'
/*!40000 ALTER TABLE assignment DISABLE KEYS */;
LOCK TABLES assignment WRITE;
INSERT INTO assignment VALUES (1,7513, '0000-00-00' ,5), (1,7513, '2003-01-20' ,8.5);
UNLOCK TABLES;
/*!40000 ALTER TABLE assignment ENABLE KEYS */;

DROP TABLE IF EXISTS client;


CREATE TABLE client (
clientiD int(ll) NOT NULL auto_increment,
name varchar(40) default NULL,
address varchar(lOO) default NULL,
contactPerson varchar(80) default NULL,
contactNumber varchar(12) default NULL,
PRIMARY KEY (clientiD)
TYPE=InnoDB CHARSET=latinl;
Dumping data for table 'client'

/*!40000 ALTER TABLE client


LOCK TABLES client WRITE;
INSERT INTO client
VALUES
(1, 'Telco Inc', 'l Collins
(2, 'The Bank', '100 Bourke
UNLOCK TABLES;
/*!40000 ALTER TABLE client

DISABLE KEYS */;

St Melbourne', 'Fred Smith', '95551234'),


St Melbourne', 'Jan Tristan', '95559876');
ENABLE KEYS */;

Table structure for table 'assignment'


Table structure for table 'department'
DROP TABLE IF EXISTS assignment;
CREATE TABLE assignment (
clientiD int(ll) NOT NULL default '0',
employeeiD int(ll) NOT NULL default '0',
workdate date NOT NULL default '0000-00-00',

_.._,, ..... .,_ ,,, , - , . - --..-

Table structure for table 'client'

Izrada rezervnih kopija i obnavljanje podataka


pomou skripta mysqldump

mysqldump --opt -u imekorisnika -p lozinka employee

1\..L\..1 VIlli l

DROP TABLE IF EXISTS department;


CREATE TABLE department (
departmentiD int(ll) NOT NULL auto_increment,
name varchar(30) default NULL,
PRIMARY KEY (departmentiD)
TYPE=InnoDB CHARSET=latinl;

~v

l U~ldVIJC

l ""t

ILl dUCI ICLCIVIIIII r\Uf.IIJCI l UUildVIJdiiJC JJUUdldr\d

Dumping data for table 'department'

/*!40000 ALTER TABLE department DISABLE KEYS */;


LOCK TABLES department WRITE;
INSERT INTO department
VALUES
(42, 'Finance'),
(128, 'Research and Development'),
(129, 'Human Resources'),
(130, 'Marketing'),
(131, 'Property Services');
UNLOCK TABLES;
/*!40000 ALTER TABLE department ENABLE KEYS */;

Table structure for table 'employee'

DROP TABLE IF EXISTS employee;


CREATE TABLE employee (
employeeiD int(ll) NOT NULL auto_increment,
name varchar(80) default NULL,
job varchar(30) default NULL,
departmentiD int(ll) NOT NULL default '0',
PRIMARY KEY (employeeiD)
TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'employee'

ILl dUd ICLCI V lilJI r\UtJIJ l UUIIc:tYIJOIIJ\. tJUUQUII\CI tJUIIIU\..U .:JI" l tJ lO IIIJ-;,'-tl\1~1"11}'

employeeiD int(ll) NOT NULL default '0',


skill varchar(l5) NOT NULL default
PRIMARY KEY (employeeiD,skill)
TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'employeeSkills'

/*!40000 ALTER TABLE employeeSkills DISABLE KEYS */;


LOCK TABLES employeeSkills WRITE;
INSERT INTO employeeSkills
VALUES
(6651, 'Java'),
(6651, 'VB'),
(7513, 'C'),
(7513, 'Java'),
(7513, 'Perl'),
(9006, 'Linux'),
(9006, 'NT'),
(9842, 'DB2');
UNLOCK TABLES;
/*!40000 ALTER TABLE employeeSkills ENABLE KEYS */;
Bazu podataka employee moete da rekonstruiete na drugom raunaru ako uradite
sledee:

l. Napravite bazu podataka sa

odgovarajuim

imenom na ciljnom raunaru.

2. Uitate ovu datoteku pomou komande


mysql -u imekorisnika -p < backup.sql
Skript mysqldump ima vie opcija koje moete upotrebiti. U ovom sluaju zadali
smo --opt, koja grupie sledee opcije:

/*!40000 ALTER TABLE employee DISABLE KEYS */;


LOCK TABLES employee WRITE;
INSERT INTO employee
VALUES
(6651, 'Ajay Patel', 'Programmer',128),
(7513, 'Nora Edwards', 'Programmer',128),
(9006, 'Candy Burnett', 'Systems Administrator',128),
(9842, 'Ben Smith', 'OBA' ,42),
(9843, 'Fred Smith', 'OBA' ,131);
UNLOCK TABLES;
/140000 ALTER TABLE employee ENABLE KEYS */;

Table structure for table 'employeeSkills'

DROP TABLE IF EXISTS employeeSkills;


CHF.ATE TABLE employeeSkills (

--quick: Nalae MySQL-u da podatke upisuje direktno u datoteku, umesto da


ih prethodno upie u memorijski bafer (to je standardni nain rada).Time se
postupak kopiranja ubrzava.
--add-drop-table: Nalae MySQL-u da ispred svake komande CREATE TABLE
u rezultujuoj datoteci doda komandu DROP TABLE. (To vidite u listingu 14.1.)
--add-locks: Dodaje komande LOCK TABLES i UNLOCK TABLES koje se pojavljuju u rezultujuoj datoteci.
--extended- insert: Nalae MySQL-u da koristi sintaksni oblik s vie redova da
bijednom komandom INSERT uneo vie zapisa u tabelu. Na primer, u listingu to
izgleda ovako:
INSERT INTO employeeSkills
VALUES
(6651, 'Java'),
(6651, ' VB'),
(7513,'C'),

t'OglaVIJe '14 Izraela rezervn1n kopiJa 1oonaviJanJe podataka

IL.IUUU

Ako vam zatreba da pomou ove datoteke ponovo formirate bazu podataka i njen
sadraj, postupak e biti bri nego kada zadate niz pojedinanih komandi INSERT.
--lock-tables: Nalae MySQL-u da
izradu datoteke slike stanja.

zakljua

sve tabele pre nego to

zapone

Imajte u vidu da opcija --opt (koja znai optimizovati) optimizuje vreme potrebno
za rekonstruisanje baze podataka pomou datoteke slike, a ne vreme potrebno za izradu same
datoteke slike. Postupak izrade datoteke slike moe biti prilino spor.
Evo jo nekoliko korisnih opcija:
--databases: Omoguava da zadate vie odjedne baze podataka
elite da napravite.

ije

slike stanja

--all-databases: Nalae MySQL-u da napravi slike stanja svih baza podataka


na serveru.
--allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervisane rei MySQL-a (ili onima koje u budunosti mogu postati rezervisane rei),
ova opcija nalae MySQL-u da svakom imenu kolone pridrui i ime tabele kojoj
kolona pripada.
-d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog
sadraja. To je veoma korisno kada testirate baze podataka ili ih instalirate na
druge raunare.
Prednosti skripta mysqldump jesu u tome to se jednostavno upotrebljava i automatski reava problem zakljuavanja tabela umesto vas.
Meutim, ima i nekoliko nedostataka. Prvi je to to skript zakljuava tabele: kada
skript pokrenete na serveru, korisnicima spreavate pristup tokom vie sekundi ili ak
minuta, to zavisi od veliine tabela. Ako planirate izradu slike stanja na serveru koji se
ne replikuje, trebalo bi da pokuate da taj postupak obavite u vreme manje opteree
nosti sistema da ne biste previe ometali korisnike. Ako u svako doba dana imate velike
koliine podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi nain
izrade rezervnih kopija.
Drugi nedostatak je sledea injenica: poto skript mysqldump za svoj rad koristi
MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript
mysqlhotcopy ne zavisi mnogo od MySQL servera, ve se pri svom radu obraa
direktno sistemu datoteka na raunaru.

Izrada rezervne kopije i obnavljanje baze podataka


skripta mysqlhotcopy

pomou

Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome to direktno kopira


datoteke baze podataka, umesto da uitava podatke preko veze koju uspostavi sa serverom. On se povezuje sa serverom da bi ispraznio bafere tabela i zakljuao tabele, ali
budui da komunicira sa sistemom datoteka na raunaru i ne izvrava upite na serveru,
trebalo bi da bude neto bri od skripta mysqldump.

Ovaj skript se

pokree

1'-L.'-1

na

or ooooo

'"""I"''J..,.

o."..,..,,_,.,)-'')- r - - - o o - -

r--.----.--...... . - - - - -

sledei nain:

mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum


Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn
je sigurno da negde imate i izvrnu datoteku perl. Ukoliko imate Windows, morale
instalirati Perl da biste mogli da koristite ovaj skript. Ako ga jo nemate, moete p rl'
uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState:
www.activestate.com/Products/ActivePerl
Datoteke koje pravi skript mysqlhotcopy identine su kopije datoteka baze poda
taka. Da biste mogli da upotrebite te kopije za restauriranje baze podataka, morate
spustiti MySQL server i zameniti tim kopijama datoteke u MySQL-ovom direktorijumu data.
Runa

izrada rezervnih kopija i obnavljanje podataka

Umesto skripta mysqlhotcopy, moete i sami runo uraditi sve to taj skript radi. To
podrazumeva pranjenje bafera, zakljuavanje tabela i kopiranje datoteka s podacima
u odredini direktorij um, pri emu tabele moraju biti zakljuane.
To znai da morate otvoriti novu sesiju na MySQL serveru. Moete najpre izdati
komandu LOCK TABLES da biste zakljuali sve tabele za koje nameravate da napravite
rezervne kopije:
lock tables
employee read,
department read,
client read,
assignment read,
employeeSkills read;
Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju postavljate, READ ili WRITE. Za izradu rezervnih kopija obino je dovoljna blokada tipa
READ. To znai da druge niti (otvorene veze sa serverom) mogu neometano da itaju
tabele ali ne mogu nita da menjaju u njima dok traje postupak kopiranja.
Zakljuavanje tabela je vano u ovakvim situacijama jer kopiranje moe da potraje
prilino dugo. U naem primeru baze podataka employee, bilo bi veoma nezgodno da
nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbrie
sve zaposlene iz neke slube, a zatim izbrie i samu slubu. Rezultat bi bio neusklaena
kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojeoj slubi.
Sledei korak je izdavanje komande FLUSH TABLES:
flush tables;
Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak moete
kombinovati s prethodnim pomou sledee komande:
flush tables with read lock;
Sada moete zapoeti kopiranje datoteka s podacima.Veoma je vano da vaa sesija
(u kojoj ste zakljuali tabele i ispraznili njihove bafere) ostane otvorena tokom celog

I!J4

PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka

postupka jer e tako blokade koje ste postavili biti odrane. Kada zatvorite tu sesiju,
tabele e biti osloboene.
Kada zavrite kopiranje, trebalo bi da oslobodite tabele:
unlock tables;
Opisani postupak je ono to radi skript mysqlhotcopy, a podatke moete obnoviti
iz kopija na isti nain kao da ste kopije napravili pomou tog skripta.

Izrada rezervni h kop ija i ob navljanj e podataka pomou komandi


BACKU P TABLE i RESTORE TABLE
Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat
moete postii i pomou dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE.
Te komande deluju samo na tabele tipa MyiSAM.
Rezervnu kopiju MyiSAM tabele moete napraviti na sledei nain:
backup table tl to 'putanja/do/kopije';
Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u
sledeem primeru:
'
backup table tl to 'c:/putanja/do/kopije';
Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM
tabela. Tabela se automatski zakljuava tako da bude dozvoljeno samo itanje i pravi se
njena kopija.
Moete zadati i listu imena tabela razdvojenih zarezima; meutim, u tom sluaju se
tabele zakljuavaju i kopiraju jedna za drugom.Ako elite da podaci u svim navedenim
tabelama budu meusobno usklaeni, izdajte najpre komandu LOCK TABLES (pogledajte prethodni odeljak, "Runa izrada rezervnih kopija i obnavljanje podataka") .
Da biste iz rezervne kopije obnovili tabelu, izdajte sledeu komandu:
restore table tl from 'c:/tmp';
Rezultat e biti uspean samo ako tabele koje obnavljate ne postoje u tekuoj bazi
podataka. Ako ve imate tabel u sa istim imenom, morate je prethodno izbrisati
komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE.
Komanda RESTORE takoe deluje samo na MyiSAM tabele.

Restauriranje podataka iz dnevnika izmena


l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo esto se deava da korisici
dodaju nove podatke i auriraju postojee nakon izrade poslednje rezervne kopije.
U tom sluaju se stanje baze podataka moe restaurirati iz rezervnih kopija na jedan
od na ina opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve
i;-mene nainjene nakon izrade rezervne kopije.
Tc izmene se uvaju u dnevniku izmena (engl. binary log), to ga ini izuzetno
va7n im . Listu izvrenih operacija moete u itati iz dnevnika izme na pomou komande
mysqlbinlog logfile > updates.sql

O-'

-- O

--- .-e...._.....,_____

Korisno je da pregledate tu listu pre nego to ponovo izvrite upite ev1dclllll.lll


u dnevniku jer neke meu njima moda neete ele ti da izvrite. Mogue je d.1 \l
zbog loe osmiljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H
kopije.
Na primer, imali smo sluaj da je program er zadao upit nalik na sledei
update user set password='password';
Jasno je da kada obnavljate tabelu, ne biste eleli da se ovakav upit ponovo izvri
i da lozinka svakog korisnika sistema ponovo bude password!

Testiranje rezervne kopije


Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je vano da je
testirate ili, tanije reeno, da ispitate njenu upotrebljivost za obnavljanje podataka.
Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju
da li bi iz tih kopija mogli da restauriraju podatke ako zatreba.
Postupak izrade rezervne kopije morate paljivo razmotriti kada analizirate rizike
i odluujete o tome ta ete raditi. Gde ete tano smestiti datoteke rezervnih kopija
da bi bile na drugom fizikom disku? Kako ete obezbediti da rezervna kopija ostane
neoteena na udaljenoj lokaciji gde je uvate? Ako donesete odgovarajue odluke
na osnovu ovih pitanja i ponete da pravite rezervne kopije u redovnim vremenskim
razmacima, nema razloga da brinete da li e te kopije biti upotrebljive. Ukoliko restaurirate bazu podataka kao vebu, moete otkriti eventualne probleme pre nego to
postanu nereivi.
Izuzetno vaan element pri instaliranju MySQL-a, kao i za postupak obnavljanja
podataka, jeste da ukljuite beleenje izmena u dnevnik izmena. Taj dnevnik standardno nije aktivan, ali je neophodan za dovoenje res ta urirane baze podataka u
poslednje ispravno stanje.

Proveravanje i popravljanje tabela


Proveravanje da li su tabele oteene, deo je standardnog postupka odravanja tabela
a deo je i postupka restauriranja baze nakon katastrofalne greke, na primer, u sluaju
prekida napajanja raunara .
U MySQL-u postoje tri naina da proverite ispravnost tabela: pomou komande
CHECK TABLE, pomou skripta myisamchk (ili isamchk) i pomou skripta mysqlcheck.Tabele u kojima otkrijete problem moete popraviti pomou komande REPAIR
TABLE ili takoe pomou skripta myisamchk (ili isamchk) ili mysqlcheck.
Kada razmatrate koju ete mogunost primeniti, trebalo bi da imate u vidu sledeih
nekoliko injenica. Komande CHECK i REPAIR moete izdati iz samog MySQL-a, dok sc
druge mogunosti mogu primeniti samo s komandne linije. Komande CHECK i REPAIR
deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele,
dok se skriptovi myisamchk i mysqlcheck mogu koristiti za My ISAM tabele.

1:70

rU!JiliVIJC

l'+

ILl dUll l CLCI VIlli l II.Uf.IIJ<I l UUII<IVIJ<IIIJC f.IUU<Il<lll.l

Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk.
Bolje je da spustite server pre nego to pokrenete jedan od tih skriptova, ali ako je
neophodno, moete i zakljuati tabele. Ako te skriptove pokrenete za tabele s kojima
u isto vreme moda rade druge MySQL-ove niti, podaci se mogu otetiti. Komande
CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele
se koriste.
Razmotriemo redom navedene alatke.

Proveravanje i popravljanje tabela


Ispravnost tabele moete proveriti
primeru:

pomou

pomou

komandi CHECK i REPAIR

komande CHECK TABLE, kao u ovom

check table department;


Komanda CHECK TABLE deluje i na MyiSAM i na InnoDB tabele.
Trebalo bi da dobijete rezultat nalik na sledei (ako je sve u redu):

+---------------------+-------+----------+----------+
l Table
Msg_type
Msg_text
l Op
+---------------------+-------+----------+----------+
l

employee.department

check

status

OK

+---------------------+-------+----------+----------+

Program myisamchk izuzetno je koristan i izvui e vas iz neprilika u koje ste


moda upali. Za program myisamchk takoe vai da se ne sme pokrenuti dok se server
jo koristi. Bezbednije je da ga spustite.
Najjednostavniji nain da pokrenete myisamchkjeste da na komandnoj liniji
l
otkucate
myisamchk tabela
Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smetena
MyiSAM tabela.
Ovaj program prikazuje podatke o praktino svim moguim grekama do kojih
moe doi.Ako vam se ini da ne uspeva da rei va problem, pokuajte da ga pokrenete
sa opcijom -m. Standardno ponaanje je da progran1 ispituje da li su indeksi oteeni;
kada zadate ovu opciju, ispituju se i redovi tabele.
Alatka myisamchk omoguava i ispravljanje otkrivenih greaka. Tako se moe ispraviti velika veina greaka do kojih dolazi u MyiSAM tabelama. Program myisamchk
moete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u sledeem primeru:
myisamchk -q -r tabela
Ako je rezultat neuspean, napravite rezervnu kopiju datoteke s podacima a zatim
pokuajte potpuno obnavljanje tabele:

l row in set (0.00 sec)

myisamchk -r tabela

Moe se pojaviti i poruka Table is already up to date, koja takoe znai da je


sve u redu.
Ako se pojavi bilo kakva drugaija poruka, to znai da imate problem pa pokuajte
da popravite tabel u. To moete uiniti pomou komande REPAIR TABLE (ako je u
pitanju MyiSAM tabela) na sledei nain:

Ako i to bude bezuspeno, pokuajte opciju --s af e- recover, koja ispravlja neke
greke koje opcija -r ne moe da ispravi:
myisamchk --safe-recover tabela
Program myisamchk ima veliki broj moguih opcija, koje
komandnoj liniji otkucate myisamchk bez parametara.

ete

videti ako na

repair table tl;


Ako se postupak popravljanja zavri uspeno (ili ako popravljanje zapravo nije ni
bilo poptrebno), trebalo bi da dobijete rezultat nalik na sledei:

+---------+--------+----------+----------+
l Table
Msg_type
Msg_text
l Op
+- --------+--------+----------+----------+
l

test.tl
l

repair

status

OK

-- ------+--------+----------+----------+

l row in set

(0.03 sec)

Ako se pojavi poruka drugaija od OK, komanda REPAIR nije delovala i morate da
upotrebite moniju alatku myisamchk.

Proveravanje i popravljanje tabela pomou alatke myisamchk


U ovom poglavlju razmotriemo samo alatku myisamchk a zanemariemo alatku
isamchk. Ako jo radite sa ISAM tabelama, predlaemo da ih pretvorite u My ISAM
tabele (videti poglavlje 9",Tipovi tabela u MySQL-u").

Proveravanje i popravljanje tabela pomou alatke mysqlcheck


Program mysqlcheck moe se upotrebiti za proveravanje i popravljanje MyiSAM
i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi.
Da biste pomou alatke mysqlcheck proverili tabele baze podataka, pokrenite je
kao u sledeem primeru:
mysqlcheck -u imekorisnika -p employee
Iza ovih parametara moete navesti imena tabela koje elite da proverite, ali ako
nita ne zada te, bie proverene sve tabele u bazi podataka (to je korisna odlika). Ako
se sve zavri bez greaka, trebalo bi da dobijete rezultate nalik na sledee:
employee.assignment
employee.client
employee.department
employee.employee
employee.employeeSkills

OK
OK
OK
OK
OK

Poglavlje 14 Izrada rezervn1n KOpija 1 ounaviJHIJt:

flUUCILCIII.d
U ~II::Ut:l:t:m

Opcijom --databases moete zadati listu baza podataka koje treba proveriti,
a opcija --all-databases ini da se proveravaju sve baze podataka na serveru.
Programu mysqlcheck moete zadati opciju -r da bi popravio sve oteene
MyiSAM tabele na koje ie.

Saetak
Izrada rezervnih kopija

2. Trebalo bi da runo zakljuate tabele pre nego to


a) zaponete runu izradu rezervne kopije
b) pokrenete skript mysqldump
e) pokrenete skript mysqlhotcopy
d) nijedno od prethodnog

kopira datoteku tabele u odredini direktorijum.


Rezervne kopije moete napraviti i runo, tako to zakljuate tabele, ispraznite
njihove bafere a zatim napravite kopije datoteka baze podataka.

Restauriranje podataka
Izvrite komande iz datoteke slike stanja napravljene pomou skripta mysqldump.
Vratite kopije datoteka koje ste napravili pomou skripta mysqlhotcopy ili
runo.

4. Koji se tipovi tabela mogu popravljati pomou komande


a) InnoDB i MyiSAM
b) samo MyiSAM
e) MyiSAM i BDB
d) InnoDB i BDB
5. Ako je rezultat komande CHECK TABLE poruka Table
a) morate upotrebiti komandu REPAIR TABLE

komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili


komandom BACKUP TABLE.
Ponovo izvrite sve operacije evidentirane u dnevniku izmena nakon izrade
poslednje rezervne kopije.

Proverite stanje tabela pomou komandi CHECK TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.
Popravite tabele pomou komande REPAIR TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck.

TABLE?

d) InnoDB i BDB

Pomou

Proveravanje i popravljanje tabela

CHECK

b) samo MyiSAM
e) MyiSAM i BDB

pravi datoteku slike stanja koja sadri SQL komande.


mysqlhotcopy kopira datoteke baze podataka u odredini direktorijum.

BACKUP TABLE

t' J

3. Koji se tipovi tabela mogu proveravati pomou komande


a) InnoDB i MyiSAM

mysqldump

poglaVlJU

b) komanda CHECK
e) tabela je dobra

TABLE

REPAIR TABLE?

is already up

to date

ne podrava mainu baze podataka

d) nijedno od prethodnog

Vebe
Napravite rezervnu kopiju ~voje baze podataka primenom svih metoda opisanih u
ovom poglavlju. RestaunraJte bazu podataka iz svake kopije koju ste napravili.

Odgovori

Nemojte pokretati skript myisamchk dok se server koristi.

Pitanja

Pitanja
l. Ako elite da napravite rezervnu kopiju baze podataka, morate prethodno

a) spustiti server
b) zakljuati tabele i isprazniti njihove bafere

e) i a) i b)
d) nijedno od prethodnog

1. b

2. a
3. a
4. b
5. e

U sledeem poglavlju
U sledeem poglavlju",Zatita MySQL servera", saznaete kako da izbegnete najee
bezbednosne propuste.

l'

15
Zatita MySQL servera

razmatraemo

OVOM POGLAVLJU
opte probleme zatite o kojima bi trebalo da
vodite rauna kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se
objasne i najsitniji detalji, prilaemo spisak najvanijih preporuka o tome ta ne treba
raditi. Obradiemo sledee teme:

Kako sistem prava korisnika deluje u praksi


Zatita korisnikih naloga
Zatita instaliranih datoteka
Filtriranje podataka koje alju korisnici
Drugi saveti

Kako sistem prava korisnika deluje u praksi


U poglavlju ll",Upravljanje pravima korisnika", objasnili smo pravljenje korisnikih
naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo
poglavlje poinjemo opisom naina na koji MySQL server primenjuje prava koja
dodelite korisnicima.
Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL
utvruje da Ji je korisniku uopte dozvoljeno da uspostavlja veze sa servera m. Tome
slui tabela user u bazi podataka mysql. MySQL trai u toj tabeli red koji sadri korisniko ime i lozinku koje ste zadali te ime raunara s kojeg pokuavate da se poveete
sa serverom. Ako ne nae odgovarajui red, nee vam dozvoliti da uspostavite vezu.
Budui da kolona host tabele user prihvata i dokerske znake, kombinacija korisniko ime/ime raunara moe se nalaziti u vie redova te tabele. MySQL odreuje
koji je red najvaniji za utvrivanje identiteta tako to prvo ispituje redove koji sadre
konkretna imena raunara. Na primer, ako tabela sadri red za korisnika test koji se
prijavljuje s raunara localhost i red za korisnika test koji u koloni host sadri % (to
znai bilo koji raunar), MySQL uzima u obzir red koji sadri ime raunara localhost.

202

Zatita instaliranih datoteka

Poglavlje 15 Zatita MySQL servera

Imajte u vidu da dva reda mogu sadrati razliite lozinke. To moe biti uzrok velike
zabune. (Primer takve situacije pogledaemo u odeljku "Brisanje anonimnih naloga",
u nastavku ovog poglavlja.)
Drugi korak se odvija kada pokuate da izvrite odreene upite ili komande. Pre
izvrenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno
izvravanje upita koji ste poslali.
Ako je za upit koji pokuavate da izvrite potrebno globalno pravo - npr. kao za
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvravanju upita u odreenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju
se utvruje da li moda ima pravo pristupanja odreenim tabelama i kolonama.

Zatita korisnikih naloga


Postoji nekoliko optih bezbednosnih principa koji vae i za upravljanje korisnikim
nalozima na MySQL serveru. Razmotriemo ih u narednom odeljku.

Zadavanje lozinke za

korisniki

nalog Root

Kada zavrite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte
lozinku za tog korisnika pre nego to ponete da koristite MySQL za bilo ta drugo
osim iskljuivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako
se moe prijaviti na va server i raditi s vaim podacima ta god pocli.To gotovo nikad
nije prihvatljiva situacija. Ako jo niste zadali lozinku, uinite to odmah.

Brisanje anonimnih naloga


Kada MySQL instalirate na Windows, on automatski pravi nekoliko naloga. Na
Linuxu se to obavlja kada pokrenete skript mysql_install_db. Dva od tih naloga su
anonimna, odnosno predstavljaju nalog koji vam se dodeljuje kada ne zadate svoje
korisniko ime. Ime jednog naloga je localhost a drugo je %(predstavlja bilo koji
raunar, to omoguava uspostavljanje veza sa udaljenih raunara). Ti nalozi standardno nemaju lozinke.
Verovatno ste ve shvatili zbog ega, ali ipak izriito preporuujemo da izbriete te
naloge. To moete uraditi na sledei nain:
delete from user where User='';
delete from db where User='';
Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispraznili tabele prava.
Drugi razlog za brisanje tih naloga jeste to to mogu izazvati zbrku kada regularan
korisnik pokua da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili
nalog ije je ime laura i koji sme da se prijavljuje s bilo kojeg raunara(%); kada
1 ura pokua da se prijavi s raunara localhost, MySQL server trai odgovarajue

redove u tabeli user. Tamo e nai kombinacije laura% i (anonymous) localhost.


Budui da MySQL daje prvenstvo redovima koji sadre konkretna imena raunara,
uzima red (anonymous) localhost. Kao to vidite, iako je laura navela svoje korisniko ime, u ovom sluaju ono ne slui niemu! Za anonimne naloge nije potrebno
zadati korisniko ime. Anonimni nalog verovatno ima drugaiju lozinku od naloga
korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako
prijavljuje ne mora da zada lozinku).To znai da e laura, kada pokua da se pod svojim korisnikim imenom i lozinkom prijavi s raunara localhost, dobiti poruku
Access Denied (pristup nije dozvoljen) bez oiglednog razloga.
Najbolji nain da izbegnete tu vrstu problema jeste da izbriete anonimne naloge
i zaboravite da oni uopte postoje.

Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, to je opisano u poglavlju ll.
Morate vrlo paljivo razmotriti kome ete dodeliti neka od tih prava. Budite veoma
oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
Pravo FILE omoguava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda moe se zloupotrebi ti za menjanje sadraja datoteka na serveru (kao to je
datoteka za lozinke, /etc/passwd) ili ak za menjanje datoteka baza podataka, ime se
zaobilazi sistem prava pristupa.
Pravo PROCESS omoguava korisnicima da izdaju komandu SHOW PROCESSLIST.
Tako u svakom trenutku mogu videti koji se sve upiti izvravaju, to im omoguava da
dou do poverljivih podataka o drugim korisnicima.
Pravo WITH GRANT OPTION omoguava korisnicima da svoja prava dodeljuju drugim korisnicima. Ako znate kakve mogu biti posledice tog prava, moete ga oprezno
dodeljivati drugima.

ifrovanje lozinki
MySQL uva lozinke korisnika u ifrovano m obliku. Pre verzije 4.1, mogli ste pri prijavljivanju na server da zadate i ifrovani oblik lozinke.To je sada ispravljeno i ugraena
je jaa zatita lozinki i mehanizma prijavljivanja.
Ako piete aplikaciju koja skladiti imena i lozinke svojih korisnika (ne korisnika
MySQL-a), nemojte ih ifrovati pomou funkcije PASSWORD ().Umesto nje, preporuujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objanjene u poglavlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT".

Zatita instaliranih datoteka


Osim zatite MySQL-ovih korisnikih naloga, morate kontrolisati i pristup MySQL-ovim binarnim datotekama, skriptovima i datotekama s podacima. Naveemo neko
liko preporuka koje moete primeniti na svoj sistem.

Drugi savet l

Poglavlje 15 Zatita MySQL servera

Nemojte pokretati mysqld pod nalogom Root

Drugi saveti

Ovo se preporuuje na Linuxu i drugim operativnim sistemima srodrum sa Umxo~1.


Nemojte pasti u iskuenje da pokrenete MySQL server (program mysqld) pod .kon_snikim nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce
raditi samo MySQL server. Tako ete ograniiti prava pristupa koja e MySQL server
imati u sistemu datoteka.

Pristup datotekama i prava upotrebe u operativnom sistemu


Nema svrhe da troite vreme na pravilno podeavanje prava korisnikih naloga za pristup
MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu. N~ophodno
je da korisnicima ograniite p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a
naroito direktorij umu data. Cest bezbednosni propust je da se nekom konsruku dozvoh
pristup raunaru na kojem radi MySQL server, ali ne i, na primer, bazama podat~a dr.ugih korisnika. Ako taj korisnik ima pristup u direktorijum data, moe da naprav1 koplje
datoteka s podacima i da ih otvori na nekom drugom MySQL serveru.
Trebalo bi da uvek preduzimate sledee opte bezbednosne mere:
Samo ovlaeni i pouzdani korisnici treba da imaju pravo da pokreu mysqld. To
pravo moete dodeliti jedino korisnikom nalogu koji ste napravili iskljuivo za
mysqld .
Samo ovlaeni i pouzdani korisnici treba da imaju pristup MySQL-ovim pridruenim programima i skriptovima, kao to su, na primer, mysqladmin, mysqldump
i mysqlhotcopy. Najbolje je da o tome odluujete od programa do programa.
Samo ovlaeni i pouzdani korisnici treba da imaju pristup u MySQL-ov direktorijum data. Ako server radi pod korisnikim nalogom mysql, tom nalogu je
neophodan pristup u direktorijum data. Poto nijednom drugom konsmku to
nije neophodno, najbolje da im zabranite pristup tamo.

Filtriranje podataka koje korisnici alju

Pre nego to MySQL-u prosledite bilo koji podatak k?ji je kor~snik une.o: treb.al.o b1
dn klijentska aplikacija izvri odreene provere. Kako cete to tacno obav1t1, zav1s1 od .
razvojne platforme s kojom radite, ali pogledajmo primer koji objanjava zbog ega b1
ttd)nlo da proveravate ulazne podatke.
v
.
v
.
Problem se moe pojaviti ak i pri neemu tako jednostavnom kao sto je unosenje
1w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vau aplikaciju. ~o te po?atke
pmslcdite direktno MySQL-u, problem e nastati zbog apostrofa u prez1menu O Leary.
u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokuavaju da unesu
MySQL-ove komande putem korisnikog interfejsa vae aplikacije ili Web obrazaca.
Postupak kojim ete proveriti prihvatljivost ulaznih podataka zavisi od programskog
.JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji ete nai nekoliko optih
pn:poruka za veliki broj programskih jezika.

Razmotrili smo sistem prava pristupa, obradili korisnike naloge, opisali datoteke u
sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zatita
vae mree (to bi verovatno trebalo da vas brine im imate bilo kakvu vezu sa spoljnim svetom), MySQL omoguava da se prenoenje podataka zatiti pomou protokola
SSL. Trebalo bi da razmotrite i fiziku zatitu ureaja.

Upotreba SSL veza


Ako elite da spreite da neko zlonameran "njuka" pakete podataka koje razmenjuju
MySQL server i klijenti, podesite MySQL za uspostavljanje zatienih veza pomou
protokola SSL (Secure Sockets Layer).
Da biste mogli da koristite SSL, treba da instalirate biblioteku OpenSSL (na raspolaganju je na www. openssl. org), pokrenete server sa opcijama --with-vio i --withssl i obavite odreena podeavanja na komandnoj liniji. Dobar primer skripta koji
obavlja potrebne operacije nalazi se u MySQL-ovoj dokumentaciji; ovde ga nismo
reprodukovali.
Poto obavite neophodna podeavanja, pomou komande GRANT zahtevajte da se
korisnici prijavljuju putem SSL veza ili da imaju odgovarajue sertifikate. Evo jednostavnog primera upotrebe komande GRANT:
grant all on employee.*
to testuser identified by 'password'
require ssl;
Ova komanda pravi (ili menja) korisniki nalog testuser, ija je lozinka password. Taj korisnik moe da se prijavljuje na server samo putem SSL veza. Moete
zahtevati da se na taj nain prijavljuju svi korisnici servera ili moda samo korisnici
koji se prijavljuju sa udaljenih raunara.
Fizika

zatita instalacije

Opta preporuka glasi: ako ste se ve potrudili da paljivo podesite korisnike naloge u
MySQL-u i u operativnom sistemu, pa ak i zahtevate da se korisnici prijavljuju
putem SSL veza, najbolje je i da fiziki zatitite instalaciju. Ako postoji mogunost da
neko obori server zato to se sapleo o njegov kabi za napajanje, ili ako neko moe da
ukrade podatke tako to odnese ceo raunar, imate ozbiljan problem. Fizika zatita se
esto zaboravlja, naroito u malim i srednjim kompanijama.
Moda manje iznenauje kada je u pitanju Windows, ali ak i inae bezbedni Unix/
Linux sistemi postaju ranjivi kada se zanemari fizika zatita. Na primer, na Linuxu je
postupak izmene lozinke korisnikog naloga root trivijalno jednostavan kada imate
fiziki pristup raunaru. Naravno, kada neko podacima moe da pristupa kao korisnik
root, moe da menja koje god hoe podatke u MySQL-ovim bazama podataka .

:ICI

~OG

Poglavlje 15 Zatita MySQL servera

2. Koja se tabela prva pretrauje kada se


izvri odreeni upit?

Saetak

e) db
d) tables_priv
3. Ako MySQL pronae u tabeli user vie redova koji sadre isto ime korisnika,
koji red uzima za proveru identiteta korisnika?
a) Red koji sadri
b) Red koji sadri

raunara.

Veoma paljivo razmotrite kome

ete

dodeliti prava

FILE, PROCESS

Lozinke koje se koriste samo za pristup aplikacijama ifrujte


MOS () ili CRYPT () a ne pomOU funkcije PASSWORD () .

pomou

funkcija

Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban


korisniki nalog s vrlo ogranienim pravima koji ete upotrebljavati samo za
mysqld.
Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s ogranie
nim pravima.
Korisnicima ograniite pristup programima i skriptovima prema potrebama.
Drite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome
to im zaista treba!
Dozvolite pristup direktorijumu data samo MySQL-ovom korisniku .
Nikad ne prihvatajte podatke direktno od korisnika. Uvek ih prethodno filtrirajte u aplikaciji u kojoj se unose .
Ukljuite upotrebu SSL veza ako su potrebne ifrovane veze.
fiziku

zatitu MySQL servera!

a)

l . Koj a se tabela u bazi podataka mysql pretrauje kada se


dozvoljeno da uspostavi vezu sa serverom?
a) tables_priv

d)

li Sl' r

utvruje

da lije korisniku

lozinku.

FILE

b) PROCESS

e) WITH GRANT OPTION


d) Sva prethodna
S. Koji je korisniki nalog pogodan za mysqld?
a) Nalog s vrlo
b) Root
e) a) ili b)

ogranienim

pravima

d) Ni a) ni b)

Vebe
Pomou

primera podeavanja opisanog u MySQL-ovoj dokumentaciji, instalirajte


OpenSSL za upotrebu na svom MySQL serveru.

Odgovori
Pitanja
l. d

Pitanja

tanu

d) Nijedno od prethodnog.
sledeih prava verovatno ne bi trebalo da dodeljujete korisnicima?

2. a

b) db
e) co lumns_priv

ime raunara .
najneodreenije ime raunara.

4. Koja od

WITH

GRANT OPTION.

N e zanemarujte

najodreenije

e) Svaki red koji sadri

Bezbednosne preporuke
Obavezno zadajte lozinku za MySQL-ov nalog root.
Izbriite anonimne naloge; oni omoguavaju pristup neovlaenim korisnicima
i mogu da spree pristup regularnim korisnicima.

da li je korisniku dozvoljeno d,1

a) user
b) host

Sistem prava pristupa


Korak 1: Provera da li korisnikraunar ima pravo pristupa s lozinkom koju je
zadao.
Korak 2: Provera svakog upita da bi se utvrdilo da li korisnik raunar ima
odgovarajue pravo. Najpre se pretrauju tabele user i host, zatim db, a onda
tables_priv i columns _pri v.
MySQL daje prednost redovima u tabeli User koji sadre konkretna imena

utvruje

3. a
4. d
S. a

Poglavlje 15 Zatita MySQLservera

16

U sledee m poglavlju
U poglavlju16",Replikovanje baze podataka", saznaete kako se dva servera ba~a .
podataka mogu podesiti da rade sa istim podacima. Time se rasporeuje opterecenJe,
poveava robusnost sistema i olakava izrada rezervnih kopija podataka.

Replikovanj e baze podataka

MOGUNOSTI

EDNA OD VEOMA KORISNIH


KOJE PRUA MYSQL jeste replikavanje. Izmeu ostalog, replikovanje omoguava da iste podatke uvate na vie servera .
To moete raditi iz vie razloga,_npr. da biste postigli bolje performanse, poveali
pouzdanost sistema ili da biste lake pravili rezervne kopije baze podataka. Osim toga,
moete se opredeliti za replikovanje kao reenje kada elite da raspodelite optereenje
baze podataka na vie servera koje ve imate, umesto da nabavite jedan (nov) jai server.
Replikovanje baze podataka moe obezbediti otpornost sistema na greke (engl.
Ja~lt tolerance). Ako se glavni server pokvari,jedan od zavisnih servera moete tretirati
kao njegovu kopiju i odmah ga proglasiti za glavni server.
U sistemima gde se veina operacija svodi na itanje podataka, a ne na pisanje, teplikovanje moe da pobolja performanse jer se izvravanje upita raspodeljuje na vie rau
nara. Ukupno optereenje sistema moete pokuati da smanjite tako to izvravanje
upita rasporedi te na vei broj manje optere enih raunara, a druga mogunost je da
pokuate da smanjite saobraaj u mrei tako to svaki upit usmerite na geografSki najblii server. Ako su upiti koji se izvravaju u vaoj bazi podataka uglavnom prilino jednostavni, ak i jednostavan algoritam koji ciklina rasporeuje optereenje moe biti
efikasno reenje. Ako neki upiti zahtevaju sloenu obradu, verovatno ete morati da
osmislite sloenije algoritme koji e rasporeivati optereenje ve na nivou aplikacije.
Druga primena replikovanja jeste izrada rezervnih kopija baze podataka. Kao to
smo napomenuli u poglavlju 14",Izrada rezervnih kopija i obnavljanje podataka",
izrada rezervne kopije obimne baze podataka moe da potraje prilino dugo. Kada
koristite replikovanje, moete spustiti zavisni server i napraviti kopiju njegovih podataka bez ometanja korisnika glavnog servera.

Principi replikovanja
Replikovanje se moe odvijati u vie oblika. U MySQL se koristi usmerena veza glavni-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili vie servera tretiraju sc
kao zavisni (engl. slaves) od odreenog glavnog servera. Glavni server odreuje koji sc
podaci uvaju u sistemu, dok zavisni serveri pokuavaju da preslikaju njegov sadr,j.

IV

Postupak replikovanja oslanja se na sadraj dnevnika izmena na glavnom serveru.


U tom dnevniku uvaju se podaci o svakom upitu koji je bio izvren na serveru od
po etka beleenja u dnevnik. Zavisnim serverima se alju upiti iz dnevnika izmena
glavnog servera a oni ih primenjuju na svoje podatke.
Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru,
dok se operacije itanja raspodeljuju izmeu zavisnih servera, ili ak izmeu glavnog
i zavisnih servera. To se postie najee ugradnjom odgovarajue logike u aplikacije.
Vano je imati u vidu da kada ponete da replikujete bazu podataka koja ve sadri
podatke, dnevnik izmena moda nee biti potpun. Budui da beleenje izmena u dnevnik standardno nije ukljueno, podaci koje ste uneli u sistem moda nisu zabeleeni u
dnevniku izmena. Kada zaponete replikovanje, svi zavisni serveri moraju sadrati potpuno iste podatke kao glavni server na poetku beleenja u dnevnik izmena.Ovu temu
ra zmotriemo detaljnije u nastavku poglavlja.
Poto zavisne servere napunite usklaenim podacima i pokrenete ih, oni uspostavljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeleene u
dnevniku izmena glavnog servera. Jedna nit izvrenja na zavisnom serveru uspostavlja
vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smetaju u
prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvrenja na zavisnom
serveru ita izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka.
Budui da glavni i zavisni serveri mogu biti dostupni u razliita vremena (npr. zato
to se u sistem mogu dodati novi serveri ba u trenutku izvravanja upita, ili zato to je
mrea postala zaguena, ili je ak prestala da radi), neophodno je da zavisni serveri belee
dokle su stigli sa unoenjem izmena.Vano je da se sve transakcije 'izvre u celini i da se
izmene primenjuju pravilnim redosledom. U veini aplikacija, ako se garantuje da baza
podataka uvek prelazi iz jednog usklaenog stanja u drugo, manje je vana injenica da
e se ponekad uitati podaci zastareli nekoliko sekundi ili minuta.
Ako razmatrate primenu replikovanja, morate shvatiti ta se tano dogaa. Auriranje
podataka odvija se asinhrono, a ne u realnom vremenu. Poto aurirate podatke u bazi
na glavnom serveru, upiti poslati razliitim zavisnim serverima nakon toga mogu izvesno
vreme davati razliite rezultate. To se moe smatrati nedostatkom, ali prednost je u tome
to e zavisni server koji radi na prenosivom raunaru ili u nepouzdanoj mrei, sasvim
lepo raditi u intervalu izmeu dva auriranja s glavnog servera.

Napomena o verzijama MySOL-a


l ~c plikovanje je

prvi put ugraeno u jednu od novijih verzija MySQL-a (3 .23 .15), to


da se ta mogunost jo uvek razvija gotovo sa svakom novom izdatom verzijom.
Ako nameravate da koristite replikovanje, dobro je da na svim raunarima koji u tome
u es tvuju instalirate aurnu i istu verziju MySQL-a.
Mogu e su odreene kombinacije verzija MySQL-a izmeu glavnog i zavisnih
servera, ali poto time samo uvodite odreen stepen nepouzdanosti, najbolje je da to
izbe gavate ako je ikako mogue. Primera radi, moete naii na problem da se funkcij e,
kao to j e PASSWORD (),razlikuju izmeu dve verzije MySQL- a s kojima pokuavate da
radit e.
z n ai

Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na sJede oj
adresi nai ete dokumentaciju s matricom verzija glavnih i zavisnih servera koje
mogu raditi zajedno:
www.mysql.com/doc/en/Replication_Implementation.html

Podeavanje sistema za replikovanje

U veini sistema u kojima se primenjuje replikovanje koristi se vie raunara povezanih u jednu internu mreu. Ako imate raun are povezane putem javnog Interneta,
paljivo razmotrite bezbednosne mere. Za poetak, obavezno proverite da li je TCP
prikljuak koji ste odredili za MySQL dostupan kroz zatitni zid svim raunarima koji
treba da komuniciraju sa serverom (podrazumevani broj TCP prikljuka za MySQL
server je 3306) .
Pod pretpostavkom da na svojim raunarima imate noviju verziju MySQL-a i
jednu ili vie baza podataka koje elite da replikujete, naredni koraci su obavezni da
biste napravili sistem s jednim glavnim serverom i jednim ili vie zavisnih servera.

Napravite korisniki nalog koji ete upotrebljavati samo pri replikovanju


Umesto da za sve to radite koristite nalog root, preporuujemo da za poslove repEkovanja napravite korisnike naloge koji e imati samo prava neophodna za te poslove,
ka to smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam
je poseban nalog na glavnom serveru, namenjen iskljuivo poslovima replikovanja.
Ako nameravate da poetno stanje zavisnih servera generiete pomou komandi
LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, korisnikom nalogu za
replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na
glavnom serveru) pravi korisniki nalog s pravima koja su potrebna alatkama za
uspostavljanje poetnih veza izmeu servera:
grant replication slave, reload, super, select
on logs.*
to replication"%" identified by 'password';

(U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgovara imenu vae baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)
Poto zavrite kopiranje poetnih podataka s glavnog servera na zavisni server,
korisnikom nalogu za replikovanje vie nee biti potrebna tako velika ovlaenja. Ako
zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlaenja korisnikog naloga za replikovanje nakon zavretka poetnog kopiranja, tom nalogu je
dovoljno samo pravo replikovanja. Naredni upit pravi korisniki nalog ije je ime
replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
servera (kao i sa svakog drugog raunara):
grant replication slave on logs.* to replication"%" identifi e d by
'password' ;

' l .it

rUyli:tVIJC

l0

Podeavanje sistema za replikovanjr

nC~III\UVdiiJC UdLC tJUUdldl'\.

Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika".


Pravo replication slave (zavisni server pri replikovanju) uvedeno je u MySQL 4.0.2
upravo za tu namenu. U starijim verzijama MySQL-a koristite pravo file.
Navedena komanda omoguava samo pristup bazi podataka logs. Ako elite da dozvolite replikovanje svih baza podataka na serveru, u komandi zamenite logs. * sa * . *.

Proverite da li je glavni server podeen za replikovanje

Na glavnom serveru mora biti ukljueno beleenje izmena u dnevnik. Ako ste proitali
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e ve ukljuili dnevnik .
izmena jer on slui i za druge svrhe osim replikovanja. Da b1ste provenli da li Je ukljueno beleenje izmena u dnevnik, moete izdati komandu SHOW VARIABLES. Dovoljno

je da zadate
show variables;
da biste prikazali vrednosti svih serverskih promenljivih, ali za skraeni rezultat zadajte
sledee :

show variables like "log_bin";


Ako je beleenje izmena u dnevnik iskljueno, dodajte opciju log-bin u datoteku
opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija bie my. ini ili my. cnf,
u zavisnosti od konvencije operativnog sistema koju ste primenili.
U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo
bi da vaa datoteka opcija sadri barem sledee redove:
[mysqld]
log-bin
server-id=1
Opcija server- id je jedinstven identifikator koji treba da do~elite svakom MySQL
serveru. To mora biti pozitivna celobrojna vrednost, a u ovom pnmeru sasv1m proizvoljno zadali smo 1.
.
.
Ako izmenite sadraj datoteke opcija, morate ponovo pokrenut1 server da bl
izmene poele da vae.

Napravite kopiju tekueg stanja glavnog servera


Da biste zapoeli replikovanje, obezbedite sledee:
potpunu i usklaenu kopiju tekueg stanja baze podataka na glavnom serveru
ime datoteke dnevnika izmena na glavnom serveru
pomak od poetka dnevnika koji odgovara tekuem stanju servera.

Taan postupak kojim ete obaviti navedene poslove moe s.e malo razli~ovati
u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam

.Jl! neprijatna pomisao da ete za odreeno vreme morati da zabranite pristup bazi
podataka.

Za My ISAM tabele, kopiju tekueg stanja svakog zavisnog servera moete napraviti
nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u
nastavku ovog poglavlja. Meutim, ova metoda nije posebno efikasna, naroito kad
imate veliku koliinu podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM
MASTER izdata sa svakog zavisnog servera zakljuae podatke na glavnom serveru do
zavretka kopiranja. Baze podataka e biti zakljuane znatno krae vreme ako kopiju
tekueg stanja napravite runo pomou komandi operativnog sistema. To vam takoe
omoguava da istom kopijom tekueg stanja glavnog servera inicijalizujete koliko god
vam zavisnih servera treba, ime skrauj ete interval u kojem je server zakljuan.
Za InnoDB tabele ne moete izdati komandu LOAD DATA FROM MASTER. Kopiju
stanja morate napraviti runo pomou komandi operativnog sistema ili nabavite
softver i opremu koji omoguavaju izradu kopije podataka dok se server koristi .
Ako kopiju tekueg stanja servera pravite runo, pomou komandi operativnog
sistema, morate se uveriti da su podaci meusobno usklaeni i aurni, tako to ete
izdati sledeu komandu:
flush tables with read lock;
Time ete zakljuati tabel u i spreiti upisivanje izme na dok je ne oslobodite.
Ime tekue datoteke dnevnika i pomak od njenog poetka moete dobiti pomou
sledee komande:
show master status;
Trebalo bi da dobijete rezultate nalik na

sledee:

+-------------------+----------+---- - ---------+------------------+
l File
l Position l Binlog_do_db l Binlog_ignore_db l
+-------------------+----------+--------------+------------------+
l server-bin.000007 l
211 l
+-------------------+----------+--------------+------------------+
Zapiite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone
(pomak od poetka te datoteke). Ako nema podataka, umesto imena datoteke zadajte
prazan znakovni niz, a vrednost pomaka treba da bude 4.
Da biste napravili kopiju tekueg stanja My ISAM tabela, pomou neke alatke za
arhiviranje datoteka kopirajte sadraj direktorijuma u kojem se nalaze datoteke tabela.
Na Unixu, zadajte neto nalik na sledee da biste napravili kopiju tekueg stanja baze
podataka logs:
tar -cvf /tmp/snapshot.tar /path/mysql/data/logs
Na Windowsu, upotrebite WinZip ili neku slinu alatku da biste napravili kopiju
sadraja direktorij uma C: \mysql\data \lo gs.
Kada zavrite kopiranje, moete ponovo dozvoliti upisivanje u bazu podataka ako
izdate sledeu komandu:
unlock tables;

214

Sloenije topologlj

Poglavlje 16 Replikovanje baze podataka

Tabela employee koju koristimo u celoj knjizi (kao i veina tabela koje autori koriste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje
InnoDB tabela dok se koriste, onje savren za ovu namenu. Moe se nabaviti od firme
Innobase Oy na adresi
www.innodb.com/hotbackup.html
Ako nemate takvu alatku, najbolje reenje je da ispraznite bafere baze podataka i da
ispraznite njene tabele pomou narednih komandi. Prvo zadajte komandu
flush tables with read lock;
a zatim prikaite i zapiite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti
nain kao za MyiSAM tabele):

show master status;


Bazu podataka iskljuite iz upotrebe a da je ne oslobodite, a sadraj direktorij uma
u kojem se nalaze tabele te ~aze podataka kopirajte u MySQL-ov direktorijum data.
Ako imate InnoDB tabele, morate kopirati datoteke s podacima i datoteke dnevnika.
Kada zavrite kopiranje, moete ponovo pokrenuti bazu podataka i osloboditi njene
tabele.

Podesite zavisne servere


Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini)
dodajte red nalik na sledei:
server-id=2
Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka,
potpuno je nevano koje ete vrednosti izabrati. Ako ete imati vei broj servera, niz
rastuih vrednosti je najverovatnije najbolji nain da identifikatori imaju jedinstvene
vrednosti.
Ukoliko koristite kopije koje ste runo napravili u sistemu datoteka, morate kopirati datoteke na odgovarajua mesta na zavisnom server u. Ako radite s vie razliitih
operativnih sistema, vodite rauna o razlikovanju malih i velikih slova.
Nakon auriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server,
morate ga ponovo pokrenuti.

Pokretanje zavisnih servera


Da biste pokrenuli zavisni server podeen kako je opisano u prethodnim odeljcima,
treba da izdate sledee komande:
change master to master_host='server',
master_user='replication',
master_password='password',
master_log_file='server-bin.000007',
master_log_pos=211;
start slave;

U ovom primeru, re server je ime raunara na kojem radi glavni server. Re


replicationje korisniko ime naloga koji ste napravili za poslove replikovanja.
Umesto rei password upite lozinku tog naloga. Zadajte i ime datoteke dnevnika
izmena (parametar master_log_file) i pomak (parametar master_log_pos).
Komanda START SLAVE pokree na zavisnom serveru nit koja obavlja replikovanjc,
usled ega zavisni server pokuava da uspostavi vezu sa glavnim serverom i preuzme
1zmene.
Ako ste napravili kopiju tekueg stanja pomou komandi operativnog sistema, trebalo bi da pokrenete izvravanje upita koji ispituju razlike izmeu glavnog servera i
zavisnih servera, da biste se uverili da se replikovanje odvija kako treba. Napravite
malu izme nu na glavnom serveru, a zatim p rover ite da li je zavisni server i preuzimaju .
Ako replikujete relativno male My ISAM tabele, moete ih napraviti i popuniti
podacima pomou komande nalik na sledeu:
load table logs.logJan2003 from master;
kada elite da kopirate samo jednu tabel u, ili
load data from master;
da biste kopirali sve tabele na zavisni server.
Kada postupak replikovanja pone da se normalno odvija, vie nee biti zgodno da
runo izdajete komande za podeavanje replikovanja, ak ako zbog toga retko ponovo
pokreete server. Iste podatke koje biste zadali pomou tih komandi moete uneti u
datoteku opcija, uz malo drugaiju sintaksu.
Datoteka my. ini ili my. cnf na zavisnom serveru moe sadrati neto nalik na sledei:
[mysqld]
server-id = 2
master-host
server
master-user
replication
master-password
password
replicate-do-db = logs

Sloenije topologije
Najea

pr imena replikovanja jeste rasporeivanje optereenja (engl. load balancing)


u sistemu u kojem se obavlja veliki broj operacija itanja podataka a relativno mali broj
operacija upisivanja podataka. Mnogi sistemi s replikovanjem sastoje se od jednog
glavnog servera i manjeg broja zavisnih servera, ali postoje i sluajevi u kojima je
opravdana upotreba sloenijih konfiguracija.
Ako predviate da ete imati vei broj zavisnih servera ili su vai raunari razmeteni
na veem broju razliitih geografskih lokacija, moe biti pogodno reenje u obliku
hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za odreen broj
zavisnih servera. Jedan ili vie tih zavisnih servera igraju ulogu glavnog servera za drugu
grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server (raunar broj l) koji
je gl:wni ?:a ra unarc od 2 do 6. Neki od tih zavisnih servera igraju ulogu glavnih
servl't .1 :t.t dru~\.' grupe zavisnih servera .

216

Poglavlje 16 Rep likovanje baze podataka

Slika 16.1

Replikovanje s hijerarhijski organizovanim glavnim serverima.

Pitanja

. Uglavnom, replikovanju treba pristupiti sa izvesnom rezervom. Mehanizam radi,


1 to dob:_o,ali poetno podeavanje moe biti zapetljane zbog razlika izmeu sistema .
Prepon~CUJemo da koristite najsveije verzije MySQL-a koje moete nabaviti.
Neki od tih problema bie reeni kada My ISAM dobije alatku za kopiranje podataka
dok .se tabele kon~ te, kao..to postoji za InnoDB tabele. Meu mogunostima koje su
plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s vie
glavmh se:v~ra Istovremeno (engl. multimastering) radi reavanja sukoba, i mogunost
preklapanJa IZmeu ~va server~ "n~. vrue" (engl.failover) i rasporeivanje optereenja.
Zasad se o p~eklapa11Ju na vruce IZmeu dva servera i rasporeivanju optereenja
morate starati sami u svojim aplikacijama, ili moete nabaviti odgovarajuu alatku za
grupiSal1Je servera, kao to nudi kompanija Emic Application Cluster na adresi
www.emicnetworks.com .

Raspored kao na slici smanjuje optereenje glavnog servera na najviem nivou i


smanjuje obim saobraaja na mrenim vezama koje vode ka tom raunaru. U zavisno-
sti od odnosa izmeu broja operacija itanja i upisivanja podataka u vaoj aplikaciji,
tako moete obezbediti dobru skalabilnost bez prevelike sloenosti sistema.
Prilino jednostavno moete formirati sistem s proizvoljnim brojem zavisnih servera i moda ak vie glavnih servera, pod uslovom da je svaki raunar glavni server
u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite
rauna da e ponekad na odreenom serveru nedostajati najnovije izmene, ceo sistem
moete tretirati otprilike kao da je u pitanju samo jedan server baze podataka.
Stvari poinju da se komplikuju kada imate cirkularne veze u kojima vie servera
primaju komande za auriranje podataka a izmene se prosleuju u vie smerova.
Najjednostavnija cirkularna veza sastoji se od dva raunara koji se ponaaju i kao glavni
i kao zavisni server. Svaka izme na koju nainite na jednom raunaru prosleuje se drugom. Kada piete aplikacije za tu vrstu sistema, morate biti veoma oprezni.
Budui da se izmene unose asinhrono, moe doi do dupliranja vrednosti u poljima
tipa auto increment ili jedinstvenih identifikatora i do neusklaenih podataka. U nekim
aplikacijama to moe biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira
podatke i u kojoj imate manji broj jednostavnih veza izmeu tabela, a zahteva se veliki
protok podataka i raspoloivost za upotrebu, moda ete prihvatiti da tome rtvujete
usklaenost podataka.

B udunost
Imajui

replikovanja

u vidu sve to je reeno, moramo napomenuti da su u pitanju relativno nove


mogunosti, koje nisu do kraja "izbruene". Kao to ste videli, postupak inicijalizovanja
novog zavisnog servera kopijom stanja glavnog servera nije ba najpraktiniji. Nije usklaen ni nain na koji se radi s MyiSAM tabelama i InnoDB tabelama. Tekue mogunosti
n:plikovanja u MySQL-u nisu ba najrobusnije. Ugraene su u standardnu distribuciju
(za razliku od veine komercijalnih baza podataka) i redovno se upotrebljavaju u okru1cnjima gde sc obraduju velike koliine podataka.Verovatno ete uti da su meu kori
Sllltim.l kompanije kao to su Slashdot,Yahoo! i Googlc.

U .datoteci opcija P?stoji nekoliko parametara koji se tiu replikovanja ali zasad
nemaJumkakvog UtiCaJa. To su opcije za podeavanje SSL veza izmeu glavnog servera
I zav1smh se~.era . Ukoliko podatke replikujete putem javne mree, postupak e tako
biti bezbed~IJI. Ako vam tre~aju zatiene veze, zasad je jedino reenje da nabavite
odgovaraJUCI proiZvod, kao sto je Stunnel.

Saetak
Repl~kovanje nije pogodno za. sve situacije, ali ako imate optereenu aplikaciju s
V~SOkJm vodnosom ,Izmeu broja operacija itanja j upisivanja podataka, to moe
b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Imajte u vidu da se izmene ne izvravaju na zavisnim serverima u isto vreme.
Svaka kopija tabele mora prelaziti iz jednog usklaenog stanja u drugo, ali uita
vanJe podataka sa razliitih servera moe dati zastarele rezultate dok se zavisni
serveri ne auriraju.
Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW
TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.

MAS~ER

STA-

Pitanja
l. Na MySQL serveru replikovanje se moe upotrebiti za

a) punjenje podacima razvojnog servera koji e sluiti za bezbedno testiranje


novih programa na stvarnim podacima
b) poboljavanje performansi
e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike
d) poboljavanje stepena raspoloivosti sistema
e) sve prethodno navedeno

218

Poglavlje 16 Replikovanje baze podataka

2. Datoteka dnevnika

VI

a) uvek postoji
b) korisna je za replikovanje i restauriranje podataka iz rezervnih kopija
e) zapravo je preimenovana SQL datoteka slike stanja
d) sve prethodno navedeno
3. Operacije itanja i upisivanja podataka

obino

se odvijaju

a)

itanje

na zavisnim serverima, upisivanje na zavisnim serverima

b)
e)

ita~e

na zavisnim serverima, upisivanje na glavnim serverima


na glavnim serverima, upisivanje na zavisnim serverima

itanje

Optimizovanje MySQL-a

d) itanje na glavnim serverima, upisivanje na glavnim serverima


e) nijedno od prethodnih
4. Replikovanje MySQL-ovih podataka

znai

a) su podaci uvek aurni


b) serveri moraju biti povezani preko pouzdane mree, a ako jedan od servera
postane nedostupan, drugi moraju da ekaju dok se on ponovo prikljui
e) izmene podataka su brze, ali je potrebno izvesno vreme dok se one preslikaju na sve zavisne servere
d) izmene podataka se mogu unositi na bilo kom serveru i prosleuju se glavnom serveru, a zatim svim ostalim zavisnim serverima

Odgovori
Pitanja
l. e
2. b
3. b
4. e

17 Optimizovanje MySQL servera

da

18 Optimizovanje baze podataka


19

Optimizovanje upita

17
Optimizovanje MySQL servera

RAZMOTRIEMO

MOGUNOSTI

OVOM POGLAVLJU
NEKOLIKO
ubrzavanja
MySQL servera. Podeavanje servera je opsena tema i ima izvesnih slinosti sa ezoterinom umetnou. Naa namera je da vam u ovom poglavlju predstavim o osnove
podeavanja servera. Obradiemo sledee teme:

Prevoenje i povezivanje koda radi


Podeavanje parametara servera
Podeavanje drugih

vee

brzine rada

inilaca

Najvanije je imati u vidu injenicu da za sve izmene koje uvodite na serveru


u cilju njegovog optimizovanja morate primeniti iskljuivo empirijski pristup. Pokuajte jednu po jednu izmenu i meri te performanse pre i posle nje. Jedino tako ete
utvrditi da li izmena koju ste nainili zaista poboljava performanse.
Ako elite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da due
vreme Uedan sat, jedan dan ili neki prosean period) beleite upite koji se izvravaju na
serveru i da zatim te iste upite ponovo izvrite na izmenjenoj konfiguraciji servera.

Prevoenje

i povezivanje koda radi

poveavanja

brzine rada
U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih verzija instalacionih datoteka (pomou alatke RPM na Unixu). Ako tek uite upotrebu
MySQL-a, to je svakako najjednostavniji nain, naroito ako nemate iskustva s prevoenjem softvera koji imate na svom raunaru, kao to je sluaj s veinom korisnika
Windowsa.
Performanse svog servera moete poboljati ako preuzmete izvornu verziju koda i
sami ga prevedete. Ukoliko imate raunar s procesorom Pentium koji radi pod operativnim sistemom Linux, postii ete primetno poboljanje performansi ako izvorni

1.22

t'oaesavanJe parametar.

Poglavlje 17 Optimizovanje MySQL servera

kod MySQL-a prevedete pomou prevodioca pgcc, koji optimizuje rezultujui kod
samo za procesor Pentium. (Tako dobijena izvrna datoteka nije kompatibilna sa
AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web
lokacije prevedena pomou prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da server moete ubrzati od 10% do 30% ako sami prevedete kod pomou odgovarajueg
prevodioca i pravilno podeenih opcija- vie informacija o tome nai ete u MySQL-ovoj dokumentaciji.
Drugo poboljanje u poreenju s MySQL-ovom gotovom izvrnom datotekom
jeste da prevedete MySQL s podrkom samo za skup (ili skupove) znakova koji nameravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugraena je
podrka za sve postojee skupove znakova. (Vie informacija o skupovima znakova
nai ete u poglavlju 12",Podeavanje MySQL-a" .)
MySQL-ova dokumentacija sadri predloge o optimizovanju binarnih datoteka
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim
grupama na Internetu posveenim MySQL-u moete nai miljenja i savete u vezi
s mnogim problemima specifinim za odreene operativne sisteme i prevodioce koda.
Arhive se nalaze na adresi
http://lists.mysql.com
Ukoliko elite da se pridruite diskusijama o prevodiocima, potraite forum na adresi
www.lukelaura.com

Podeavanje parametara servera


Da biste optimizovali svoju konfiguraciju, pokuajte da podesite parametre MySQL
servera.
Podseanja radi, tekue vrednosti parametara servera prikazaete na sledei nain:
show variables;
Uticaj tekuih vrednosti parametara na konfiguraciju servera
komande:

videete pomou

sle-

dee

show status;
Druga korisna alatka koja omoguava da vidite ta se dogaa na serveru jeste Perl
skript mytop, iji je autor Jeremy Zawodny.
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
~ta nje procesa, trajanje itd. Osim toga, ta alatka omoguava da prikaete detalje
MySQL-ovog procesa i vidite koji se upit izvrava.
Skript moete preuzeti sa adrese
http://jeremy.zawodny.com/mysql/mytop
Sve navedene alatke omoguavaju da evidentirate izmene koje ste uneli i uinke
koj e one imaju na sistem.

..

~rrv

11

Datoteka opcija my.cnf sadri toliko veliki broj opcija da ete se moda pitati
odakle da ponete. Uz veinu verzija MySQL-a dobijate i prime re datoteka my. en t ,
koje se obino nalaze u direktorijumu support-files instalacije. U tom direktorijumu
nai ete sledea etiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao poetnu datoteku op cijn
za svoj sistem.
Najvaniji parametri koje treba da podesite jesu oni koji odreuju kako MySQL
troi memoriju. Za svaki server baza podataka vai pravilo "to vie memorije, to
bolje", ali je vano i da ta memorija bude na raspolaganju serveru baze podataka i da
se pravilno raspodeljuje izmeu njegovih procesa.
MySQL odrava grupu internih bafera i ostava. Moete podesiti koliinu memorije
koja se odvaja za tu namenu. Dva najvanija parametra koja treba da podesite su
key_buffer_size i table_cache. Poto te bafere dele sve niti koje rade na serveru,
njihovo podeavanje ima veoma veliki uticaj na performanse servera.
U baferu nazvanom bafer za kljueve (engl. key buffer) uvaju se blokovi MyiSAM
indeksa. Kada aplikacija zatrai odreeni blok iz datoteke indeksa, on se uitava u taj
bafer. Kad god se izvrava neki upit, ako se odgovarajuu blok indeksa nalazi u baferu,
podaci se uitavaju iz njega. U suprotnom, blok indeksa mora da se uita iz datoteke
na disku u bafer za kljueve, to je, razume se, sporije. Za bafer kljueva vai pravilo da
to je vei, to bolje slui svojoj svrsi.
Kada razmatrate vrednost koju ete dodeliti parametru key_bu ff er_ s i ze, treba da
uzmete u obzir ukupnu koliinu memorije s kojom raspolaete, da li se raunar koristi
iskljuivo kao MySQL server ili slui i za druge poslove, a vana je i veliina datoteka
indeksa (tj. ukupna veliina .MYI datoteka).Jeremy Zawodny, poznati strunjak koji
odrava servere kompanije Yahoo!, preporuuje da na raunaru koji radi iskljuivo kao
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu izmeu 20% i
50% ukupne koliine memorije na raunaru . Ako je u pitanju deljen raunar, jasno je da
vrednost tog parametra treba da bude manja. Ukoliko podaci vaih indeksa zauzimaju
samo 20 MB, bilo bi besmisleno da veliinu bafera za kljueve podesite na 128 MB.
Imajte u vidu i to da se bafer za kljueve koristi iskljuivo za MyiSAM tabele. Za
druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
poveate bafer za kljueve ako, na primer, radite iskljuivo sa InnoDB tabelama. U
tom sluaju vaniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
uvaju se i podaci indeksa i podaci tabela. (Vie informacija o podeavanju za rad sa
InnoDB tabelama nai ete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
Drugi zaista vaan parametar je ostava za tabele (engl. table cache) kojom se upravlja
pomou opcije table_cache.Vrednost te opcije odreuje maksimalan broj tabela koje
mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su
zasebne datoteke u operativnom sistemu. Budui da je otvaranje i zatvaranje dato tc b
spora operacija, te datoteke ostaju otvorene dok ne budu izriito zatvorene, server spu
ten, ili dok ukupan broj otvorenih tabela ne premai vrednost parametra table_cache.

Poglavlje 17 Optimizovanje MySQL servera

Poveanje vrednosti parametra table_cache korisno je kada na serveru imate veliki


broj tabela. Budui da va operativni sistem ograniava ukupan broj otvorenih datoteka
u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik moe drati otvorene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego to izmenite vrednost parametra table_ cache.
Osim tih globalnih memorijskih bafera, pojedinim nitima se takoe dodeljuju
odreeni blokovi memorije- kao to su, na primer, bafer za sortiranje (engl. sort buffer)
i br.ifer za itanje (engl. read bulfer).Veliina tih b afera je jednaka za svaku nit, ali svaka nit
moe koristiti tu koliinu memorije za drugu namenu .
U bafer za itanje, ija se veliina odreuje parametrom read_buffer_size, smetaju se podaci iz tabele kada se njen sadraj ita sekvencijalnim redosledom (engl. table
sca11). to se vie podataka iz tabele moe smestiti u bafer, to e biti manji broj operacija itanja sa diska; meutim, ako je vrednost tog parametra previsoka, grupa bafera
za itanje koje niti koriste moe potroiti previe memorije. Moda se seate da se u
ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a veliinu muje
odreivao parametar record_buffer.
Bafer za sortiranje, iju veliinu odreuje parametar sort_buffer, koristi se pri
izvravanju upita koji sadre odredbu ORDER BY, tj. slui za sortiranje podataka. Ako
sorti rate velike koliine podataka, poveajte bafer za sortiranje, ali i za njega vai isto
upozorenje kao i za bafer za zapise.

Podeavanje drugih

inilaca

Na kraju, jo nekoliko saveta koji vam mogu pomoi pri podeavanju fizike konfiguracije sistema.
to se operativnog sistema tie, MySQL preporuuje Solaris kada elite da izvuete
maksimum od raunara s vie procesora. Iako postoje verzije MySQL-a za razne operativne sisteme, razvoj i poetno testiranje obavljaju se na Solarisu, zahvaljujui emu
bi to po logici stvari trebalo da bude najbolje optimizovana platforma.
Ukoliko moete da nabavite vie diskova, poboljaete performanse ako baze podataka rasporedite na razliite fizike diskove. U tom sluaju moete koristiti i RAID
konfiguracije - RAID O poboljava performanse pri itanju i pisanju, a RAID l ili 5
poboljavaju performanse pri itanju. Osim toga, SCSI diskovi obezbeuju bolje perfoJillanse od IDE diskova.
Moete razmotriti i upotrebu urnalskog sistema datoteka (engl.journalingjile
1ystc'111), kao to je Reiserfs ili XFS. Tako moete jo vie poboljati performanse.
Rnume se, znaajan boljitak moe se postii povezivanjem klijenata i servera preko
bt7C mree, to takoe vai i za glavne i zavisne servere u replikovanju.

Saetak
Budui
kii_JI~ll,

da je tema optimizovanja MySQL-a toliko opsena da zasluuje zasebnu


obavcwo nastavite s prikupljanjem informacija i istraivanjem te oblasti.

Performanse ete poboljati ako sami prevedete izvorni kod MySQI ,, 11 11 1


datoteku, naroito ako imate raunar koji radi pod Linuxom ili ima JlllH l'''"
Pentium.

illi

Podesite parametre servera za bolje performanse, naroito one koje sc odnosa


na potronju memorije. Velika koliina fizike memorije na raunaru uvek Jt'
korisna, ali je vanije kako se ona raspodeljuje. Evo nekoliko posebno va n ih
parametara:
key_buffer_size: Koliina memorije koja e biti odvojena za skladitenje
MyiSAM indeksa.
table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme.
read_buffer_size: Koliina memorije koja se koristi pri sekvencijalnom
itanju tabela.

..

sort_buffer: Koliina memorije koja se koristi za skladitenje podataka iz


tabela kada se pomou odredbe ORDER BY zahteva sortiranje podataka.
Poboljajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upotrebom urnalskog sistema datoteka i brze mree izmeu klijenata i servera, te
izmeu glavnih i zavisnih servera.

Pitanja
l. Parametar koji odreuje koliko
indeksa Inn oD B tabela je

memorije biti odvojeno za skladitenje

a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read_buffer_size
2. Parametar koji odreuje koliko
Inn oD B tabela je

memorije biti odvojeno za keiranje podataka

a) key_buffer_size
b) innodb_buffer_pool_size
e) innodb_key_buffer_size
d) read buffer size
3. Parametar koji odreuje koliko
My ISAM tabela je

a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
d) read_buffer_size

memorije biti odvojeno za keiranje podataka

Poglavlje 17 Optimizovanje MySOL servera

4. Parametar koji odreuje koliko e memorije biti odvojeno za keiranje podataka


My ISAM indeksa je

18

a) key_buffer_size

b) table_cache
e) innodb_key_buffer_size

Optimizovanje baze podataka

d) read_buffer_size
S. Vrednost parametra read_buffer_size ne bi trebalo da bude previsoka jer
a) ako vei broj niti sekvencijalno pretrauje tabele, imaete problem
b) uvek se moe dodati nov indeks, pa zato MySQL nee nikad morati da
sekvencijalno pretrauje tabele
e) time se rasipa prostor na disku
d) nijedno od prethodnog

Vebe
Eksperimentiite pomou programa za merenje performansi dok parametre navedene
u ovom poglavlju podeavate na razliite vrednosti. Moete li pronai optimalnu
vrednost svakog od tih parametara za svoj sistem?

Odgovori
Pitanja
l. b
2. b

3. d
4. a
S. a

U sledeem poglavlju
U sled eem poglavlju," Optimizovanje baze podataka", razmotriemo optirnizovanje
l' ll1 C baze podataka, indeksa i pojedinih tabela.

..

POGLAVLJU 17",0pimizovanje MySQL servera", opisali smo kako se server


podeava za optimalne performanse. U ovom poglavlju razmotriemo kako moete
optimizovati tabele baze podataka.
Standardna pravila i preporuke za strukture i normalizovanje tabela obino poboljavaju performanse. Postoje i drugi izbori koje moete napraviti kada projektujete
bazu podataka, zbog kojih e konani proizvod biti bri ili sporiji. U ovom poglavlju
razmotriemo te izbore.
Obradiemo sledee teme:

ta usporava MySQL-ove baze podataka


Napravite pravilne izbore pri projektovanju
Upotreba indeksa za optimizovanje performansi tabela
Komanda OPTIMIZE TABLE

ta usporava MySQL-ove baze podataka


Poto ste proitali prethodno poglavlje o optirnizovanju servera, moete prei na optimizovanje baze podataka. U narednom poglavlju baviemo se optirnizovanjem upita.
Ako ste optirnizovali server (moda ak po cenu ugradnje dodatnog hardvera), sledei korak je da razmotrite da li se bilo koja od navedenih taaka odnosi i na va slu aj :

Nemam dovoljno indeksa. Uzrok broj jedan loih performansi jeste upotreba tabela
kojima nije pridruen nijedan indeks ili nema indeksa za kolone koje pretraujete.To ne znai da treba imati to vei broj indeksa jer preterivanje u suprotnom
smeru moe biti uzrok sledeeg problema na listi.
Imam previe indeksa. Da bi se aurirao veliki broj indeksa, svaki put se u t:~ belu
upie nov red ili aurira postojei, a to potraje. Kada uitavate podatke, indeksi '> ll
veoma korisni. Kada upisujete nove redove, odnosno aurirate ili brit:lc pm111
jee redove, indeksi postaju problem. Kad god aurira te neki podatak, 11101 .q11 ~ ~
aurirati i indeksi, to produava obradu i poveava opteree nj e si slCill;l

ll

Poglavlje 1B Optimizovanje baze podataka

lnd~ksiranje

Dodeljujem prava pojedinano za tabele i kolone tabela. Ako prava dodeljujete pojedinano za tabele ili kolone bilo kog resursa, kad god korisnik poalje upit na izvravanje, MySQL mora da utvruje koja su sve prava za tabele i kolone tabela zadata.

Uk~hko .ste

Pravilni izbori pri projektovanju baze podataka


Postoji vie pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,
doprinose poboljanju njenih performansi. To su sledei:

Koristite zapise fiksne duine gde god je mogue. Ako su svi redovi tabele jednake duine, MySQL bre pristupa redovima u sredini tabele. Da bi tabela imala
redove fiksne duine, tipovi podataka u svim kolonama moraju biti fiksne duine.
To znai da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB.
Ako vam je neophodan tip TEXT i BLOB, moda biste mogli da denormalizujete
emu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu.
Ukoliko imate iskljuivo kolone tipa VARCHAR, razmislite o tome da ih zamenite
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju vie mesta
na disku, to je u suprotnosti s prvom preporukom na ovoj listi.
Gde god je mogue, deklariite kolone kao NOT NULL. Ako je priroda vaih
podataka takva da su vrednosti NULL sasvim logine i prihvatljive, slobodno ih
koristite. Meutim, imajte u vidu da zbog toga gubite malo brzine i prostora,
pa zato zadajte odredbu NOT NULL gde god je mogue.
Birajte tip tabela za svaku tabel u pojedinano. Tabele koje ne podravaju transakcije (na primer, My ISAM) manje optereuju sistem i zato su bre od tabela koje
podravaju transakcije (InnoDB i BDB). MySQL podrava meanje vie tipova
tabela u istoj bazi podataka. Izaberite najbri tip koji je pogodan za odreeni
posao. (Vie informacija o pojedinim tipovima tabela nai ete u poglavlju 9,

pratili gr:divo i vebe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1,1
pnmarne kljuceve. To znai da imate barem po jedan indeks za svaku tnbdll
~~r MySQL automatski pravi indekse za kolone koje deklariete kao PRIMARY KEY
1h UNIQUE.
,
~o pokuavat.e da optimizujete postojeu bazu podataka, korisno je ispitati da Ji ll'
u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je esta greka pri projekta
vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za odreenu tabelu.
Dakle, ta je indeks i emu slui?
Indeks je slian referentnoj tabeli po tome to omoguava da se brzo pronae odrce.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaenje traene vrednosti u
tOj ..kolo~l zna.tno je bre pomou indeksa. Indeks pokazuje gde se u tabeli nalazi red
kOJI sadrz1 tr~ze~u vredn~st, to omoguava da se direktno pree na taj red.
. Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretrauje jedan po
Jedan red tabele dok ne pronae redove koje ste zahtevali. Zamislite da morate da
pronae:e odree~u ten~u. u ovoj knjizi tako to ete poeti od prve stranice i itati
svaku ree na sv~kOJ stran1e1. ~na tn o je bre da u indeksu knjige potraite temu koja vas
zamma 1 da zat1m preete direktno na stranicu koja vam treba.
U MySQL-u se po.daci indeksa uvaju u obliku b-stabala (binarna stabla); to su
strukture podataka koje se vrlo brzo pretrauju.
. I~dek~i mogu o?~hvatati je~nu kolonu ili vie njih (isto kao kljuevi tabela). Pri
IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretrauje jedno od sledeih:
~adrz1

Struktura baze podataka nije optimalna. Postoje naini da se struktura baze podataka
projektuje tako da se upiti bre izvravaju.
U naredna dva odeljka razmotriemo strukture baze podataka i indekse koji omoguavaju ubrzavanje rada s bazom podataka.

Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima ete
raditi. Na primer, ako u koloni tabele uvate samo brojeve od 1 do 10, nemojte
zadati tip INT, ve tip TINYINT. to su krai redovi i manje tabele, to e se one
bre pretraivati. to su podaci manji, vie se redova moe keirati u memoriju.

..

Kolona kojoj _je pri~ruen jednokolonski indeks- na primer, ako je u tabeli


~epartments mdekmana kolona departmentiD i treba izvriti upit slian sledecem: SELECT .. . WHERE departmentiD=n.
Grupa

kolon~

za koju postoji zajedniki indeks - na primer, ako za tabelu


postoji indeks za kolone (client ID, employeeiD work1 treba izvriti upit slian sledeem: SELECT .. . WHERE client ID=~ AND

emplo~ee.ass1gnment
date)

employeeiD=y AND workdate=z .

Ko.lon~ ili grupa kolo.na koja je deo viekolonskog indeksa, pod uslovom da je to
levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assignment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on e biti
'
upotrebljen u upitima sledee vrste:
SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y

"Tipovi tabela u MySQL-u" .)


Izaberite odgovarajue indekse. Ovu temu obradiemo detaljno u narednom
odeljku.
U teim sluajevima, razmislite o denormalizovanju tabela da biste smanjili broj
spojeva koji se uspostavljaju u uobiajenim upitima. Budui da e zbog toga vaa
baza podataka postati nona mora za odravanje, to se najee ne preporuuje.

u cilju optimizovanja

Ali ne i u upitima nalik na

sledei:

SELECT ... WHERE employeeiD=y AND workdate=z

Sutina cele .~rie je u sledeem: ako predviate da e se izvravati veliki broj upita
kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
Izdate komandu CREATE INDEX da biste napravili odgovarajui indeks. Imajte u vidu
~ad

- r .. - - - .J- ----

---~-H-

Pitanja

da MySQL moe da koristi samo po jedan indeks po tabeli u upitu. Nije mogue
automatsko kombinovanje vie indeksa.
Ovo pitanje emo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita",
kada budemo doli do komande EXPLAIN.

Komanda ANALYZE TABLE


Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored kljueva u tabeli.
MySQL uva te podatke i koristi ih pri donoenju odluke o tome kako e spojiti
tabele u upitu. Komanda se izdaje na sledei nain
analyze table imetabele;

OPTIMIZE TABLE .

1. Koja je od sledeih tvrdnji o indeksima tana?


a) Indeksi zauzimaju previe prostora na disku i zato ih ne treba koristiti.
b) Ako tabeli nije pridruen nijedan indeks, upit se moe izvravati sporije.
e) Trebalo bi da indeksirate to vei broj kolona.
d) Nijedna od prethodnih.
2. Kada birate tipove podataka za kolone tabele
a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje
efikasnija
b) trebalo bi da koristite tipove podataka promenljive duine gde god je
mogue jer se tako optimizuje upotreba prostora na disku

Komanda OPTIMIZE TABLE


N a kraju, moramo pomenuti komandu
sintaksa izgleda ovako:

Pitanja

Njena vrlo jednostavna

OPTIMIZE TABLE imetabele;

To je MySQL-ov ekvivalent komande za defragmentiranje vrstog diska. Tokom


upotrebe baze podataka, u datotekama u kojima se uvaju podaci raste broj praznina
izmeu blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su
zapisi premeteni zato to su nakon auriranja postali vei. Te praznine su uzrok slabije
efikasnosti.
Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbrisali vee koliine podataka, ili ako ste dodali, izbrisali ili aurirali vei broj redova promenljive duine. Tako ete preurediti podatke u datotekama, ponovo sortirati indekse
i aurirati statistike podatke o tabeli.
U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele.

Saetak
Strukturu baze podataka moete optimizovati tako to ete odabrati tipove podataka manje veliine i fiksne duine, definisati odgovarajue indekse i koristiti
odgovarajue tipove tabela.
Indeksi omoguavaju brzo pronalaenje zapisa traenih na osnovu vrednosti u
indeksiranim kolonama.
Indeks e biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona
ili kolone, ili levi kraj grupe indeksiranih kolona.
Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju slinu defragmentiranju vrstog diska.

e) trebalo bi da koristite tipove podataka fiksne duine gde god je mogue da


biste ubrzali pristup podacima
d) nijedno od prethodnog
3. Kada birate tip tabela
a) uvek birajte InnoDB ili BDB zato to podravaju transakcije
b) uvek birajte MyiSAM zato to su najbre
e) koristite meavinu tipova, u zavisnosti od svrhe tabele
d) nijedno od prethodnog
4. Indeks nee biti upotrebljen ako se u upitu
a) koristi levi kraj grupe indeksiranih kolona
b) koriste sve kolone indeksa po redosledu razliitom od njihovog redosleda
u indeksu
e) koriste sve kolone indeksa po redosledu jednakom njihovom redosledu
u indeksu
d) koristi desni kraj grupe indeksiranih kolona
5. Upotrebite komandu OPTIMIZE TABLE
a) im definiete tabelu, da biste poboljali njenu strukturu
b) kada koristite InnoDB tabele, da biste smanjili optereenje sistema
e) nakon izvravanja veeg broja komandi SELECT nad tabelom
d) nakon izvravanja veeg broja komandi

DELETE

nad tabelom

- .~

...

~~ ---,J -----

1"" __ _ ...........

Vebe
U kojem e od sledeih upita u bazi podataka employee biti upotrebljeni indeksi?
(Potraite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tanu strukturu
baze podataka. Ili, ako ste je instalirali na svoj raunar, pogledajte pomou komande
describe koje su sve kolone indeksirane.)
a)
select *

19

..

Optimizovanje upita

from employee
where departmentiD=128;

b)
select employeeiD
from assignment
where clientiD=l;

e)
select skill, count(skill)
from employeeSkills
group by skill;

Ako ovi upiti treba da se

esto

izvravaju, koje biste dodatne indekse napravili?

Odgovori
Pitanja

OMOGUAVA

YSQL
DA ANALIZIRATE upit da biste saznali za koje se vreme
izvri i kako se tano izvrava nad sadrajem baze podataka. Na osnovu tih podataka
i poznavanja naina na koji MySQL pokuava da optimizuje upite, ponekad moete
da poboljate performanse upita. U ovom poglavlju razmotriemo sledee teme:

Otkrivanje sporih upita


Merenje performansi upita
Upotreba dnevnika sporih upita
Upotreba komande EXPLAIN za prikazivanje
ugraeni

l. b

MySQL-ov

2. e

Saveti o optimizovanju upita

naina

na koji se upiti izvravaju

mehanizam za optimizovanje upita

3. e

4. b

Otkrivanje sporih upita

S. d

Da biste optimizovali odreenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju
najvei udeo u ukupnom vremenu izvravanja. To moete obaviti na nekoliko naina:

Vebe

Posmatranjem: esto zakljuujemo daje neophodno optimizovanje zbog toga to


se odreeni upit izvrava brzinom premorenog pua.
Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije
izvravaju.
Uvidom u dnevnik sporih upita: U ovaj dnevnik belee se spori upiti, kao to biste
i oekivali na osnovu njegovog imena.

[ndeks se koristi samo u upitu pod takom b).


Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill.

U sledeem poglavlju
U s ledeem (i poslednjem) poglavlju, "Optimizovanje upita", razmotriemo kako
moete utvrditi da li se odreeni upit izvrava brzo ili sporo, i zbog ega, kao i to kako
reiti problem.

Poto identifikujete spori upit, pomou komande EXPLAIN moete saznati kako ga
MySQL tano izvrava da biste zatim pokuali da ga optimizujete.
Najee nije potrebno da ubrzate ba sve upite koji se koriste u aplikaciji . Obino
samo manji deo koda oduzima najvei deo ukupnog vremena izvravanja. Ukoliko
va sistem nije izuzetno optereen, besmisleno je da gubite vreme pokuavajui da
ubrzate delove aplikacije iji je udeo u ukupnom vremenu relativno mali.

upotreoa komande EXPLAIN za prikazivanje

Merenje performansi (engl. benchmarking) korisno je za reavanje svih vrsta problen:a


optimizovanja. Merenje performansi u ovom sluaju znai merenje vremena za koje
se upit izvri. Najbolje je da upit izvrite vie puta i da zatim izraunate proseno
vreme njegovog izvravanja. Budui da trajanje jednog izvravanja upita zavisi od
ukupnog optereenja sistema, samo jedno merenje moe dati neoekivane rezultate.
Otkriete i to da bi upit trebalo da se bre izvri kada ga pokrenete drugi put jer je
smeten u ostavu (ke).
Razume se, moete koristiti spoljne skriptove ili programe posebno napisane tako
da isti upit izvravaju vie puta. Ako vas zanima primer takvog programa, preuzmite
distribuciju MySQL-a sa izvornim kodom i potraite programe za merenje performansi u direktorijumu sql-bench.
U MySQL-u moete meriti brzinu izraunavanja vrednosti bilo kojeg izraza
(ukljuujui i upita) pomou ugraene funkcije BENCHMARK(). Na primer:
6*9);

Ova komanda daje rezultate nalik na

sledee:

+-------------------------+
l benchmark (1000000, 6*9) l
+-------- -----------------+
o l
+-------------------------+
1

row in set

(0.25

Upotreba komande EXPLAIN za prikazivanje


na koji se upiti izvravaju

sec)

Funkcija prihvata dva parametra: koliko puta treba izraunati vrednost izraza
(u ovom primeru, milion puta) i izraz koji se izraunava (u ovom primeru, est puta
deve0.

naina

Komanda EXPLAIN nalae MySQL-u da "objasni" kako namerava da izvri upit. Kao
jednostavan primer, moete zadati sledee:

..

Budui da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa

uvek vraa rezultat nula. Pri merenju nas zaista zanima za koje vreme se
upit izvrio. Iz navedenog primera rezultata vidi se daje izraunavanje proizvoda 6 x 9
milion puta na mom raunaru trajalo etvrtinu sekunde.
Funkciji BENCHMARK () moete proslediti i tekst upita, na primer:

BENCHMARK ()

selec t benchmark(lOOOOOOO,
'select employee.name, department.name
from employee, department
where employee.departmentiD=department.departmentiD');

Upotreba dnevnika sporih upita

na koji sc upili l1vr .!Valu

Beleenje sporih upita u dnevnik moete ukljuiti pomou opcije --log- slow
-queries=imedatoteke, koju zadate kada pokreete MySQL, ili u datoteci opcija.
Ako ukljuite i opciju --log-long-format, bie evidentirani i svi upiti pri ijem sc
izvravanju ne koristi nijedan indeks. To vam moe pomoi da lake utvrdite emu
treba da f>osvetite najvie panje pri optimizovanju.
Zadavanjem vrednosti promenljivoj long_query_time odreujete ta je za vas
spor upit. Moete je zadati u konfiguracionoj datoteci ili pomou komande SET.
Vrednost te promenljive izraava se u sekundama.
Dnevnik sporih upita moete itati neposredno jer je to obina tekstualna datoteka.
Moda ete smatrati korisnijim saet spisak upita koji se sporo izvravaju. Takav spisak
moete prikazati pomou skripta mysqldumpslow (u direktorijumu scripts instalacije
MySQL-a). Poto je to skript napisan na jeziku Perl, ako koristite Windows, morate
prethodno instalirati Perl ukoliko gaj o nemate. (Preuzmite ga sa adrese www. activestate. com.)
Jedno od tekuih ogranienja MySQL-ajeste to da ne belei spore upite ije
izvravanje traje manje od sekunde. Na sistemima koji obrauju relativno veliki broj
jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator e
moda eleti da zna kojim je upitima potrebno vie od desetinke ili nekog drugog dela
sekunde. To e biti obezbeeno u jednoj od buduih verzija MySQL-a.

Merenje performansi upita

select benchmark(lOOOOOO,

naina

explain
select e.name, d.name
from employee e, department d
where e.departmentiD = d .departmentiD;
Kao to vidite, ispred jednog sasvim obinog upita samo smo dodali re EXPLAIN.
Zbog toga se upit nee izvriti,jedino e se prikazati podaci o tome kako MySQL planira da izvri upit. Trebalo bi da se prikau rezultati nalik na sledee:
... --- +------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+
1 id 1 select_type 1 table l type
l possible_keys l key
l key_len l ref
l rows l Extra l
+---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+
l l l SIMPLE
l e
l ALL
l NULL
l NULL
l
NULL l NULL
l
5 l
l
l d
l eq_ref l PRI MARY
l PRIMARY l
4 l e. department ID l
l l
l
l 1 l SIMPLE
+--- -+------ ------ ------- -+--- ---- -+-------------- -+-------- -+--------- +--------------- -+----- -+------ -+

2 rows in set (O. OO sec)


v

Pomou dnevnika sporih upita moete utvrditi koji se upiti presporo IzvrsavaJU. S~nu

ddiniete ta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU
vrednost.

ta sve ovo tano znai? Uoljivo je da se u skupu rezultata pojavljuje po jedan red
za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim e tabele biti spo
jene u upitu.

uyraaen1 mehamzam optimizovanja upita

y-'u'--uv

Tabela rezultata ima sledee kolone:

Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:

id Redni broj. Ako jedan upit sadri vie komand1 !.J EI .EC" I' - 11,1 JliiiiH:I, bd.1
je u upit ugraen podupit- svaka komanda SELECT dobtj.l SV<~J rLdni broj .
select type Vrsta komande SELECT koja se izvrava. U ve ini s lu ajeva, ova
kolona ~adrae re SIMPLE, kao u prethodnom primeru, to zna i daje u pitanju
sasvim obian upit SELECT. Ako imate podupite, spoljni upit e biti oznaen
reju PRIMARY a unutranji upiti bie oznaeni reima SUBSELECT ili DEPENDENT
SUBSELECT u sluaju koreliranih upita.
table Ime tabele na koju se red odnosi.
type Ovo je najvanija kolona pri optimizovanju i prikazuje na koji e nain
tabela biti spojena s drugim tabelama u upitu.
possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se re

ref Iz tabele e biti uitani svi redovi koji sadre vrednosti jednake vrednostima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
radite s kljuevima ije vrednosti nisu jedinstvene .

NULL.
key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nijedan, u koloni se prikazuje re NULL.
key len Duina indeksa koji je MySQL odluio da upotrebi.
ref Vrednost s kojom se poredi sadraj kolone kljua pri odluivanju koji se
redovi izdvajaju u skup rezultata upita.
rows Pro cena broja redova koje e MySQL morati da proita iz jedne tabele da
bi se dobio rezultat upita. Mnoenjem vrednosti broja redova moete utvrditi
koliko e redova biti uitano. Time dobijate red veliine brzine izvravanja upita.
Extra Ova kolona moe sadrati dodatne podatke. Na primer, komentar
using index zai da MySQL moe u potpunosti uitati rezultate upita iz jednog
od indeksa i nema potrebe da uitava podatke iz tabele.
Dakle, ta nam rezultati govore u ovom primeru?
Tip spoja ALL za tabelu employee znai da e biti pretraeni svi redovi te tabele.
Razume se, to e biti spora operacija ako tabela sadri veliku koliinu podataka. U
stvari, spoj tipa ALL je najgori mogui rezultat. Njega ete dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. Oigledna optimizac4ija u tom sluaju jeste da dodate odgovarajui indeks. To je objanjeno u nastavku ovog poglavlja.
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, to znai da
e se iz tabele department uitati po jedan red za svaki red iz tabele employee. To je
jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i
cons t, to znai da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da
sc zato ta tabela moe tretirati u upitu kao konstanta. Tekui tip spoja u upitu prilino
nam odgovara.

range Ovaj tip spoja je slabiji od tipa eq_ref , pa


tabele biti uitani svi redovi iz odredenog opsega.

a k

i od ref, a znai da

iz

index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spojeva. Kada se prikae tip index, to znai da e biti pretraen ceo indeks. To je
bolje od pretraivanja cele tabele, ali daleko je od savrenog.
Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department
prikazana je opcija PRI MARY i ime kolone primarnog kljua, to je kolona kljua koja
e biti upotrebljena. Red tabele employee sadri vrednost NULL u obe navedene
kolone, to znai da nema kljua koji se moe upotrebiti i zato nee biti upotrebljen
nijedan. To je jo jedna prilino jasna naznaka da tabeli treba dodati nov indeks!
Na osnovu tih podataka i pod pretpostavkom da e taj upit biti relativno esto
izvravan, pa bismo zbog toga eleli da bude bri, napraviemo sledei indeks:
create index ename_did on employee(name, departmentiD);
Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako:
+--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- --------- ---- -
l id l select_type l table l t ype
l possible_keys 1 key
l key_len l ref
1 rows 1 Extra
1
+--- ---- ---------- +----- --+-- -- --- ------ --------- -+-- -------- -+-------- - +------- ------- --+----- -+----- ------- -+

l
l

l
l

l
l

SIMPLE
SIMPLE

l
l

e
d

l
l

index
eq_ref

l
l

NULL
PRIMARY

l
l

ename_did
PRIMARY

l
l

85
4

1 NULL
1
l e.departmentiD l

S
l

l
l

Using index

l
l

+---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+
2 rows in set (0. OO sec)

Promene su oigledne. U redu tabele employee sada stoji daje tip spoja index jer
postoji indeks koji se moe upotrebiti. Novi indeks je naveden kao mogu klju , ali
nee biti upotrebljen. U koloni Extra stoji da e za tu tabelu biti upotrebljen indeks
umesto same tabele, zahvaljujui emu bi trebalo da upit bude neto bri.
Najea upotreba komande EXPLAIN jeste za utvrivanje da li biste pomou bolje
osmiljenih indeksa mogli da ubrzate upite, ali otkriete da se to moe postii i na
druge naine.

MySOL-ov

ugraeni

mehanizam optimizovanja upita

MySQL prim.enjuje na upite vie pravila optimizovanja.


Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL
utvruje koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova procena pogrena, odredbom STRAIGHT JOIN izriito zadajte redosled spajanja tabela.
Merenjem performansi upita pre i posle te izmene, utvrdiete da li time stvari pobolj
avate ili pogoravate.
Kada bira indeks, MySQL trai odgovarajui indeks koji obuhvata manje od 30"/u
redova tabele. Ako ne uspe da pronae indeks koji ispunjava te uslove, sekvenCIJalno
pretrauje tabelu. (To je vidljivo iz rezultata komande EXPLAIN za prethodni pttiiH"I
upita, nakon dodavanja novog indeksa.)

18

Poglavlje 19 Optimizovanje upita

Izrazi u odredbama WHERE optimizuju se na nain slian onome na koji mnogi prevodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvine
zagrade. To je jedan od razloga zbog kojih moete slobodno dodavati zagrade u tekst
upita da bi postao lake razumljiv.
Ako se potpun rezultat upita moe dobiti iz podataka sadranih u indeksima, iz
tabela se nee u itati nijedan red. Rezultat funkcije COUNT ( *} takoe se dobija bez
itanja i prebrojavanja redova tabele jer su podaci potrebni za tu namenu smeteni
odvojeno od tabele (u indeksu).
Budui da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija
koje MySQL obavlja, ovde ga nismo ponovili. Ali ak i taj spisak nije potpun. Ako vas
zanima kako radi optirnizator upita, moete itati njegov izvorni kod.

Preporuke za optimizovanje upita


Postoje tri najvanije stvari koje moete uraditi da biste optimizovali svoje upite:
Dodajte odgovarajue indekse. Ako imate upit nad neindeksiranom kolonom koji se esto izvrava, dodajte indeks za tu kolonu. Vie informacija o tome
kako MySQL koristi indekse nai ete u poglavlju 18, "Optimizovanje baze
podataka". Meutim, ne zaboravite sledee: iako odgovarajui indeks moe
ubrzati postupak pronalaenja podataka u tabeli, odravanje indeksa u aurnom
stanju produuje upisivanje podataka. Nemojte dodavati indekse koji se nee
koristiti.
Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana
u poglavlju 18.) Time aurirate podatke o raspodeli vrednosti kljueva koje
MySQL uva. Na osnovu tih podataka, MySQL odreuje redosled spajanja
tabela u upitu. Ako vam se ini da MySQL spaja tabele udnim redosledom,
pokuajte s komandom ANALYZE TABLE.
Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u
poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i aurirate statistike podatke o tabeli koje koristi optimizator upita.

1. funkcija BENCHMARK () vraa

a) rezultat izraza ije izvrav;liiJL' llll'JII


b) vreme potrebno za izvravanJL' lllollol ~"JI 1111 JilL
e) nulu, bez obzira na ulazne JW .IIIH'IIl'
d) nijedno od prethodnog
2. Izdali ste k?mandu EXPLAIN za odredeni up1t 1 11 ~ 11 10111 1 YI' 1, ,j 11 ,
dob1h ste t1p spoja ALL. To znai

111

1 1 d orl

pomou

funkcije

BENCHMARK (}

ili dnevnika sporih upita.

Pomou komande EXPLAIN utvrdite kako se upiti izvravaju


Ubrzajte izvravanje upita dodavanjem indeksa a zatim ih ponovo ispitajte
pomou komande EXPLAIN.
Komande ANALYZE TABLE i OPTIMIZE TABLE pomoi e MySQL-ovom optimizatoru upita da dobro obavi svoj posao.

a) da e iz tabele biti uitan samo jedan IL'd


b) d~ e ~z tabele biti uitani svi redovi koji sadre vredu osti JL'd. 111 kt VHdnn
st1ma mdeksa
e) da e biti sekvencijalno pretraen ceo indeks
d) da e biti sekvencijalno pretraena cela tabela
3. Izd~i ste k?man~u EXPLAIN za odreeni upit i u koloni type jedne od tabela
dob1h ste t1p spoja eq ref. To znai
a) da e iz tabele biti u itan samo jedan red
b) d~ e ~z tabele biti u itani svi redovi koji sadre vrednosti jedanke vrednostlma mdeksa
e) da e biti sekvencijalno pretraen ceo indeks
d) da e biti sekvencijalno pretraena cela tabela
4. Izda.li ste k?mandu EXPLAIN za odreeni upit i u koloni type jedne od tabela
dob1h ste t1p spoja index. To znai
a) da e iz tabele biti uitan samo jedan red
b) da e ~z tabele biti uitani svi redovi koji sadre vrednosti jedanke vrednoStlma mdeksa
e) da e biti sekvencijalno pretraen ceo indeks
d) da e biti sekvencijalno pretraena cela tabela
S. ~ezultati komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimalmm redosledom. Zbog toga bi trebalo da

Saetak
Otkrijte spore upite

Pitanja

a) izdate komandu ANALYZE

TABLE

za obe tabele

b) izriito zadate redosled spajanja pomou odredbe


e) ili a) ili b)
d) ni a) ni b)

STRAIGHT JOIN

240

Poglavlje 19 Optimizovanje upita

Spisak termina

Vebe
Pogledajte

sledei

upit:

select department.name
from client, assignment, employee, department
where client.name='Telco Inc'
and client.clientiD = assignment.clientiD
and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD;

Pomou funkcije BENCHMARK vie puta izmerite vreme izvravanja ovog upita

i pomou komande EXPLAIN utvrdite kako se on izvrava. Proverite da li moete


poveati brzinu izvravanja dodavanjem novog indeksa i ponovnim merenjem.

korienih

alijas
atribut, obeleje
b-stablo
bafer za itanje
bafer za kljueve
bafer za sortiranje
bafer za zapise
blokiranje sledeeg

Pitanja
1. e
2. d
3. a
4. e

5. e

alias
attribrtle
b-tree
read bt!!Jer
key br"!!fer
sort br!ffer
record br!lfer
next key /ocking

kljua

itanje

Odgovori

u knjizi

sadraja tabele
sekvencijalnim
redosledom
datoteka slike sta~a
Dekartov proizvod
dnevnik greaka
dnevnik izmena
dnevnik sporih upita
dnevnik upita
fantomski podaci
funkcionalna
zavisnost
glavni server
jednakovredni spoj
jezik za definisanje
podataka
jezik za rad
s podacima
kandidati za kljueve
klju

koeficijent povezanosti s traenim


poJmOm
kolona
korelira n
maina za skladitenje
merenje performansi
n-torkc
nebitne rei

table scan

dumpfile
Cartesian product
error log
binary log
slow query log
query log
phantom reads
functional
dependency
master
equijoin
Data Diftnition
Language, DDL
Data Manipulation
Language, DML
candidate keys
key
relevance value

nedelji vost
niti izvravanja
obeleje, atribut
ostava za tabele
otpornost sistema
na greke
podu pit
polje
ponititi
potvrditi
preklapanje izmeu
dva servera
"na vrue"
prenosni dnevnik
pretraiva~e

re/ay log
stemming

optereenja

red
sistem za upravljanje
relacionim bazama
podataka
slog, zapis
spoJ
spoljni klju
superklju

SVEUCIIlNA l<Nl\N\0\
Rl J

subquery
field
roll back
commit
fa ilo ver

od korena
full join
pun spoj,
unakrsni spoj
multimastering
rad sa vie glavnih
servera istovremeno
rasporeivanje
load balancing

ema baze podataka


tabela
ugneen upit
unakrsni spoj,
pun spoJ
zapis, slog
zavisni server

column
correlated
storage engine
benchmarking
tup/es
stop words

atomicity
thread s
attribute
table cache
fau/t tolerance

KA

row
Relational Database
Management
System, RDBMS
record
join
foreign key
superkey
database schema
table
nested query
full join
record
slave

Indeks
Simboli
l (deljenje), operator, 110

= (jednako), operator, 111


(karet), znak, 116
<(manje od), operator, 111
\ (obrnuta kosa crta), 67
-(oduzimanje), operator, 110
+ (sabiranje), operator, 110
; (taka i zarez), 46
>(vee od), operator, 111
$(znak za dolar),116
* (zvezdica), 110, 116
A

Brojevi
1NF (prva normalna forma),
34-36
2NF (druga normalna forma),
36-37
3NF (trea normalna forma),
37-38

A
abs(), funkcija, 118
ACID

usklaenost,

transakcije,

149-150
activestate.com, Web lokacija, 235
adddate(),funkcija, 119
administriranje baze podataka
datoteke dnevnika, 183
MySQL server, pokretanje
i sputanje, 177-178
pranjenje ostava, 182-183
prikazivanje podataka o bazi,
178-180
prikazivanje podataka
o dodeljenim pravima, 181
prikazivanje podataka
o procesima, 181
prikazivanje podataka o tabelama,
181-182
prikazivanje statusa servera
i vrednosti serverskih
promenljivih, 180
skript mysqladmin,lista opcija,
184
unitavanje niti, 182
alijasi, komanda SELECT, 82-83
ALL, pravo, 160
ALL, rezervisana re, 102
ALTER TABLE, komanda, 56-57
ANALYZE TABLE, komanda, 230,
238
AND, operator, 112
anomalije
pri auriranju podataka, 34
pri brisanju podataka, 34
pri dodavanju podataka, 33

anonimni nalozi, brisanje, 17,

202-203
ansi, opcija, podeavanje

MySQL-a, 172
ANY, rezervisana re , 102

aplikacije, provera ulaznih


podataka, 204
aritrnetiki operatori, 110
atributi, tabele baze podataka, 31
AUTO INCREMENT, rezervisana
re, 49-51
autocornmit, reim rada

transakcija, 147
AVG ROW LENGTH, opcija,
optirnizovanje tabela, 51
avg(), funkcija, 122
auriranje redova tabela, 72-73

B
BACKUP TABLE, komanda, 194
bafer za itanje, 224
bafer za kljueve, definicija, 223
bafer za sortiranje, 224
baferi, 223
basedir, opcija, podeavanje
MySQL-a, 172
baze podataka
adtninistriranje
datoteke duevuika, 183
MySQL server, pokretmlje
i spuftmlje, 177-17 8
pra:bljetlje ostava, 182-183
prikazivmlje podataka o bazi,

178-180
prikazivmlje podataka o
dodeljeuim pravima, 181
prikazivmlje podataka o procesima
181
'
prikazivanje podataka o tabelama,
181-182
prikazivatlje statusa servera
i vreduosti serverskih
promeuljivih, 180
servers ke promeuljive, pode!avatlje,
182
skript mysqladmiu, lista opcija,
184
utli!tavarlje uiti, 182
biranje, 43
brisanje, 56
entiteti, definicija, 29
identifikatori
dozvoljeu broj zuakova, 43
rwvoduici, 43
rezervismJe reli, 43
indeksi
brismlje, 56
izrada, 55-56

izrada rezervnih kopU.1 i


restauriranje podatak:l
komauda BACKUI'TilBL/i,

194
komauda RESTORE TABLI'
194
.
mogubwsti, 187-188
pomo{u duevuika iz meua,
194-195
mi1o, 19 3-194
skript mysqldump, 188-192
skript mysqlhotcopy, 192- 193
tabele, proveravmlje i popravljmljc,
195-198
testirmlje rezervtle kopije, 195
zaklju{avatlje tabela, 18 8
izrada, komanda CREATE
DATABASE, 43
komanda ANALYZE TABLE
230

optimizovanje
iudeksi, 229-230
izbori pri projektovarlju, 228
komat~da OPTIMIZETABLE
230

preporuke, 227-228
principi projektovanja
auomalije, 33-34
twrmalizovatlje, 3 4-3 8
NULL vreduosti, 34
reduudmlttwst i gubljetlje
podataka, 33
vaua pitmya, 32
relacije
d~f/uiciia, 29
tipa ,Jeda tl prema jedau", 2 9
tipa .,jeda tl prema viJe", 2 9
tipa" vie prema vi!e 11, 2 9
rep likovanje
beziJedtlostle mere, 211
budt.tbwst, 216
d11evuik izmwa, 21 O
dodeljivatlje prava za, 211
kopije teku{eg stmya, pravljerye,
212-214
otpomost Ila gre!ke, 209
preklapatlje servera 11a vm{e, 217
pri11cipi, 209-21 O
provera glavtwg servera, 2 12
rasporeivatlje opterdetlja, 2 15
upotrebljive verz;;e MySQLtt,
210
vifestn1ki glav11i serveri, 2 17
zavistti serveri, pode!mm1~je
i pokretmlje, 2 14
sistem za upravUanjc rci.Ki<lllllll
bazama podat.1k.1
(RDBMS),11
ema, dcfinkJ-, l~

Indeks

tabele

ALTER TABLE, 56
atribwi, 31
BerkeleyDB (BDB), 50, 135
brisanje, 5 6
fimkcioualne zavisnosti, 32
gmptw r111ofenje podataka, 73-75
HEAP, 50, 138
indeksi, 229-230
lmwDB, 50, 134-135
ISAM, 50, 128-129
kljuevi, 31
ko/otre, 31, 52-55, 80
komanda CREATETABLE,
48-52
MERCE, 136-137
merge, 50
MylSAM, 50, 129-134
uovi redovi, umeta11je, 65-69
n-torke, 31
podrfka za tramakcije, 127-128
pod11piti iji Je rezultat Jedna
vrednost, tao-t 01
podupiti za izraze logitkog tipa,
101-103
podupiti za izvedme tabele, 1OO
pra"", 161-164
prav!ietife, 44-52
preimeiiOIJ(Itife, 57
redovi, 31
redovi, azurirmife, 72-73
redovi, brismife, 7Q-72
redovi, brismife pomou koma11de
TRUNCATE, 72
redovi, drtpliralli, 84-86
redovi, uita""tife, 83-84
redovi, zameua, 70

redovi rezulltZta upittr,gmpismye,

86-87
spa)m!je, 95-99
stnrktura, metifmife, 56-57
zada""ife imena u kommrdi
SELECT, 81-82
zapisi, 31
zadavanje apsolutnih in1ena.,
81-82
BCNF (Boyce-Coddova normalna
forma), 38
DDB (Berkeley), tip tabela, 50, 135
benchmark(), funkcija, 121, 234
llcrkeleyDB (BDB), tip tabela, 50,
135
IIIGINT, celobrojni tip podataka,
53
hin, dlrektorijum, 20
IIINARY, rezervisana re, 111
hir<~ nje
b.t7C podataka, komanda use, 43
u itavanje podataka iz redova
tn bela, 83-84
DLOB, tip podataka, 54
Doyce-Coddova normalna forma
(DCNF),38
hrh<~njc

.11tnn11nr11h naloga, 17, 202-203


h.".1 p<><b t,,ka, 56

indeksa, 56
redova iz tabela, 7Q-72
tabele, 56
brisanje redova, komanda

TRUNCATE, 72
brojevi s pokretnim zarezom, 48
b-stabla, 135

e
CASE, funkcija, 113
cast, funkcija, 120
ceiling(), funkcija, 118
celo brojni tipovi podataka, 52
CHAR, tip podataka, 53
CHECK TABLE, komanda, 196
CHECKSUM, opcija,
optimizovanje tabela, 51
ciklina

promena datoteka

dnevnika, 183
column_priv, kolona

tabela columns_priv, 164


tabela tables_priv, 164
colum.ns_priv, tabela, prava

pristupa, 164
COMMENT, komanda
optimizovanje tabela, 51
conv(), funkcija, 114
convert(), funkcija, 120
count(), funkcija, 122
CREATE, pravo, 159
CREATE DATABASE, SQL-ova
komanda, 43
CREATE TABLE, SQL-ova
komanda, 44, 48-52
CREATE TEMPORARY TABLES,
pravo, 159
CSV format, 75
curdate(), funkcija, 119
curtime() funkcija, 119

datumski tipovi podataka, 54


dayname(), funkcija, 119
db, tabela, prava pristupa, 163
DDL (Data Definition Language),
42
Decimal, tip podataka, 52
DEFAULT, odredba, komanda
INSERT,69
DEFAULT, rezervisana re, 49
defragmentiranje MyiSAM tabele,
130
DELAY KEY WRITE opcija,
optimizovanje tabela, 51
DELAYED, odredba, komanda
INSERT, 68
DELETE, komanda, 7Q-72
DELETE, pravo, 159
deljenje (/),operator, 110
describe, komanda, 48

desni spoj, 98-99


dinamike MyiSAM tabele,
129-130
DISTINCT, odredba, komanda
SELECT, 84-86
DML (Data Manipulation
Language), 42, 65
dnevnici
aktiviranje, 183
dnevnik greaka, 183
log-bin, opcija, podeavanje
MySQL-a, 172
log-error, opcija, podeavanje
MySQL-a, 172
log-slow-queries, opcija,
podeavanje MySQL-a, 172
opcije za dnevnike izmena,

podeavanje MySQL-a, 173


prenosni, 21 O
sporih upita, 183, 234-235
u Linuxu, 183
upita, 183
dnevnik izmena

D
data, direktorij um, 20
Data Definition Language (DDL),
42
DATA DIRECTORY, opcija,
optimizovanje tabela, 51
Data Manipulation Language
(DML), 42, 65
datadir, opcija, podeavanje
MySQL-a, 172
DATETIME, tip podataka, 55
datoteke
dnevnika, 183
slike stanja, 188
datoteke opcija, podeavanje
MySQL-a, 169-171
internacionalizovanje, 174
konfiguracione opcije za vie
inst.:llacija na istom raunaru,
173-174
mysqld, podeavanje opcija za,
171-172
opcije za InnoDB, 172-173

opis, 183
rep! ikovanje, 21 O
restauriranje baze podataka,
194-195
does, direktorij um, 20
dodeljivanje prava, 157
globalna prava, 160
prava za administratore, 159
prava za obine korisnike, 159
tabele prava, 161
za pojedinane baze podataka, 160
za pojedinane kolone, 161
za replikovanje, 211
dolar($), znak, 116
DOUBLE, tip podataka, 53
drop database, komanda, 45, 56
DROP INDEX, komanda, 56
DROP TABLE, komanda, 56, 191,
194
DROP, pravo, 160
druga normalna forma (2NF),
36-37
dupli rani redovi, 84-86

E
Ernie Application Cluster, alatka,
217
encrypt(), funkcija, 121
entiteti,definicija,29
ENUM, tip podataka, 54
EXECUTE, pravo, 159
EXISTS, rezervisana

re,

102

EXPLAIN, rezervisana re, podaci


o izvravanju upita, 235-237
extra, vrednost, komanda

EXPLAIN, 236
extract(), funkcija, 119

F
fantomski podaci, nivo
izolovanosti transakcija, 151

FIELDS, odredba, komanda


LOAD DATA INFILE, 74
FILE, pravo, 160,203
filtriranje ulaznih podataka,
bezbednosne preporuke, 204
FLOAT, tip podataka, 53
float, tip podataka, 48
floor(), funkcija, 118
FLUSH, komanda, pranjenje
ostava, 182-183
FLUSH PRIVILEGES, komanda,
202-203
FLUSHTABLES, komanda, 137,
193
FOREIGN KEY, rezervisana re,
50
found rows(), funkcija, 121
fragmentacija, My ISAM tabele,
130
FROM, odredba
podupiti, za izvedene tabele, 100
spojevi, 94
FULLTEXT rezervisana re, 50
funkcije
abs(),118
addda te(), 119
avg(), 122
benchmark(), 121 , 234
CASE, 113
cast, 120
ceiling(), 118
concat(), 114
convert(), 114,120
counc(), 122
curdate(), 119
curtime(), 119
dayname(), 119
encrypc(), 121
extract, 11 9
floor(), 118
found rows(), 121
grupne, 121-122
IF, 113
last insert id(), 121
length(), 114
LIKE,115
load file, 114
locate(), 114

lower(), 114
MATCH,115
max(),122
md5(),121
min(), 122
mod(),118
now(),119
numerike, 117-118
operatori
aritmetitki, 11 O

logitki, 112
za poredetife vred11osti, 11 Q-112
password(), 121
power(), 118
quote(), 114
rand(), 118
replace(), 114
RLIKE,115-117
round(),118
soundex(), 114
sqrt(), 118
std(), 122
STRCMP,115,117
subdate(), 119
substring(), 114
sum(), 122
timestamp, 119
trim(),114
ugraene, 109
upper(), 114
z.'l rad s datumima i vremen itna,
119-120
za rad sa znakovnim vrednostima

obrada zuakovuih vreduosti, 114


poredenje ztrakovuih vred11osti,
115-117
za upravljanje tokom izvrlavanja,
113
funkcije za rad s datumima
i vremenima, 119-120
funkcije za upravljanje tokom
izvravanja, 113
funkcionalne zavisnosti, koncepti

i terminologija, 32

G
glavni serveri, replikovanje,
podeavanje, 209-212, 215
globalna prava
dodeljivanje, 160
zatita servera, 202
Google, Web lokacija, 135
GRANT, komanda
odredba IDENTIFIED BY, 158
odredba ON,158
odredba REQUIRE, 159
odredba TO, 158
odredba WITH, 159
odredba WITH GRANT
OPTION,159
grantor, kolona, tabela tables_priv,
164
GROUP BY, odredba, komanda
SELECT, 86-87
grupisanje redova rezultata upita,

86-87

grupnt luni. t
grupno

ll, l J l l

ttOHINtlt pn1l11ltt~n,

gubljenjo (llHiucul.,, l
redunduutuwt.sunJ
baza pothohol.u, l l

ktn

~~~J

H
Hafmanovo kodirnnjt,
komprimovanjt. litlwl1t, l' l

HAVING, odredba, konmnolu


SELECT, 87
HEAP, tip tabela, 50, 138
host, tabela, prava pristupa

kolone za opseg vidljivmu, l (1 ,\


kolone za prava, 163

I
id, opcija, komanda EXPLAIN,
236
IDENTIFIED BY, odredba,
komanda GRANT, 158
identifikatori
maksimalan broj znakova, 43
navodnici, 42
razlikovanje malih i velikih slov:1,
42
rezervisane rei, 43
IF, funkcija, 113
IF NOT EXISTS, odredba, 49
IGNORE, odredba
komanda INSERT, 69
komanda LOAD DATA IN FILE,
74
komanda UPDATE, 72
IN, rezervisana

re,

101

indeksi
brisanje, 56
izrada, 55-56
jednokolonski, 229
levi kraj grupe, 229
optimizovanje baze podataka, 227,
229-230
optimizovanje upita, 238
viekolonski, 229
INDEX, rezervisana re, 50
INDEX, pravo, 159
index, vrednost, komanda

EXPLAIN, 237
INDEX DIRECTORY, opcija,
optimizovanje tabela, 51
InnoDB, konfiguracione opcije,

podeavanje MySQL-a,
172-173
lnnoDB, tip tabela, 50
dosledno uitavanje bez
zakljuavanja pod1caka, 134
transakcije, 143-146

ACID uskladeuost, 149-/50


izolo""11ost tmn<akcij11, 150- 152
reZi lli lltOCOrtllllit, J47- /49
uslovi licence, 135
Web lokacij.t, 135
zakljuavanje pud.t1.t~.1

rcd.t, 13-1

11,1

IIIVnll

Indeks

INSERT, komanda
listing, 6S-66
odredbe, 68-69
opti oblik, 68
primer rezultata, 67
INSERT, pravo, 1S9
INSERT METHOD, opcija,
optirnizovanje tabela, S1
instaliranje MySQL-a
anonimni nalozi, brisanje, 17
lozinka korisnika root, zadavanje,
17
na Linux, 12
naOSX,14
naWindows,12-14
nalozi, pravljenje za uobi~ene
poslove, 17-18
podeavanje sistema, 14-16
provera da li sistem radi, 16-17
instalirane datoteke, zatita

filtriranje podataka, 204


ftzika zatita, 20S
preporuke, 203
pristup i prava upotrebe, 204
provera ulaznih podataka
u aplikaciji, 204
SSL (Secure Sockets Layer), 20S
internacionalizovanje, podeavanje

MySQL-a,174
ISAM tabele, SO
ogranienja, 129
pregled, 128
izbori pri projektovanju,
optimizovanje baze
podataka, 228
izolovanost, nivoi (transakcije),
1SO
fantomski podaci, 1S1
prljavi podaci, 1S2
read committed, 1S1
read uncommitted, 1S2
repeatable read, 1 SO
serializable, 1SO
izrada

baze podataka, komanda


CREATE DATABASE, 43
HEAP tabela, 138
indeksa, SS-S6
kopije tekueg stanja,
replikovanje, 212-214
naloga, za uobiajene poslove,
17-18
tabele
komanda CREATE TABLE,
44, 48-52
opcije za optimizovanje, 51
primer baze podataka employee,
44-48
izrada rezervnih kopija i
restauriranje podataka

komanda BACKUPTABLE,194
komanda FL USH TABLES, 193
komanda LOCKTABLES,193
komanda R.ESTOR.ETABLE,
194
mogu nosti, 187-188

hill

pomou

dnevnika izmena,

194-19S
razlozi, 1 87
runo, 193-194
skript mysqldump
nedostaci, 192
opcija --add-drop-table, 191
opcija --add-locks, 191
opcija --all-databases, 192
opcija --allow-keywords, 192
opcija --d, 192
opcija --databases, 192
opcija --extmded-imert, 191
opcija --lock-tables, 192
opcija --no-data, 192
opcija --opt, 18 8
opcija --quick, 191
predtwsti, 192
primer rezultata, 188-191
skript mysqlhotcopy, 192-193
tabele, proveravanje i popravljanje
komanda CHECKTABLE, 196
kommzda REPAIR TABLE, 196
mogunosti, 195
program myisamchk, 196-198
program mysqlcheck, 197
zakljuavanje tabela, 188
testiranje kopije, 19S
izvrive datoteke, MySQL-ove,
20-21

J
jednako (=), operator, 111
jednakovredni spojevi, 97
jednokolonski indeksi, 229

K
kandidati za kljueve, 31
karet (A), znak, 116
key, vrednost, komanda

EXPLAIN, 236
key_len, vrednost, komanda

EXPLAIN, 236
kljuevi, kandidati za kljueve
i superkljuevi, 31
kolone tabela
datumski i vremenski tipovi
podataka, S4
kljuevi, superkljuevi, 31
numeriki tipovi podataka, S2-S3
opcija unique, SO
tabela baze podataka, 31
tabela columns_priv, 164
tabela db, 163
tabela host
kolone za opseg vidlj"ivosti, 163
kolone za prava, 163
tabela tables_priv, 164
tabela user
kolone za ograni{avonje upotrebe
resursa, 162
kolone za opse.(! vidlj"ivosti, 162

kolone za pravo, 162


kolatze za uspostavlj"anje zaftiene
veze, 162
uitavanje podataka iz odredenih
kolona, 80
znakovni i tekstualni tipovi
podataka
BLOB, 54
CI-JAR, 53
ENUM, 54
SET, 54
TEXT, 54
VARCHAR,54
kolone za ograniavanje upotrebe
resursa, tabela user, 162
kolone za uspostavljanje zatiene
veze, tabela user, 162
komande. Videti i naredbe

ALTER TABLE, S7
ANALYZE TABLE, 230,238
CHECKTABLE,196
COMMIT, transakcije, 147
drop database, 4S, S6
DROP INDEX, S6
DROPTABLE,S6,194
EXPLAIN, 23S-237
FLUSHTABLES,137, 193
FLUSH, pranjenje ostava,
182-183
LOCKTABLES,148-149,193
OPTIMIZE TABLE, 130, 230,
238
REPAIR TABLE, 130,196
R.ESET, pranjenje ostava,
182-183
SET
aktiviranje datoteka dnev11ika,
183
reim autocommit, isklj'u{ivmije,
147
SHOW,23,180
START TRANSACTION, 147
UNLOCKTABLES, 148-149
komprimovanje
concatQ, funkcija, 114
MyiSAM tabele, 131
kopije tekueg stanja, pravljenje,
212-214
korisniki interfejsi
MySQL Control Center, 21
MySQL monitor, 21-23
phpMyAdmin, 21
korisniki nalozi. Videti i prava
anonin1ni nalozi, brisanje,
202-203
anonimni, brisanje, 17

bezbednost
auouinwi Halozi, brismije, 17
pravljenje za uobi~ene poslove,
instaliranje MySQL-a,
17-18
zatita
attmzinwi ualozi, brisanje,
202-203
lozi11kd z a tzalo_q root, 202
opmm1 JlhH.~tr, 20.1
.(i(toiW/JI' lo i11kl, ?OJ

L
last insert id(), funkcija, 121
length(), funkcija, 114
levi spoj, 98-99
LIKE, funkcija, 11S
LIKE, odredba, 49
LIMIT, odredba
komanda DELETE, 72
komanda SELECT, 88-89
komanda UPDATE, 72
LINES, odredba, komanda LOAD
DATA INFILE, 74
Linux, instaliranje MySQL-a na, 12
listinzi

baza podataka, formiranje tabela,


44-4S
instaliranje MySQL-a,
konfiguracione opcije,
14-16
izrada rezervnih kopija i
restauriranje podataka,
skript mysqldump, 188-191
MERCE tabele, 136-137
podeavanje MySQL-a, reenje s
datotekom opcija, 169-171
primer komande INSERT, 6S-66
LOAD DATA INFILE, komanda,
73-7S
load file(), funkcija, 114
locate(), funkcija, 114
LOCK TABLES, komanda,
148-149,191,193
LOCK TABLES, pravo, 1S9
logiki operatori, 112
logiko tekstualno pretraivanje,
133-134
long_query_time, promenljiva
(dnevnik sporih upita), 23S
LOW PRIORITY, odredba
komanda DELETE, 72
komanda INSERT, 68
komanda LOAD DATA INFlLE,
74
komanda UPDATE, 72
lower(), funkcija, 114
lozinke
ifrovanje, 203
za nalog root, 17, 202

M
maksimalan broj znakova,

identifikatori, 43
manje od (<),111
MATCH, funkcija, 11S
max(), funkcija, 122
mdS(), funkcija, 121
MEDlUMINT, celobrojni tip
podataka, S3
mcrenje performansi, upiti, 234

MERGE, tip tabela, 136-137


merge, tip tabela, SO
MIN ROWS, opcija,
optimizovanje tabela, S1

min(), funkcija, 122


mnoenje (*),operator, 110
mod(), funkcija, 118
My ISAM, tip tabela, SO
dinamike, 129-130
komprimovanje, 131
poboljanja u odnosu na ISAM
tabele, 129
popravljanje, 130
pregled, 129
statike, 129-130
tekstualno pretraivanje, 131-134
myisamchk, ala tka za komandnu
liniju, 130
myisamchk, program, 20, 196-197
MySQL
instaliranje, 9, 11
auonimtzi tuzlozi, brisanje, 17
lozi11ka korimika root, zadava11je,
17
Ila U11ux, 12
na OS X, 14
11a Windows, 12-14
nalozi, pravlj"e11je za uobi{ajene
poslove, 17-18
podefavo1zje sistema, 14-16
provera da li sistem radi, 16-17
izvrive datoteke, 20--21
korisniki interfejsi
MySQL Control Ce11ter, 21
MySQL mo11itor, 21-23
phpMyAdmi11, 21
podeavanje
I111zoDB, 172-173
itttemacioualizovanje1 17 4
kot!figuraciol!e opcije za vife
instalacija tUJ istom raluuant
173-174
mysqld, podefavo1zje opcija za,
171-172
refetzje s datotekom opcija,
169-171
1

opcija --cxtcndd ""'"" l 'J l


opcija --lock- tabl,.,, l 1!2
opcija --no- dara, IIJ2
opcija --opt, 188
opcija --quick, 191
prednosti, 192
primer rezultata, '188 l 'J l
mysqlhotcopy, skript, 192 l 9.1
mysqlshow, program, 20

N
naredbe. Videti i komande
ALTER TABLE, S6
DROP TABLE, 191
FL USH PRIVILEGES, 202 20.1
GRANT,1S8-1S9
LOAD DATA INF! LE, 73-7S
LOCK TABLES, 191
ON, komanda GRANT, 1S8
R.EVOK.E, ukidanje prava
pristupa, 161
SELECT, izraela tabela, S2
SET, podeavanje promenljivih,
182
show processlist, niti, 181
show variables, 180
SQL-ove
CREATE DATABASE, 43
CREATETABLE, 44, 48-52
DELETE, 7{}-72
INSERT, 68-69
REPLACE, 70
SELECT, 8{}-89
TRUNCATE, 72
UPDATE, 72-73
UNLOCK,191
use, biranje baze podataka, 43
navodnici, identifikatori, 43
nebitne rei, tekstualno

pretraivanje, 132
niti, unitavanje, 182
normalizovanje

server

pokretarzje i spuftmzje, 177-17 8


prikazivanje podataka o procesima
181

server, optimizovanje

parametri servera, 222-224


RAm diskovi,prepomka, 224
Solaris, preporuka, 224
struktura direktoriju ma, 19-20
MySQL Control Center, 21
MySQL monitor, 21-23
mysqladmin, program (skript), 20,
184
mysqlbinlog, program, 20
mysqlcheck, program, 197
mysqld, podeavanje opcija za,
171-172
mysqldump, skript, 20
nedostaci, 192
opcija --add-drop-table, 191
opcija --all-databases, 192
opcija --allow-keywords, 192
opcija --databases, 192

Uoyce-Coddova normalna forma


(BCNF),38
definicija, 34
druga normalna forma (2NF),
36-37
prva normalna forma (1 NF),
34-36
trea normalna forma (3NF),
37-38
NOT NULL vrednost, izrada
tabela, 49
NOT, operator, 112
now(), funkcija, 119
n-torke, koncepti i tertninologijn,

31
NULL, vrednost
izrada tabela, 49
operatori za porcdcnjc vttdlln,t<.
110--111
projektovanjc """' pod.u.tk.t, H
numerike funkclJ, 117 liH
nutncri~ki

tipovi putlut1'""' 1\

'\ \

Indeks

o
obrnute kose crte (\), 67
odredbe
DEFAULT, komanda INSERT
69

DELAY ED, komanda INSERT,


68
DISTINCT, komanda SELECT
84-86

FIELDS, komanda LOAD DATA


IN FILE, 74
FROM
spojevi, 94
11 podupitima za izvedme tabele,
100
GROUJ> BY, komanda SELECT,
86-87
HAVING, komanda SELECT, 87
IDENTIFIED BY, komanda
GRANT,158
IF NOT EXISTS, 49
IGNORE
koma11da INSERT, 69
koma11da LOAD DATA
INFILE, 74
komanda UPDATE, 72
LIKE,49
LIMIT
komanda DELETE, 72
koma11da SELECT, 88-89
koma11da UPDATE, 72
LINES, komanda LOAD DATA
INFILE, 74
LOW PRIORITY
koma11da DELETE, 72
komanda INSERT, 68
koma11da LOAD DATA
INF/LE, 74
koma11da UPDATE, 72
ON, komanda GRANT, 158
ON DUPLICATE KEY
UPDATE, komanda
INSERT,69
ORDER BY
komanda DELETE, 72
koma11da SELECT, 87
komanda UPDATE, 72
redovi tabele, 57
QUICK, komanda DELETE, 72
RENAME, tabele, 57
REQUIRE, komanda GRANT,
159
'f'O, komanda GR.ANT, 158
WIIERE
km11a11da SELECT, 83-84
koma11da UPDATE, 72
.<fll>jevi, 94--95
WITII, komanda GRANT, 1S9
oduzimanje (-),operator, 110
ON DUPLICATE KEY UPDATE,
odredba, komanda INSERT,
69
opcija MAX ROWS,
optitnizovanjc tabela, St

OpenSSL, biblioteka, Web lokacija,


205
operatori
aritmetiki,

11 O
112
ugraeni, 109
za poredenje vrednosti, 110-112
OPTIMIZE TABLE, komanda,
130, 230, 238
optirnizovanje
baze podataka
i11deksi, 229-230
izbod pn" projektova11ju, 22 8
korna11da OPT/M/ZE TABLE,
230
prepon1ke, 227-228
izrada tabela, Sl
MySQL servera
parametri servera, 222-224
RAID diskovi, prepomka, 2 2 4
Solaris, 224
r;brzavanje, prevodet!ie i
povezivatife, 221-222
upiti
d11ev11ik sporih upila, 234--235
dodmxuife i11deksa, 238
koma11da ANALYZE TABLE,
238
koma11da EXPLAIN, 235-237
koma11da OPTIMJZETABLE,
238
meretife peiformaiiSi, 234
spori upiti, otkrivatife, 233
ugrae11 meha11izam
optimizovatifa upita, 237-238
OR, operator, 112
OS X, instaliranje MySQL-a na, 14
ostave, pranjenje, 182-183
logiki,

otpornost na greke, replikovanje,

209
ovlaenja,

za replikovanje, 211

p
PACK KEYS, opcija,
optirnizovanje tabela, 51
parametri servera, tehnike

optirnizovanja, 222-224
password(), funkcija, 121
PASSWORD, opcija,
optirnizovanje tabela, 51
phpMyAdrnin, korisniki interfejs,
21
pid-file, opcija, podeavanje
MySQL-a, 173
podaci, grupno unoenje, 73-75
podeavanje MySQL-a
instaliranje, 14-16
internacionalizovanje, 174
konfiguracione opcije za vie
instalacija na iston1 raunaru,
173-174
mysqld, podeavanje opcija za,
171-172
opcije za lnnoDB, 172-173
reenje s datotekom opctja,
169 171

pod upiti
iji je rezultat jedna vrednost,
100-101
vrste, 99
za izraze logikog tipa,101-103
za izvedene tabele, l OO
pokretanje
MySQL servera, 177-178
zavisnih servera, 214

popravljanje i proveravanje tabela


komanda CHECK TABLE, 196
komanda REPAIR TABLE 196
mogunosti, 19S
'
program myisamchk, 196-197
program mysqlcheck, 197
popravljanje My!SAM tabele, 130
poreenje s dokerskim znacima,
funkcija UKE, 115
poredenje s regularnim izrazima,
funkcija RLIKE, 115-117
poreenjc sa opsegom vrednosti,
operatori za poreenje, 112
possible_keys, vrednost, komanda

EXPLAIN, 236
power(), funkcija, 118
prava

doddjivanje, IS7
global11a prava, 160
prava za admi11istmtore, 159
prava za obil'11e korist~ike, 159
za pojedi11a1'11e baze podataka,
160
za pojedit1111'11e kolo11e, 161
za pojedi11abte tabele, 161
FILE, 203
prikazivanje podataka o, 181
PRO CESS, 203
tabele, 160,161
tabela colunms_priv, 164
tabela db, 163
tabela host, 163
tabela tables_priv, 164
tabela user, 162
ukidanje, 161
~ITH GRANT OPTION, 203
zasuta

global11a prava, 202


koma11da FLUSH
PR/V/LEGES, 202-203
opast1a prava, 203
veze sa serverom, 201
prava, za replikovanje, 211
preimenovanje tabele, 57

preklapanje na vrue, replikovanje,


217
prenosivost, My ISAM tabele, 129
pre nosni dnevnik, 21 O
pretraivanje

MyiSAM tabele,131-134
tekstualno pretraivanje, 131-134
PRIMARY KEY, rezervisana re, 49
principi projektovanja, baze
podataka
anomalije
NULL vred11osti, 34
pri auriraty'u podataka, 34
pri hrisanju podataka, J 4
fiti dm/m;wju p<>rlataka, JJ

normalizovanje

Boyce-Coddova twrmal11a forma


(BCNF), 38
dn<ga llormalllajorma (2NF),
36-37
prva twrmalt~ajorma (1 NF),
34--36
trea 11ormalllajorma (3NF},
37-38
redundantnost i gubljenje
podataka, 33
vana pitanja, 32
pristup datotekama,
ograniavanje, 204
prljavi podaci, nivo izolovanosti
transakcija, 152
PROCESS, pravo, 160, 203
promenljive, podeavanje
serverskih, 182
prostor na disku, My!SAM tabele,
130
provera (testiranje)

tabela baze pod.u,tka, konnpu


i terminolo~-:ija, 31
uitavanje, H3- H4
umetanje u t.tbdu, !.S ()\1
zamenjivanje, 70
redundantnost i gubljenje
podataka, projektovanje baza
podataka, 33
ref, vrednost, komanda EXPLAIN,
236
REFERENCES, pravo, 160
relacije
definicija, 29
tipa ,j ceb n prema jedan", 29-30
tipa ,jedan prema vie", 29-30
ttpa "vie prema vie", 29-30
RELOAD, pravo, 160
RENAME, odredba, 57
REPAm TABLE, komanda, 130,
196
repeatable read, nivo izolovanosti

range, vrednost, komanda


EXPLAIN, 237

transakcija, 150
replace(), funkcija, 114
REPLACE, komanda, 70
REPLICATION CLIENT, pravo,
160
REPLICATION SLAVE, pravo,
160
replikovanje baze podataka
bezbednosne mere, 211
budunost, 216
dnevnik izme na, 21 O
dodeljivanje prava za, 211
hijerarhijski organizovani glavni
serveri, 21S
kopije tekueg stanja, pravljenje,
212-214
otpornost na greke, 209
podeavanje zavisnih servera, 214
preklapat~e servera na vrue, 21 7
principi, 209-210
provera glavnog servera, 212
sloenije topologije, 21S
upotrebljive verzije MySQL-a,
210
viestruki glavni serveri, 217
zavisni serveri, pokretanje, 214
REQUIRE, odredba, komanda
GRANT,159
RESET, komanda, pranjenje
ostava, 182-183
RESTORE TABLE, komanda, 194
REVOKE, komanda, 161

rasporeivanje optereenja,

rezervisane

instalacije MySQL-a, 16-17


rezervnih kopija, 19S
provera ulaznih podataka
u aplikacijama, 204
proveravanje i popravljanje tabela
komanda CHECK TABLE 196
komanda REPAIR TABLE, 196
mogunosti, 19S
program myisamchk,196-197
program mysqlcheck, 197
prva normalna forma (1NF),
34-36
puni spojevi, 97

Q
QUICK, odredba, komanda
DELETE, 72
quote(), funkcija, 114

R
RAID diskovi, preporuka, MySQL
server, tehnike

optimizovanja, 224
RAID TYPE, opcija,
optimizovanje tabela, 51
rand(), funkcija, 118

replikovanje, 215
razlikovanje malih i velikih slova,
identifikatori, 43
RDBMS (relational database
management system), 31
read uncommitted, nivo
izolovanosti transakcija, 152
redovi
auriranje, 72-73
brisanje, 70-72
brisanje, komanda TRUN CATE
72

duplikati, 84-86
grupisanje, 86-87

rei

ALL,102
ANY,I02
AUTO INCREMENT, 49
BINARY,III
EXISTS, 102
FOREIGN KEY, SO
FULLTEXT, SO
IN,IOI
!NDEX,50
PRI MARY KEY, 49
ROLLBACK, 146
SOME, 102
TEMPORARY, 49
UNIQUE, SO
UNSIGNED, 52

rczervia11e rei, kun lchntlllklltnrl


43
l
RLIKE, lunkdjn, 11 ~ 117
ROLLBACK, rezt'rvhmrm t4~l', l.ff 1
root, nalog, lozinkn :ru, 17, lfP
round(), funkcija, II H

ROW FORMAT, opcija,


optimizovanje ta be In,~ l
rows, vrednost, kon1nndn

EXPLAIN, 236
RPM datoteke, instaliranje
MySQL-a iz, 12
runa izrada rezervnih kopija
i obnavljanje podataka,
193-194

s
sabiranje(+), operator, 110
sarnospojevi, 96

scripts, direktorijum, 20
Secure Sockets Layer (SSL), 205
SELECT, komanda
alija.1i, 82-83
kolone, 80
izrada tabela, S2
odredba DISTINCT, 84-86
odredba GROUP BY, 86-87
odredba HAVING, 87
odredba LIMIT, 88-89
odredba ORDER BY 87
odredba WHERE, 83..:_84
opti oblik, 80
primer jednostavnog upita, 80
tabele, 81-82
zadavanje baze podataka, 81-82
SELECT, pravo, 159
select_type, opcija, komanda
EXPLAIN, 236
serializable, nivo izolovanosti
transakcija, 150
serveri

glavni, u replikovanju, 209-212,


21S
MySQL
pokretarye i spt<ftatife, 177-178
prikazivatife podataka o procesimtl,
181
pdkazivatife statusa, 180
tehuike oplimizovatifa, 221-224
zavisni
pokretmife, 214
u replikovatifu, 209-21 O, 214
Services, prozor (Windows
Administrative tools), 179
SET, komanda
datoteke dnevnika, aktiviranje,
183
reim autocommit, isklju ivanje:,
147
serverske promenUivc,
podeavanje, l !!2
SET, tip podataka, 54
shared-mcmory-ban-nnw,
opcija, podcJnvnllJt
MySQL-n, 173
SHOW, konmntln, ll, l Hil
SHOW DAT/\111\SI , l"'"''' l \1

1\1

IIIUI:II.)

show processlist, komanda, 181


show variables, komanda, 180
SHUTDOWN, pravo, 160
sistemi za upravljanje relacionim
bazama podataka (RDBMS),
31
skupovi znakova, podeavanje
MySQL-a,
internacionalizovanje, 174
Slashdot, Web lokacija, 135
Sleepycat, Web lokacija, 135
slow_queries, serverska
promenljiva, 180
SMALLINT, celobrojni tip
podataka, 52
socket, opcija, podeavanje

MySQL-a, 173
Solaris, preporuka, MySQL server,
tehnike optirnizovanja, 224
SOME, rezervisana re, 102
soundex(), funkcija, 114
spojevi tabela

desni spojevi, 98-99


dve tabele, spajanje, 93-95
jednakovredni, 97
levi spojevi, 98-99
puni spojevi, 97
samospojevi, 96
unakrsni spojevi, 97
vie tabela, spajanje, 95-96
sputanje MySQL servera, 177-178
sql-bench, direktorij um, 20
SQL-ove komande

CREATE DATABASE 43
CREATE TABLE, 44,48-52
DELETE, 70-72
INSERT, 65---<i9
REPLACE, 70
SELECT, 80-89
TRUNCATE, 72
UPDATE, 72-73
sqrt(), funkcija, 118
SSL (Secure Sockets Layer), 205
START TRANSACTION,
komanda, 147
statike MyiSAM tabele, 129-130
std(), funkcija, 122
STRCMP, funkcija, 115,117
struktura direktorijuma,
MySQL-ova, 19-20
subdate(), funkcija, 119
substring(), funkcija, 114
tum (), funkcija, 122
SUPER, pravo, 160
upcrkljuevi, 31

lemn, definicija, 32

t.1bcla columns_priv, 164


tabela tables_priv, 164
tabele db, 163
tabele host, 163
tabele user, 162
Jifrovanje lozinki, 203

T
tabele

BerkeleyDB (BDB), 50,135


grupno unoenje podataka, 73-75
HEAP,50,138
indeksi
jedrwkolonski, 229
levi kraj grupe, 229
optimizovm~e, 229-230
vifekolomki, 229
lnnoDB,50
dosledno uitavanje bez
zak(iu{avanja podataka, 13 4
tramakcije, 14 3-146
uslovi licence, 13 5
Web lokacija, 13 5
zak(iu{avanje podataka na 11ivou
reda, 134
ISAM,50
ogrmli{enja, 128-129
pregled, 128
izrada
komanda CREATE TABLE
44, 48-52
'
opcije za optimizovanje, 51
primer baze podataka employee,
44-48
kolone
datumski i vrememki tipovi
podataka, 5 4
numeriki tipovi podataka, 52-53
opcija unique, 50
uitavanje podataka iz odredenih
kolo11a, 80
znakovni i tekstualni tipovi
podataka, 53-5 4
komanda ALTER TABLE 56
komanda BACKUP TABLE 194
komanda DROPTABLE 194
komanda FLUSH TABLES, 193
komanda LOCKTABLES, 193
komanda RESTORE TABLE
194

menjanje strukture, 56-57


MERGE, 136-137
MERGE, komanda FLUSH
TABLES,137
MylSAM,SO
dinamike, 129-130
komprimovane, 131
pobo(ifanja u odnosu rw ISAM
tabele, 129
poprav(imije, 13 O
pregled, 129
statike, 129-130
tekstualtw pretraivarije,
131-134
podrka za transakcije, 127-128
podupiti za izraze logikog tipa,
101-103
podupiti za izvedene tabele, 1OO
prava, 160,161
tabela cohmuiS_priv, 164
tabela db, 163

tabela host, 163


tabela tables_priv, 164
tabela user, 162
preimenovanje, 57
prikazivanje sistemskih podataka
o, 181-182
proveravanje i popravljanje
komanda CHECKTABLE, 196
koma11da REPAIR TABLE, 196
mogubwsti, 195
program myisamchk, 196-197
program mysqlcheck, 197
redovi
auriranje, 72-7 3
brisatije: 70-72
brismije pomou komande
TRUNCATE, 72
duplikati, 84-86
grupisarije, 86-87
u{itavarije, 83-84
umetatije, 65-69
zamma, 70
spajanje
deSili spojevi, 98-99
dve tabele, 93-95
jedt~akovred11i spoj, 97
levi spojevi, 98-99
ptmi spojevi, 97
samospojevi, 96
UllakrSIIi spojevi, 97
vife tabela, 95-96
tabele baze podataka, 31
tip merge, SO
uitavanje podataka iz, 81-82
upiti iji je rezultat jedna vrednost,

100-101
zakljuavanje,

188

tabele, podrka za transakcije

BerkeleyDB (BDB), 135


lnnoDB
dosled11o u{itavanje bez
zakiju{avarija podataka, 13 4
uslovi licettce, 13 5
l#b lokacija, 13 5
zak(iu{avmije podataka 11a 11il.<lu
reda, 134
tipovi tabela, 127-128
tabele prava, kolone

tabela db, 163


tabela host, 163
tabele user, 162
table, vrednost, komanda
EXPLAIN, 236
table_cache, parametar, 223
tables_priY, tabela, prava pristupa,
164
taka i zarez (;),znak, 46
tekstualni i znakovni tipovi
podataka za kolone

BLOB,54
CHAR,53
ENUM,S4
SET,S4
TEXT,54
VARCIIAJ1..,54

tekstualno pretraivanje
logiko,

133-134
MylSAM tabele, 131-134

TEMPORARY, rezervisana re 49
TEXT, tip podataka, 54

threads_connected, serverska
promenljiva, 180
~m estamp(), funkcija, 119
ttmestamp, kolona, tabela
columns_priv, 164
TIMESTAMP, tip podataka, 55
TINYINT, celo brojni tip
podataka, 52
tipovi podataka, float, 48
TO, odredba, komanda GRAN~
158

trajnost podataka, transakcije, 150


transakcije

definicija, 143-146
START TRANSACTION
komanda, 147
'
u lnnoDB tabelama, 143-146
ACID uskladerwst, 149-150
izolova11ost tramakcija, 150-152
reim autocommit, 147-149
trea

normalna forma (3NF),


37-38
trim(), funkcija, 114
TRUN CATE, komanda, 72
type, vrednost, komanda

EXPLAIN, 236

u
ubrzavanje MySQL servera,
221-222
ugraen

podupiti
iji je rezultat jed t ta vredttost,
100-101
vrste, 99
za izraze logikog tipa, 101-103
za izvedeue tabele, 1OO
spojevi tabela
deSili spojevi, 98-99
jedtwkovredr~i, 97
levi spojevi, 98-99
ptmi spojevi, 97
samospojevi, 96
spajanje vife tabela, 95-96
unakrSIIi spojevi, 97
uppercase(), funkcija, 114
uptime, serverska promenljiva, 180
USAGE, pravo, 159
use, komanda, biranje baze
podataka, 43
user, opcija, podeavanje
MySQL-a, 172
user, tabela, prava pristupa

kolone za ograniavanje upotrebe


resursa, 162
kolone za opseg vidljivosti, 162
kolone za prava, 162
kolone za uspostavljanje za.ltiene
veze, 162
usklaenost

podataka, transakcije,
150
uslovi licence, InnoDB tabele, 135
uspostavljanje veze s bazom

podataka

MySQL, testiranje, 16-17


SSL (Secure Sockets Layer), 205
zatita servera, 201

mehanizam

optirnizovanja upita, 237-238


ugraene funkcije/operatori, 109
ukidanje prava pristupa, 161
umetanje novih redova u tabelu
65-<i9

unakrsni spojevi, 97
UNION, opcija, optirnizovanje
tabela, 51
UNIQUE, rezervisana re, SO
UNLOCK TABLES komanda,
148-149
UNLOCK TABLES, komanda, 191
UNSIGNED, rezervisana re, 52
UPDATE, komanda, 72-73
UPDATE, pravo, 159
upiti

dnevnik, 183
komanda SELECT, 80
optimizovanje

drtev11ik sporih upita, 234-235


dodava1ije i11deksa, 238
kommtdaANALYZE, 238
koma11da EXPLAIN, 235-237
komm1da OPTIMIZETABLE
238

meretije peiformami, 234


spori upiti, otkrivatije, 233
"~~mden 111eluwizam
optimizovmija upita, 237-238

v
V~CHAR, tip podataka, 54
vece od(>), 111
viekolonski indeksi, 229
viestruki glavni serveri,
replikovanje, 217
vremena, funkcije za rad s
datumima i vremenima
119-120

vremenski tipovi podataka za


kolone, 55

w
Web lokacije

activestate.com, 235
Google,135
lnnoDB,135
OpenSSL, 205
Slashdot, 135
Sleepycat, 135
Yahoo!, 135
WHERE, odredba

komanda SELECT, 83--84


komanda UPDATE, 72
spojevi, 94-95

Windows 1\<loululoltll 1
prozor St~rvlt, l IM
Windows, lm! olhoonf 1\h 1
na,12-14
WITH, odredbu, kmmu11lt
GRANT, 159
WITH GRANT 1''1'11 IN,
odredba, komandu l .ll i\ N 1
159
l
WITH GRANT OP1'10N, l"" .,,
160,203

X
XOR, operator, 112

y
Yahoo!, Web lokacija, 135
YEAR, tip podataka, 55

z
zakljuavanje

podataka na nivou
reda, lnnoDB tabele, 134
zakljuavanje podataka na nivou
stranice, BerkeleyDB (BDB)
tabele, 135
zakljuavanje tabela, 188

zamena redova, 70

zapisi, tabele baze podataka,


. koncepti i terminologija, 31
zastlta
instalirane datoteke

jiltrirmije podataka, 204


zaftita, 205
preporuke, 203
pristup i prava upotrebe, 204
provera ulaz11ih podataka u
aplikaciji, 204
SSL (Secure Sockets Layer), 205
korisniki nalozi
mwuinmi nalozi, brisanje,
202-203
lozi11ka za 11alog root, 202
opas11a prava, 203
!ifrovatije lozi11ki, 203
sistem prava pristupa
veze sa serverom, 201
sistema pri replikovanju, 211
fizika

zavisni serveri

pokretanje, 214
u replikovanju, 209-210,214
zlonamerni korisnici, zatita, 205

znakovni i tekstualni tipovi


podataka, 53-54

LIKE, funkcija, 115


MATCH,funkcija,115
obrada znakovnih vrednosti, 11 4
RUKE, funkcija, 115
STRCM P, funkcija, 115, 117
zvezdica (*),znak, 116

You might also like