You are on page 1of 131

Pregledan uvod u korišćenje MySQL-a


- sistema za rad sa bazama podataka 1 1 n/ oo
MySQLje sistem za upravljanje relacionim bazama podataka otvorenog
koda , čija popularnost brzo raste. Poznat po brzini, pouzdanosti i lakoći
upotrebe, MySQL se pokazao kao naročito pogodan i za početnike
i L.a iskusne programere jer omogućava izradu sofisticiranih Web lokacija
i ap likacija koje rade sa bazama podataka.
Priručnik za MySQL daje jasan i sažet uvod u osnovne koncepte i tehnike
upotrebe MySOL-a,. Čitaocu koji j e početnik u MySOL-u omogućava da
pravi i administrira•složene baze podataka koje može koristiti kod kuće,
na poslu ili na Webu.
Bez obzira na to da li ste početnik u oblasti baza podataka ili iskusan
profesionalac koji želi da sazna više o tome kako radi MySQL, Priručnik
za MySOL će vam efikasno pružiti sve informacije koje su vam potrebne
da biste započeli 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 inženjerstvo i elektronsko trgovanje, na RMIT
univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji
Tangl ed Web Design, koja je osvojila više nagrada za svoje projekte dina-
mički h Web lokacija na kojima se koriste PHP i MySQL. Često učestvuju
i predaju na konferencijama o softveru otvorenog koda, kao što su MySQL
U er Conference, PHPCon, LinuxTag i O'Reilly Open Source Convention.

<{

Priručnik
(.)
z
>N
....,
z
za MySQ
~<
Izdanja Mikro knjige
donose informacije,
<{~
z-, Pregledan uvod u korišćenje MySQL a
S~ -sistema za rad sa bazama podata ko
prenose proverena iskustva
i pružaju potrebna znanja.
My
Press w
Obl.t\ 1: l\o11r pndoliolkol ~
Priručnik ~a MySQL®
O autorima
Rc.·ccn1enL Dragan Tanaskoski
Urednik Olga Milanka l ul Vl•ling (Luke Wclling) predaje u Školi za računarske nauke i informacione tehno-
ltrd.lktori Aleksandra Stojanović i Stela Spa.ić
Tehnički urednik Sanja Tasić
lPl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opre-
Korektor Vesna Đukić tl• IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog rešenja što
Realizacija korica Vladimir Končarević "' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, obja-
l'rclom tc Ima i obrada slika Sanja Tasić
Milica Dečanski IIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla držao je predavanja iz raznih oblasti, ali uža specijalnost mu je Internet.
Izdava č Mikro knjiga, Beograd
Direktor Dragan Tanaskoski
l '"''Tomson (Laura Thomson) predaje u Školi za računarske nauke i informacione
Štampa YG{)~O "J. ( ~u~kum, Beograd r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je više predmeta iz
Ako imate pitanja ili komentare, ili ako želite da dobijete besplatan katalog, pišite nam ili se javite: ,,,,J.,~tt Weba i Jnterneta, a priprema doktorat na temu pretraživanja Weba. Učestvuje na
Mikro knjiga Mikro knjiga Mikro knjiga
, 'w 1111 konferencijama širom sveta. Bila je instruktor na kursevima u organizacijama
l~ t:th 20-87 Jevrejska bb Maksimirska 13 1 d '' t ,!\dičiti m kao što su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra
11030 Beograd 78000 Banja Luka 10000 Zagreb
1 l\11\lllll Consulting Group. Diplomirala je inženjering računarskih sistema i računar­
o
tel: t l /3540-544 tel: 051/220-960 tel: 01/2344-023
pisma®mikroknjiga . co.yu pisma®mikroknjiga.ba pisma®mikroknjiga . hr l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menažeriju kućnih ljubi-
Autorizovan prevod sa engleskog jezika knjige MySQL®Turorial. ilt.ll 1, .1 ponekad priča s Lukom i o stvarima sasvim izvan sveta tehnike.
Copyright© 2005 Mikro knjiga. Sva prava zadržana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji način, elektronski ili mehanički, uključujući fotokopiranje, snimanje ili bilo koji drugi sistem
~.l bdcžcnje, bez prethodne pismene dozvole izdavača.

Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING, Od istih autora
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright© 2004.
Među knjigama o izradi Web aplikacija korišćenjem P HP-a
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 1'111 1 i MySQL i MySQL-a, ova knjiga ima najbolje ocene na lokacijama
l'r.mon Education, Inc. l lltvo~J •l'lrk.tcija zn Web Amazon. com i bn.com. Posebno je dobra druga polovina
knjige, u kojoj su praktčini projekti. U udžbenicima pro-
CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH
IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11
l gramiranja za Web, primeri su obično previše jednostavni
za praktičnu primenu - ova knjiga sadrži i jednostavne pri-
004.655.3(035)
004.652.4(035) mere na kojima se objašnjavaju svojstva jezika, ali i nekoliko
BEJ111Hr, nyK gotovih kompletnih aplikacija koje prikazuju kako se prave
Priručnik za MySQL l Luke Welling, Laura
Thomson ; preveo Andon Kartalovski. -
veliki projekti.
Beograd : Mikro knjiga, 2005 (Beograd :
Publikum). - XI, 251 str. : ilustr. ; 24
cm

Prevod dela: MySQL Tutorial. - O autorima:


str. YI. - Registar. KN lio
ISBN 86-7555-271-8
l. TOMCOH, napa
a) nporpaMCKH je3HK "SQL" - Priručnici b}
Penau.11oue 6aJe noAaTaKa - Ynpaslbaihe -
npHpY'IHlll(H
L COBISS.SR- ID t 22074124 J
MSQL/251/1280412M33010P78S6K54 S 4 3 2 1
a držaj

Uvod . . . . . . . . . . 1

Osnove MYSQL-a . 9

Instaliranje MySQL-a 11
lnSLaliranje na Linux .... ..... ......... .... ...... .. ...... .. . . ... 12
Instaliranje na Windows .................... . .. .... ............. 12
l11staliranje na OS X ........................................... 14
Podešavanje sistema .. ......... ... ........... .... .. . ... ..... ... 14
l'rovera da li sistem radi ........................................ 16
Zadavanje lozinke za nalog root ................. . .. .......... .... 17
ll1 isanje anonimnih naloga .................... .... ............. . 17
l'ravljenje naloga za uobičajene poslove ............................. 17
Sažetak ............................................ .. .. .. .. 18

l Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Struktura MySQL-ovih direktorijuma ............................ .. 19
Pregled izvršnih datoteka ....................................... 20
Pregled korisničkih interfejsa .................................... 21
Kratak uvod u MySQL monitor .................................. 22
Sažetak .................................................... 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
Sažetak ............ . . . ...... . . . . . .... . .... ... .............. 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 .......................... , , , h 1nk tl)t.: za r.1d s d.11111111111 ,1 1 VIti lit 111111.1, .. . ...... ..•.............. ll <J
Brisanje baza podataka, tabela i indeksa ............. , , , , . , .. , . , . , , ~() J' nnktq<.: za kouv~:uqu IIJHlV.I pod.tt.tka . ........................... 120
Izmena strukture postojeće tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % !>tuge funkcije . . . . . . . . . . . . .. .......... . ...... . ............. 121
Sažetak ............................................... .... . 58 l:uktijc za upotrebu u odredbi GltOUP BY ........................ 121
S.1iet1k .... ..... ... ... ... .. ..... .... ..... .. . .... .......... 122
III Upotreba MySQL-a . . . . . . . . . . . . . . . . . 63
l V Tipovi tabela i transakcije u MySQL-u 125
5 Umetanje, brisanje i ažuriranje podataka . . 65
Komanda INSERT ... .. ..... . ................... ..... ........ 65 Tipovi tabela u MySQL-u . . . . . . . . . 127
Komanda REPLACE ....... .. ............. . ... . .. ... ...... ... . 70 I~AM tabele ... ................................... .. ... ... . 128
Komanda DELETE .. .......... ............ .. .... .... . .. ... .. . 70 MyiSAM tabele ............................................. 129
Komanda TRUNCATE ........... . ... . ............. .. .. . ... .. 72 lnnoDB tabele ......... .. .. . . ..... ... .... . . ............ . .... 134
Komanda UPDATE .. .. . ....... . ......... ...... .............. 72 llerkeleyDB (BDB) tabele . . . ...... . . . ......... .. . . ............ 135
Grupno unošenje podataka pomoću komande LOAD DATA INFILE ...... 73 MER.GE tabele .............................. ... ............ 136
Sažetak ...... .. .. . ... . . .................................... 75 l l EAP tabele .. ........... .................................. 138
S;tŽetak ........... . ... .... ........... . . .. ................. 138
6 Korišćenje upita u MySQL-u . . . . . . . . . . . . . . . . . . . . . 79
Opšti oblik komande SELECT . . ... . . ............................ 80 l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143
Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80 Staje transakcija? ... . ..................... ..... ...... .. ...... 143
Učitavanje podataka iz određenih kolona .... .. .. . .... . .. .. ...... . .. 80 Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146
Apsolutna imena baza podataka i tabela ............................. 81 Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149
Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82 Sažetak ............. .... . . .... .. .......................... 152
Upotreba odredbe WHERE za učitavanje samo određenih redova ...... . .. 83
Uklanjanje dupliranih vrednosti pomoću opcije DISTINCT .. . .......... 84 V Administriranje MySQL-a ... 155
Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86
Izdvajanje određenih grupa podataka pomoću opcije HAVING ... ... .. ... 87 ll Upravljanje pravima korisnika 157
Sortiranje učitanih rezultata pomoću odredbe ORDER BY . . .. . . . ....... 87 l'ravljenje korisničkih naloga pomoću komandi GRANT i REVOKE ... .. 157
Ograničavanje broj a redova rezultata pomoću odredbe LIMIT ........ .. .. 88 Nivoi prava ................................................ 159
Utvrđivanje ukupnih prava . .. ......... ... .... . ... .... .......... 160
Sažetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89
Upotreba komande REVOKE .......... .......... . ............. 161
7 Složeniji upiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161
Upotreba spojeva u upitima koji obuhvataju više tabela . ... ............. 93 Sažetak ........... ... . ........... .... . ........ ......... .. . 165
Vrste spojeva između tabela ...... . .. ............... ... ...... . .. . 97
Podupiti ........... ...... .......... . . . ..... . ............... 99 12 Podešavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169
Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103 Podešavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169
Sažetak ........... . .. . ....... . ... ·. ... . .. .. .... . . , ......... 104 Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172
Konfiguraciane opcije za više instalacija na istom računaru ....... . .... .. 173
8 Upotreba MySQL-ovih ugrađenih funkcija Internacionalizovanje ......................................... 174
u komandi SELECT . . . . . . . . . . . . . . . . . . . . . . . . 109 Sažetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4
Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O
13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177
Funkcije za upravljanje tokom izvršavanja komandi ....... ..... .. .. . .. 113
Pokretanj e i spuštanje MySQL servera ............................. 177
Funkcije za rad sa znakovnim vrednostima ........................ . 114
Numeričke funkcije ... ........... . .. ...................... .. . 117
Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178
Podešavanje serverskih promenljivih ......... . .................. . . 182
Uništavanje niti .................................. .. , , . , ... .. 182 19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Pražnjenje ostava ............................................ 182 Otkrivanje sporih upita ..................... . ..... .... ........ 233
Datoteke dnevnika ........................................... 183 Merenje performansi upita ............................ . ........ 234
Sažetak ................................... . ............... 184 Upotreba dnevnika sporih upita ...................... ... ........ 234
Upotreba komande EXPLAIN za prikazivanje načina na koji se
14 Izrada rezervnih kopija i obnavljanje podataka . . . . . . . . 187 upiti izvršavaju .. ............. . ....... . ............ . ...... 235
Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187 MySQL-ov ugrađeni mehanizam optimizovanja upita ................. 237
Testiranje rezervne kopije ... ...... ..... ....................... 195 Preporuke za optimizovanje upita ................................ 238
Proveravanje i popravljanje tabela .. ... ... ........................ 195 Sažetak . . .... . .......................... .. ................ 238
Sažetak ............. . .............................. .... ... 198
Spisak termina korišćenih u knjizi . 241
15 Zaštita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201
Kako sistem prava korisnika deluje u praksi ......................... 201 Indeks . . . . . . . . . . . . . . . . . . . . 243
Zaštita korisničkih naloga ...................................... 202
Zaštita instaliranih datoteka ..................................... 203
Filtriranje podataka koje korisnici šalju ............................ 204
Drugi saveti ........................................... ..... 205
Sažetak . . . . . . . . . . ......... . ...... .. ....................... 206

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


Principi replikovanja ... ...... ................................ 209
Podešavanje sistema za replikovanje ........ . ..................... 211
Složenije topologije ................. .... .... .. ............... 215
Budućnost replikovanja ...................... .. ............... 216
Sažetak ... . .. . ............................. . ...... ... ..... 217

VI Optimizovanje MySQL-a . . . . . 219


17 Optimizovanje MySQL servera. 221
Prevođenje i povezivanje koda radi povećavanja brzine rada ............. 221
Podešavanje parametara servera .. . ....... . ........... . ........... 222
Podešavanje drugih činilaca .................................... 224
Sažetak ......... ... .. ............................ .... ..... 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
Sažetak .. ........................... . ..................... 230
Uvod

D~ lill O DOŠLI U PRIRUČNIK


ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da
1111 omogućida brzo uhvatite korak s MySQL-om. MySQL ćemo objasniti tako da
1 ptlhližimo i krajnjem korisniku i administratoru sistema.

l J ovom uvodnom delu razmotrićemo sledeće:


• ~bog čega biste se opredelili za MySQL
• /.ašto baš MySQL a ne neka druga baza podataka
• !'lt a je drugačije u MySQL-u 4.0 i 4.1
• Koje nove mogućnosti tek treba da se pojave u budućim verzijama
• Kome je ova knjiga namenjena
• l<.1ko treba koristiti ovu knjigu
• N<lpomena u vezi s načinom licenciranja MySQL-a.

Zbog čega biste se opredelili za MySOL


1) "'<)L je odličan proizvod iz oblasti baza podataka. Postoji više razloga zbog kojih
l11 lt' \l! opredelili da MySQL bude vaš server baza podataka.
MySQL je brz i stabilan. To je ključni 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 najviše ukupne

H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je još brži.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opšte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, možete je kupiti.
MySQL pruža veliku većinu mogućnosti koje se smatraju važnim u oblasti baza
('•ul.ti.lka, a to su transakcije, zaključavanje na nivou pojedinačnih redova, spoljni klju-
' l 1, podupiti i tekstualno pretraživanje.Verzija 5.0 će na ovaj spisak dodati i uskladi-
l Ill' procedure.
MySQL omogućava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao što
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.

MySQL je odlična opšta alatka za učenje baza podataka jer se lako instalira i koristi,
1 Z.lutima malo prostora na disku i troši skromnu količinu memorije.

Ukupno gledano, MySQL je odličan izbor za aplikacije baza podataka.


Zašto baš MySQL a ne neka druga baza podataka knjige), što zavisi od toga da li koristite tabele tipa InnoDB. Drugim rečima, za
Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim MySQL postoje dva sistema licenciranja, gde je besplatna upotreba određena GPL
detaljima, ali MySQL nudi kombinaciju performansi, cene i mogućnosti koju bi drugi uslovima, a način komercijalne upotrebe određen je standardnim sporazumima EULA
sistemi teško nadmašili. (End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM
(Original Equipment Manufacturer- izvorni proizvođač opreme). Pravilo kompanije
Performanse MySQL AB je sledeće: "Ako je vaš proizvod besplatan, i naš je; ako se vaš proizvod
MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju pb ća -naš takođe".
najbrže baze podataka na svetu, što, u zavisnosti od vašeg stepena lakovernosti, samo Najvažniji konkurenti nude isključivo komercijalne licence, uz složene sisteme
dokazuje jednu od sledeće dve tvrdnje: programi za testiranje mogu se napisati tako da t ena, koje zavise od nameravanog načina upotrebe, broja procesora po serveru i broja

rezultati dokazuju šta god naručilac programa zahteva, ili da se različiti proizvodi Istovremenih korisnika koji će uspostavljati veze s bazom podataka. Troškovi za Ora-
pokazuju kao savršeni u različitim uslovima upotrebe. t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu dostići

Na MySQL-ovj zvaničnoj Web lokaciji možete pogledati rezultate poređenja per- desetine hiljada dolara u okruženju sa umerenim opterećenjem, pa čak i stotine hiljada
formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom dolara za server s više procesora na koji se povezuje veći broj klijenata.
primctno nadmašuje svoje takmace. Iako u načelu rezultate bilo kojeg testiranja treba MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao Što su
prihvata ti "sa zrnom soli", što naročito važi za rezultate testova koje je izvršio proizvo- l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je
đač baze podataka, svi dokazi na raspolaganju, uključujući i nezavisne testove, poka- MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.-
zuju da je MySQL jedan od najbržih proizvoda na raspolaganju. ,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1
Rezultate testiranja možete videti na Web lokaciji: odštetu u slučaju neispravnosti, kao što zahtevaju velike organizacije.
www.mysql.com/information/benchmarks.html Još jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze
podataka koje nisu namenjene radu u klijent/server okruženju, a ciljna tržišna grupa
a ti podaci su priloženi i uz datoteke izvornog koda koje preuzim.ate, što vam omogu-
su im kućni korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro.
ćava da ih uporedite s rezultatima koje dobijete u svom radnom okruženju.
Mada se grafički korisnički interfejs programa iz ove kategorije Često jednostavno
Rezultati testiranja koje je izveo časopis eWeek 2002. godine pokazali su da je
upotrebljava, njima uglavnom nedostaje važna funkcionalnost i nisu dovoljno stabilni,
MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web
skalabilni i brzi da bi bili upotrebljivi za aplikacije od ključne važnosti za firmu.
aplikacije napisane na jeziku Java koje rade na Windows računaru s četiri procesora.
Navedena dva proizvoda su nadmašila IBM-ov DB2, Microsoftov SQL Server i Syba-
Stabil nost
seov ASE. U nastavku ovog teksta biće više reči o ce nama, ali vredi napomenuti da je
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog značaja .
od svih proizvoda obuhvaćenih tim testovima, jedan od najboljih bio besplatan, dok su
Sve verzije MySQL-a izdate u binarnom obliku - čak i alfa izdanja - moraju proći
cene drugih bile reda veličine 160.000 dolara (40.000 dolara po procesoru).Više detalja
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
o tome naći Ćete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
osobina, kao i ispitivanje rezultata operacija pri kojima su u prošlosti otkrivene i ispra-
Brzina je oduvek bila ključna odlika o kojoj projektanti MySQL-a vode računa.
vljene greške, čime se obezbeđuje da se nikad ponovo ne uvede već ispravljena greška.
U MySQL se ugrađuju nove mogućnosti samo ako nisu na štetu performansi. Zbog
Ispravljanju grešaka projektanti moraju da daju viši prioritet od drugih poslova.
toga se ponekad nove mogućnosti dodaju sporije nego što to korisnici žele, ali se time
U suštini, projektant prekida tekući posao sve dok se ne otkloni greška koja spada
obezbeđuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ćete se i u njegovu oblast stručnosti. Pravilo nalaže da svako izdanje MySQL-a mora biti oči­
sami složiti na osnovu svog iskustva ili testova koje sami izvedete.
šćeno od dotad poznatih grešaka koje se mogu reprodukovati u poznatim uslovima.

Cena R.azume se, određeni problemi ne mogu se rešiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To naročito važi za produkcione verzije u koje ne bi tre-
Cena je stavka koja se možda najlakše poredi. Za mnoge uslove upotrebe, MySQL je
balo ugrađivati suštinske izmene koje bi mogle da utiču na stabilnost verzije. U takvim
besplatna aplikacija. Uslovi licence tipa GPL omogućavaju da neograničeno koristite
slučajevima, problem se dokumentuje i otklanja u jednoj od narednih verzija.
softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima
I najzad, kvalitet softvera obezbeđuju MySQL-ovi klijenti i zajednica korisnika.
takođe pod GPL uslovima. U određenim situacijama, npr. kada želite da distribuirate Preko četiri miliona korisnika širom sveta rade u veoma različitim okruženjima, što
MySQL kao sastavni deo komercijalnog proizvoda, moraćete da kupite komercijalnu
pruža jedinstvenu priliku za otkrivanje grešaka već u početnim fazama razvoja. Budući
li cenc u. Cena licence za jedan server je od 220 do 440 dolara (u vren~e pisanja ove
da je MySQL-ov sistem za otkrivanje i dokumentovanje grešaka javan, svaki korisnik
ima uvid u sve što su drugi korisnici otkrili i može da dodaje svoje napomene.
Lakoća upotrebe Šta je drugačije u My -u 4.0 i 4.1
Druga ključna odlika MySQL-a jeste lakoća upotrebe. Nije potreban sime.: n post upak MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V« lii:ij ,l , M.11t.1 2003. godine izdat je MySQL
podešavanja da biste počeli da radite. MySQL server radi kako treba čim ga "rasp~ku­
1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I 11.1 11.data je aprila iste godine.
jete". Standardne vrednosti parametara su takve da minimizuju utrošak prostora na
Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uočićete sledeće značajnije izmene:
disku i memorije. Razume se, da bi se postigle optimalne performanse određenih
funkcija koje su važne u produkcionom okruže~ u. kao što je npr. prijavljiva~e kori- • U standardnu binarnu verziju ugrad ena je mašina baze podataka Inn oD B, koja je
već bila ugrađena u neke kasnije verzije 3.23. Mašina baze podataka InnoDB
snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu pomoći primeri konfiguracionih podržava pravila ACID, što znači da podržava transakcije, spoljne ključeve i
datoteka koje dobijate uz MySQL. zaključavanje na nivou redova tabele.

• MySQL sada koristi ostavu (keš) za upite, u koju smešta rezultate upita za kasniju
Mogućnosti ponovnu upotrebu, čime znatno poboljšava performanse uobičajenih upita.
Poređe~e mogućnosti softvera umnogome zavisi od toga koje mogućnosti smatrate • Tekstualno pretraživanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj-
važnim. MySQL pruža određene mogućnosti, kao što su tekstualno pretraživanje, šani su dodava~em opcije Boolean.
replikovanje i podrška za veoma obimne tabele, kojih u drugim jeftinim proizvodima • Tabele tipa MERGE sada podržavaju komande INSERT i polja AUTO_INCREMENT.
uopšte nema ili ne rade najbolje. Međutim, MySQL-u nedostaju neke mogućnosti • Skupovi rezultata dobijeni pomoću upita SELECT sada se mogu spajati pomoću
kao što su uskladištene procedure i pogledi, koje su standardne u najskupljim proizvo- opcije UNION .
dima, a postoje čak i u nekim jeftinim proizvodima. Neke od tih nedostajućih moguć­
• Sada možete da br iš ete redove iz više tabela istovremeno pomoću jedne komande
nosti (kao što su uskladištene procedure), planirane su za naredne verzije, dok će za
DELETE.
druge (kao što su pogledi) biti potrebno više vremena. Neke MySQL-ove mogućnosti
(na primer, zaključavanje na nivou reda) ne postoje čak ni u najskupljim sistemima. • Poboljšano je upravlja~ e pravima korisnika. Doda to je više novih vrsta prava, što
omogućava finije podešavanje, a odsad možete da ograničite i resurse kojima
Na Web lokaciji posvećenoj MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/
information/features. html, na kojoj ćete naći uporedni pregled mogućnosti
korisnik ima pristup.
MySQL-a i dvadesetak konkurenata, da biste videli šta se sve nudi. U nastavku dajemo • Odsad možete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.
kratak spisak mogućnosti koje ne podržavaju svi MySQL-ovi konkurenti i spisak • Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo-
mogućnosti kojih nema u MySQL-u a postoje u drugim proizvodima. gućava da ugrađujete MySQL u svoje programe.
MySQL 4.1 nudi sledeće: • Replikovanje, koje postoji još od verzije 3.23.15, poboljšano je na više načina,
• transakcije u skladu s grupom pravila ACID uglavnom otklanjanjem grešaka. Na primer, sada možete da podesite bazu ka~
• podršku za različite platforme prijemnik podataka pomoću opcije LOAD DATA FROM MASTER, umesto pomocu
• replikovanje komande mysqldump ili alatke mysqlsnapshot.

• podršku za obimne tabele i baze podataka Napravljeno je i puno drugih manjih izmena i poboljšanja. . .
Verzija 4.1 donosi još neka dodatna poboljšanja. Najvažnija izmena Je dodavanJe
• tekstualno pretraživanje
pod upita i izvedenih tabela. Odsad imate i podršku za Unicode, po~.~šku za fo_:m~t
• podupite
OpenGIS za skladištenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.
• podršku za većinu sintakse po standardu SQL 92.
MySQL zasad još ne nudi sledeće:
Koje nove mogućnosti tek treba da se pojave
• poglede
• uskladištene procedure
u budućim verzijama
Verzija 5.0 je zasad u predalfa fazi, ali možete preuzeti izvorni kod da biste s njim
• okidače
ckspcrimentisali. Najznačajnija izmena koju donosi verzija 5.0 jeste do.datak u~kla­
dištenih procedura, što je već ugrađeno u predalfa verziju. Planirane su 1 druge 1zm~ne
medu kojima su podrška za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1
druga manja značajna poboljšanja.
Trebalo bi da verzija 5.1 omogući definisanje spoljnih ključeva Ll sv lill Vl st.llll.l N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktičnih vežbi u vezi s gradivom
tabela (među mnogobrojnim drugim novim mogućnostima). Pogledi će biti podrža ni poglavlja, da biste mogli da provežbate ono što ste naučili u poglavlju.
u jednoj od budućih verzija S.x.

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


Kome je ova knjiga namenjena l· nmpanij a MySQL AB, kojom upravljaju projektanti i autori MySQL-a, vlasnik je
Ova knjiga je jedinstvena jer se sastoji od niza kratkih i sažetih poglavlja, a svako je MySQL-ovog koda i dokumentacije.
u sredsređene na određenu temu i prevashodno opisuje kako se rade određeni poslovi. Većina delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU
Svako poglavlje završava se pitanjima i vežbama koje se odnose na gradivo poglavlja, tlpštcjavne licence (General Public License, GPL).To znači da možete slobodno kori-
što vam omogućava da ispitate da li ste dobro razumeli koncepte izložene u poglavlju. \111 1, kopirati, distribuirati i menjati izvorni kod MySQL-a. Ako kop irate ili distribui-
Ukratko, naša namera je da knjiga bude kratak priručnik za pametne ljude. Ova l,lll' kod (ili ako kod izmenite pa ga zatim kopirate ili distribuirate), to takođe morate
knjiga nije referentni priručnik. Ako vam to treba, pogledajte odličan priručnik o 1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati

MySQL-u na zvaničnoj Web lokaciji. Zaista nema potrebe da ponovo pronalazimo , 11vorni kod.
rupu na saksiji. Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a možete pročitati
Usredsredićemo se na sledećih pet ključnih oblasti: instalisanje i konfigurisanje 11 l·kktronskom obliku u MySQL-ovom referentnom priručniku, ili na Web lokaciji
MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a. l ondacij e za besplatan softver (Free Software Foundation):
Opisaćemo sva suštinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a. hl Lp://www.gnu.org/licenses/
Ovu knjigu možete koristiti kad god vam zatreba da uradite određeni posao koji
Više detalja o GNU uslovima naći ćete na:
se ti če upotrebe MySQL-a u novom projektu, ili ste prešli na nov posao, ili nemate
http://www .gnu.org/licenses/gpl-faq.html
dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je
napisana tako da vam pomaže da uradite određeni posao. Ako to ne odgovara vašim namerama- na primer, ako želite da izmenite MySQL
1d:1 zatim prodajete binarnu verziju napravljenu na osnovu izmenjenog koda, ali bez
pristupa izvornom kodu- onda morate kupiti komercijalnu licencu od firme MySQL
Kako treba koristiti ovu knjigu AB. Komercijalnu licencu možete kupiti i ako želite da pomognete razvoj MySQL-a.
Ova knjiga je podeljena na pet delova: Važno je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL
U prvom delu", Osnove MySQL-a", naučićete kako da instalirate i podesite MySQL uslovima, ali se može slobodno štampati za ličnu upotrebu.
na svom sistemu, i upoznaćete 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 pro-
jektovanju baza podataka biće dovoljno da samo površno pogledaju ovaj deo, ali ako
ste početnik u oblasti baza podataka, savetujemo da ga detaljno proučite .
U trećem delu",Upotreba MySQL-a", naučićete 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 mašina baza podataka, sa posebnim osvrtom na mašinu InnoDB
i njenu upotrebu za transakcionu obradu podataka.
Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da oba-
vlja administrator MySQL-ove baze podataka, kao što su upravljarUe korisnicima,
podešavanje, održavarUe baze podataka, izrada rezervnih kopija i restauriranje baze
podataka, zaštita baze podataka od neovlašćenog pristupa i replikovanje podataka.
Šesti deo",Optimizovanje MySQL-a", pomoći će vam da dobijete maksimum od
MySQL-ove baze podataka tako što optimizujete podešavarUa servera, baze podataka
i upite u svojim uslovima.
I
Osnove MYSQL-a

l Instaliranje MySQL-a
2 Kratak obilazak
1
Instaliranje MySQL-a

t >VOM POGLAVLJU SAZNAĆETE kako se instalira i podešava MySQL za uobičajen


111 upotrebe. Obradićemo sledeće teme:
• l11staliranje na Linux
• l11staliranje na Windows
• l11staliranje na OS X
• Podešavanje 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, možete preskočiti 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 najpogod-
lllj.r 1.1 vaš sistem. Za većinu sistema postoje verzije MySQL-a koje se distribuiraju u
1!111,11110111 obliku ili kao izvorni kod. Ako tek učite kako se koristi MySQL, prepomču-
1 11111 vam da preuzmete binarnu verziju jer se znatno lakše instalira. Dodatna prednost
11 1 lo što je binarna verzija MySQL-a podešena 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 uključene razne kori-

lli IIIOgućnosti, kao što su InnoDB tabele koje omogućavaju upotrebu transakcija,

Int' remo vrlo često koristiti.


MySQL je na raspolaganju istovremeno u više verzija: tekuća verzija, najnovija ver-
~ 'l·' 1 11ekoliko razvojnih verzija iz više faza razvoja. Ova knjiga je napisana za verziju 4.1.
MySQL možete 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 načinu instaliranja morate potražiti u MySQL-ovoj dokumentaciji.
l\\ n/L' bttt polrt•bno d.t myoq l cl'/;IIIICililc imenom prvobitne binarne verzije servera
Instaliranje na Linux
l"111 \lt' imt.1lirali kao Windowsov servis.
U zav_is.nosti od verzije ~inuxa koju imate i od toga koliko je sveža, vrlo je verovatno Al o višt.: volite da radite s grafičkim alatkama, servis možete da uklonite i pomoću
da vec Jmate neku verZljU MySQL-a instaliranu na svom računaru, ali je takođe vrlo
tl .ql t' Services Manager, koja je na raspolaganju u Control Panelu, u grupi Admini-
verovatno da to nije najnovija verzija.
1! .111 vc Tools Services, ili na nekim sistemima, u prozoru alatke Microsoft Manage-
Prepor~č~jemo da i~stalira~e MySQL iz MySQL-ove RPM datoteke, pod uslo-
v.~m da vas SJStem podrzava taj format pakovanja. Savetujemo vam da upotrebite ver-
litt tll Console.
ltllajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i može
ZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM t.tllikovati od onog koji možda poznajete iz verzija MySQL-a koje ste ranije insta-
datoteku koju vam je isporučio proizvođač vaše distribucije Linuxa, naročito ako tek l~t ,tll 11~ svojoj verziji Windowsa. Započnite instaliranje raspakivanjem .zip datoteke
po~i~~ete učenje .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji ažuriraju
lt tp 1 ste preuzeli sa We b lokacije.
se cesc: n~go . u b1lo kojoj v distribuciji Linuxa, što znači da su u njih ugrađena najnovija lJ zavisnosti od trenutka kada ovo budete čitali, sadržaj te datoteke može biti druga-
poboljsanja J 1spravke gresaka . Osm1 toga, struktura direktorijuma na vašem računaru
ql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe.
biće podešena kako je opisano u MySQL-ovoj dokumentaciji, što će vam za početak
~ \• d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala-
svakako olakšati traženje informacija.
' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL ćete
_Jedna distribucija se sastoji od više RPM datoteka. Da biste mogli da koristite
111\t.tl1rati tako što dvaput pritisnete ime MSI datoteke.
klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server-
In stalacioni program će vam ponuditi opciju da instalira MySQL u podrazumevani
- VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VER-
l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ćete ga
ZljA.i386.rpm. (Reč VERZijA biće zamenjena odgovarajućim brojem verzije.)
111\t.llirati u podrazumevani direktorijum.
Server i klijent možete instalirati ako u komandnom okruženju otkucate sledeću
Pošto instalirate MySQL, treba da napravite datoteku s parametrima koji određuju
komandu:
potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego što prvi put
rpm -i MySQL-server-VERZIJA.i386.rpm MySQL-client-VERZIJA.i386 .rpm pokrenete server. Više detalja o podešavanju sistema naći ćete u odeljku "Podešavanje
. Time.ćete pokrenuti i mysqld, MySQL server, i formirati odgovarajuću strukturu !'lema", u nastavku ovog poglavlja.
dJ:ektonjuma u /etc/ini t. d/ da bi se server automatski pokretao kada pokrenete Pošto podesite parametre sistema, korisno je da server prvi put pokrenete s
racunar. ~ omandne linije. (U nastavku ovog poglavlja objasnićemo kako se MySQL instalira
Ako želite da instalirate MySQL na neki drugi način- tj. ne iz RPM datoteka ~ .10 Windowsov servis, ali pogledajmo prvo da li uopšte radi.)
-potražite detaljnija uputstva u MySQL-ovoj dokumentaciji. Otvorite prozor komandne linije i pređite u direktorijum u koji ste instalirali
Ivmajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i da se MySQL. Ako imate standardnu instalaciju, to će biti c:\mysql\bin.
moze. razb~ovat1 o~ onog koji možda poznajete iz verzija MySQL-a koje ste ranije Otkucajte sledeće:
mstabrah, 1h od vase verzije Linuxa. mysqld-max --standalone
Trebalo bi da se nakon toga prikaže grupa početnih poruka. Ako je dosad sve
Instaliranje na Windows u redu, možete instalirati MySQL kao Windowsov servis.
~a biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prija- Otkucajte ime izvršive datoteke servera koju nameravate da koristite, a zatim i
Vltl na s1stem kao administrator. opciju --install. Na primer:
Akvo već !mate .instalira~ u neku verziju MySQL-a, morate zaustaviti server pre mysqld-max --install
nego sto pocnete mstal1ra11Je nove verzije. To se radi pomoću sledeće komande: U ovoj knjizi preporučujemo izvršivu datoteku mysqld-max.
mysqladmin -u root -p shutdown Da bi vaša instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da
. Ako imate M~SQL ins~~iran kao Windowsov servis, moraćete najpre da uklonite obavite još jedan, poslednji posao. Pošto su neki od programa pridruženih MySQL-u
taj serv1s. To mozete urad1t1 u komandnom okruženju pomoću sledeće komande: zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl mašina da bi ti pro-
grami mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState:
mysqld --remove
www.activestate.com/Products/ActivePerl/
ActivePerl dobijate u obliku MSI datoteke. Preuzmite ActivePerl i instaiii,IJ!t• ga U ovoj knjizi preporučujemo da izmenite sledeće opcije :
tako Što dvaput pritisnete ime te datoteke. Možete prihvatiti sve vrednosti parametara • ll udući da ćemo koristiti InnoDB tabele, morate obaviti osnovno podešavanje za
koje vam instalacioni program ponudi za upotrebu s MySQL-om. upotrebu tog tipa tabela.
• l'n:poručujcmo da uključite beleženje izmena u dnevnik (engl. binary log) u svim
Instaliranje na OS X situacijama . To je veoma korisno u slučaju oporavljanja od katastrofalnih grešaka.
MySQL možete instalirati na OS X iz odgovarajućeg paketa, pod uslovom da imate • l 1 reporučujemo da uključite beleženje sporih upita u dnevnik, što će vam pomoći
OS X 10.2 ili noviji. da optimizujete svoje aplikacije.
Ako već imate neku verziju MySQL servera koja je aktivna na vašem računaru, MySQL smešta vrednosti konfiguracionih parametara u datoteku opcija. Ako kori-
morate je zaustaviti pre nego što započnete instaliranje nove verzije. To možete ura- lit t Windows, globalnu datoteku opcija možete smesti ti u Windowsov sistemski
diti tako što na komandnoj liniji otkucate sledeću komandu: oi ill ktor uum i nazvati je my.ini, ili u e: \my.cnf. Preporučujemo da koristite my. ini jer
mysqladmin -u root -p shutdown II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija.
U operativnim sistemima iz porodice Unix, globalna datoteka opcija obično je
Da biste mogli da pokrenete server, potreban vam je korisnički nalog čije je ime
.llii'Štena u direktorijum /etc/my.cnf. Ako želite da na istom računaru radi više
mysql. Ako imate OS X 10.2 ili noviji, taj nalog već postoji.
r-- lySQL servera, podatke za svaki server možete čuvati u zasebnoj datoteci my.cnf
S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike
lllt'Štenoj u direktorijumu data svakog servera. Osim toga, možete dozvoliti korisni-
diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.
Pojaviće se sadržaj datoteke slike diska. Pronađite PKG datoteku i dvaput je priti-
' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smeštene u
snite. Za potrebe ove knjige možete prihvatiti sve vrednosti opcija koje vam instala- ol1tntcci -/.my.cnf(obratite pažnju na tačku ispred imena datoteke).
U zavisnosti od vaše instalacije, možda u početku nećete ni imati datoteku opcija.
cioni program ponudi.
t ltvorite tu datoteku u svom uobičajenom editoru za tekst- Notepad će sasvim lepo
MySQL možete podesiti tako da se automatski pokreće pri podizanju sistema, tako
Što dodate Startupitem. To možete uraditi ako dvaput pritisnete datoteku MySQL- nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.
Predlažemo vam datoteku opcija sa sledećim početnim opcijama (listing 1.1):
Startupltem.pkg koja bi trebalo da se nalazi u vašoj .dmg datoteci.
Pošto izvršite postupak opisan u odeljku "Podešavanje sistema", možete pokrenuti
l h ting 1.1 Predložena datoteka opcija
MySQL server tako što otkucate sledeću komandu, pod uslovom da ste instalirali Star-
tup Item: tmysqld]
ll aktiviranje dnevnika izmena i dnevnika sporih upita
sudo /Library/Startupitems/MySQL/MySQL start tog bin
Ako niste instalirali Startupltem, server možete pokrenuti pomoću sledećeg niza log-slow-queries
komandi:
Podešavanje za InnoDB tabele
cd /usr/local/mysql ll Ovo je osnovna datoteka opcija predložena u dokumentaciji
sudo ./bin/mysqld_safe ll Datoteke za podatke treba da omoguće
Pritisnite Ctrl+Z. I najzad, otkucajte sledeću komandu: ll skladiš tenje podataka i indeksa.
ll Obezbedite dovoljno slobodnog
bg ll prostora na disku.
Ako niste instalirali Startupitem, morate ponoviti ove korake kad god pokrećete innodb_dat a_file_path = ibdatal:lOM:autoextend
ll Podesi te veličinu rezerve za bafere na
svoj sistem i želite da koristite MySQL. ll 50-80% količine mermorije
Imajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i može ll na raču naru
se razlikovati od onog koji možda poznajete iz verzija MySQL-a koje ste ranije insta- rwL-variable = innodb_buffer_pool_size=70M
lirali, ili može biti drugačiji na vašoj verziji OS X-a. nPL-variable = innodb_additional_mem_pool_size=lOM
ll Podes ite veličinu dnevnika na približno
ll 25% veličine rezerve za bafere
Podešavanje sistema set-variable innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
Početna konfiguracija MySQL-a radiće već takva kakvu ste je instalirali; međutim,
neke korisne mogućnosti su standardno isključene a instalacija nije ' dovoljno zaštićena.
# Podesite .. flush_log_at_trx_commit Da biste se odjavili iz MySQL monitora, otkucajte sledeće:
# na O ako možete da prihvatite gubljenje
\q
# nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=1 (Obrnuta kosa crta, slovo q i pritisak na taster Enter.) .. .. .
Međutim, nemojte se još odjavljivati. (Ako ste to uradth, ponovo se pnjaVJte.) .
Veći deo sadržaja ove datoteke opcija zasniva se na veoma jednostavnoj konfigura- Postoji još nekoliko administrativnih stvari koje treba da obavite da bis.te_ zatsta mogh
cionoj datoteci za upotrebu Inn o DB tabela, koja je predložena u MySQL-ovoj doku- da koristite svoju instalaciju MySQL-a. Budući daje to važno, preporucujemo vam da
mentaciji. Ako imate postojeću instalaciju u kojoj se koriste InnoDB tabele i dodate n~stavite čitanje ovog poglavlja.
joj ovu datoteku opcija, možda ćete morati da pretvorite u komentar sledeći red:
set-variable = innodb_log_file_size=20M Zadavanje lozinke za nalog root .
tako što ćete
na početku reda upisati znak#. (Ako već imate datoteku dnevnika druge Kao što ste verovatno uočili ako ste se upravo prijavili na server, moral1 ste da. zadate
veličine, to će možda zbuniti MySQL.) une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku
Ostala podešavanja opisana su u poglavlju 12, "Podešavanje MySQL-a". n:tlog root nema lozinku. Iz očiglednih bezbednosnih razloga, veoma je važno da tom
ualogu dodelite lozinku. U MySQL monitoru otkucajte sledeće:

Provera da li sistem radi aet password for root®localhost=password('lozinka');


Pošto instalirate MySQL, podesite ga tako da se automatski pokreće pri podizanju Razume se reč lozinka zamenićete lozinkom koju ste izabrali za nalog root.
računara. Ako je tačno podešen, trebalo bi da bude moguće uspostavljanje veza sa Odjavite se' (\q) a zatim se ponovo prijavite. Ovog puta ćete morati da se prijavite
MySQL serverom. slcdećom komandom:
To možete proveriti pomoću sledeće komande: mysql -u root -p
mysql -u root MySQL će zatražiti da zadate svoju lozinku. Parametar -u znači ime korisnika,
Može biti potrebno da zadate punu putanju izvršive datoteke mysql (na primer, na ;1 parametar -p znači da se prijavljujete s lozinkom.
Windowsu, to je obično e: \mysql \bin\mysql -u root) ili da izmenite vrednost
sistemske promenljive PATH.
Trebalo bi da se na ovaj način uspešno prijavite kao korisnik root (administrator)
Brisanje anon imn ih naloga . ..
Pri instaliranju, MySQL automatski pravi nekoliko anonimnih naloga .za koje mje
MySQL monitoru (tj. MySQL-ovom interfejsu u obliku komandne linije). Na vašem
potrebno zadavanje imena korisnika prilikom prijavljivanja.' Pr~poruČujemo vam da te
ekranu trebalo bi da se pojavi sledeća uvodna poruka:
naloge izbrišete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .•
Welcome to the MySQL monitor. Commands end with ; or \g. "Zaštita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete
Your MySQL connection id is 4 to server version: 4.1.0-alpha-max-
-debug-log ukloniti pomoću sledećeg niza komandi:
Type 'help; ' or '\h' for help. Type '\e' to clear the buffer. use mysql;
mysql> delete from user where User='';
Na vašem sistemu će verovatno biti različit broj veze (connection id) i broj verzije delete from db where User='';
(lush privileges;
servera. Neka vas to ne brine.
Ako se pojavi poruka nalik na sledeću:
ERROR 2003: Can't connect to MySQL server on 'localhost' (10061) Pravljenje na loga za uobičajene poslove .. . .
Jz bezbednosnih razloga, korisno je da umesto naloga root, za uobJcajene l svakod-
to znači da MySQL server ne radi. Pokušajte ponovo da pokrenete sistem da bi se ser-
nevne poslove koristite neki drugi nalog. . . .• .
ver automatski pokrenuo zajedno s njim, ili ručno pokrenite server pomoću komande:
·V •

Ovde je samo ukratko opisano kako se prav1 nov konsmckt ,n~log. Vtse deta.lja
mysqld --standalone tome kako se upravlja korisničkim nalozima u MySQL-u naCl cete u poglavlju 11,
0
na komandnoj liniji. (To ćete najlakše uraditi u jednom prozoru, a zatim otvorite "Upravljanje pravima korisnika" .
drugi prozor iz kojeg ćete se prijaviti na server.)
Pomoću sledeće 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*.*
2
to imekorisnika identified by 'lozinka ' ;

Razume se, umesto reči imekorisnika i lozinka, u tekst komande treba da upišete
svoje korisničko ime i odgovarajuću lozinku.
Kratak obilazak
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 završnih poglavlja ove knjige mora-
ćete da koristite nalog root da biste obavili određene poslove, ali pošto korisnički

u
nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za sva-
kodnevne poslove.
OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Pri-
d1užene. Povešćemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u
Sažetak MySQL-u i koji su najčešći klijentski interfejsi. Razmotrićemo sledece teme:
U ovoj f.ni trebalo bi da vaša instalacija MySQL-a bude upotrebljiva a vi spremni da
• Strukturu MySQL-ovih direktorijuma
sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili sledeće:
• Pregled izvršnih datoteka
• Preuzeli najnoviju binarnu verziju MySQL-a za vaš operativni sistem s Web loka-
• Pregled korisničkih interfejsa
cije mysql.com.
• Kratak uvod u MySQL monitor.
• Instalirali je- pomoću instalacionog programa (na Windowsu ili OS X-u) ili
pomoću alatke RPM.

• Podesili server tako da se automatski pokreće pri podizanju sistema, ako je to u truktu ra MySQL- ovih direktorijuma ..
vašem slučaju prihvatljivo. l J ovom poglavlju pretpostavićemo da ste instalirali MySQL na standardnu lokaciJU na
• Napravili datoteku opcija. vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura
• Prvi put se prijavili na server i odjavili s njega. dlll'ktorijuma biće ista, ali će kerenski direktorijum biti drugačiji.
• Zadali lozinku za nalog root. Ukoliko vam je proizvođač isporučio sistem sa već instaliranim MySQL~om:.
11uktura direktorij uma će se možda razlikovati. Na primer, ako Imate dJstn~uCIJU v .
• Izbrisali anonimne naloge.
l~l'd Hat 9, otkrićete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1
• Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove. ,1,tcm skladištenja 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
Vežbe tt ovoj knjizi. .. .. v v.. v ••

lill ajte u vidu i to da će struktura direktonJuma b1t1 nes~o dru gaCIJa sto zavisi od tog~
Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju,
ukoliko još niste to uradili. ~ 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 preporučeno u poglavlju 1, u odeljku "InstaliranJe
U sledećem poglavlju MySQL-a". . . . ..
U poglavlju 2",Kratak obilazak", pogledaćemo komponente vaše instalacije MySQL-a, Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
ponovo ćemo pogledati korisničke interfejse i osnovni način upotrebe MySQL-a. MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
/U rUylctVIJt: L 1'\.ldldl\. UVIIOLO" Pregled korisničkih interfejsa 21

U tom direktorijumu naći ćete, između ostalog, sledeće poddirektorijume (pod Kroz celu ovu knjigu koristićemo programe mysqld i mysql, a na druge pomenute
pretpostavkom da ste instalirali MySQL iz binarne distribucije): programe vrati ćemo se u petom delu, "Administriranje MySQL-a".
• bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i više Pogledajte sadržaj direktorijuma scripts. Programi koji se u njemu nalaze su skrip-
drugih korisnih programa u prevedenom obliku. Sadržaj tog direktorijuma opi- tovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih među njima opisaćemo kada vam budu zatrebali u ovoj knjizi.
san je u narednom odeljku ovog poglavlja.
• scripts: Ovaj direktorij um sadrži grupu skri p tova napisanih na jeziku Perl koji Najvažniji od onih koje ćemo koristiti u ovoj knjizi jeste mysqlhotcopy, koji služi za
obavljaju korisne poslove. Objasnićemo ih detaljnije u narednom odeljku ovog 111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada
11'zervnih kopija i obnavljanje podataka".)
poglavlja .
• data: Ovo je direktorij um u kojem će se čuvati vaši podaci.
• does (Linux) ili Does (Windows): U ovom direktorijumu naći ćete dokumenta- Pregled korisničkih interfejsa
ciju o MySQL-u, u HTML formatu. MySQL-u možete pristupati pomoću više korisničkih interfejsa, ili klijentskih pro-
• sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se pro- gl.l!na.Tri najpopularnija korisnička interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, skraćeno, MySQLCC)
grami za testiranje MySQL-a.
1 phpMyAdmin.
Postoji još nekoliko drugih direktorij uma u koje će prosečan korisnik retko zala-
MySQL monitor je uključen u osnovnu instalaciju MySQL-a, a komande se
ziti. To su: include (sadrži datoteke zaglavlja), lib (biblioteke funkcija koje MySQL
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
koristi), share (sadrži tekst poruka o greškama koje MySQL šalje) i example (postoji
l o listi i radi na svim platformama.
samo na Windowsu, sadrži primere upotrebe datoteke libmysql.DLL). Ako instalirate
MySQL Control Center (MySQLCC) jeste grafički korisnički interfejs. Napisan je
drugi softver (kao što je PHP) koji se povezuje s MySQL-om, može vam zatrebati da
pomoću skupa alatki za izradu prozora Qt, koji omogućava izradu verzija za različite
znate gde se ti direktorijumi nalaze ali malo je verovatno da ćete nešto direktno
pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Win-
menjati u njima. dows, a planirana je i verzija za OS X.
phpMyAdrninje Web korisnički interfejs za upotrebu MySQL-a. Veoma je popu-
Pregled izvršnih datoteka 111 an među dobavljačima Internet usluga koji svojim korisnicima stavljaju na raspola-
MySQL-ove izvršne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo go~~~jc MySQL radi razvijanja Web aplikacija.

najpre direktorijum bin. Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je zvanični
U njemu ćete naći izvršnu datoteku mysqld ili datoteku s nekim drugim imenom, pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate,
što zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u 111nžda ćete morati da ga posebno preuzmete sa adrese:
poglavlju 1 podesili tako da se automatski pokreće zajedno sa operativnim sistemom. www.mysql.com/downloads/mysqlcc.html
Tu ćete naći i mysql, MySQL monitor. To je osnovni klijentski program sa mter- MySQLCC se izuzetno lako instalira, a uputstva o tome naći ćete na adresi:
fejsom u obliku komandne linije. . www.mysql.com/products/mysqlcc/install.html
Osim ova dva najvažnija programa, naći ćete i više drugih. Upotrebu mnogih od
njih opisaćemo u pojedinim poglavljima ove knjige. Ovde ćemo navesti samo neke phpMyAdmin možete preuzeti sa adrese:
među najkorisnijim: www.phpmyadmin.net/

• mysqladmin: Služi za obavljanje administrativnih funkcija. Ako želite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser-
• myisamchk: Služi za proveru i popravljanje oštećenih MyiSAM tabela. n·l 1 instaliran PHP.
Za potrebe ove knjige, nevažno je koji ćete korisnički interfejs odabrati. Svi nude
• mysqldump: Omogućava izradu rezervnih kopija baze podataka.
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika-
• mysqlbinlog: Omogućava čitanje dnevnika izmena, što je ključno za opora-
:tiJll takođe u obliku teksta, bez obzira na korisnički interfejs koji upotrebite.
vljanje baze u slučaju katastrofalne greške. i>rimeri koje dajemo u ovoj knjizi testirani su pomoću MySQL monitora, ali vi
• mysqlshow: Služi za prikazivanje podataka o bazama podataka i njihovim 1110Žete koristiti šta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
tabelama. 111u~i klijentski program nađete na Internetu. Za neke poslove biće potrebno da izađete
it kn ns n ičkog interfejsa i upotrebite koma n dno okruženje operativnog sistema.
22 Poglavlje 2 Kratak obilazak
Sažetak

Kratak uvod u MySQL monitor tHiređenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
Sada ćemo ukratko opisati osnovni način upotrebe MySQL monitora. Prijavljivanje za p.1 pokušajte ponovo.)
rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni- Pošto izaberete bazu podataka, možete videti koje se sve tabele nalaze u njoj, ako
tor prijavljujete se pomoću sledeće komande: 111 kll Cate komand ll:
mysql -u username -p 11 1iow tables;

Ovaj klijentski program ima nekoliko opcija koje mogu biti korisne. Ako usposta- Podatke o određenoj tabeli možete dobiti pomoću komande:
vljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom računaru, til ncri be tablename;
možete upotrebiti opciju -h da biste zadali ime tog računara; na primer: Iz MySQL monitora možete se odjaviti tako što otkucate:
mysql -h imeračunara -u imekorisnika -p \q
U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postižete i
bratite pažnju na to da se ova komanda ne završava znakom tačka i zarez. Postoji
pomoću opcije --safe -update s. Na primer:
l', illpa komandi koje počinju znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr-
mysql --i-am-a-dummy -u root -p ,, va se znakom tačka i zarez. Spisak tih komandi možete dobiti ako otkucate:
Ova opcija ograničava štetu koju biste mogli da načinite pomoću zadate komande. \h
To je naročito korisna opcija (na raspolaganju samo u alatki u kojoj se komande (Slovo h potiče od reči help.)
zadaju na komandnoj liniji) kada se kao početnik malo pribojavate rada u MySQL-u.
MySQL-ove i SQL-ove komande možete upisivati direktno ll MySQL monitor.
Možda bi bilo dobro daje koristite dok čitate ovu knjigu. (Konkretno, ova opcija vas
Ml'tlutim, te komande možete takođe uneti u datoteku koju zatim izvršite jednom
sprečava da ažurirate ili izbrišete redove u tabelama ako ne zadate vrednost primarnog
~ o111andom, kao skript. To ćete raditi u nastavku ove knjige, npr. kada u poglavlju 4,
ključa tih redova. Ako još ne znate šta to tačno znači, nemojte brinuti. Sve će postati
,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.
jasno u trećem delu knjige, "Upotreba MySQL-a".)
Ako ste prijavljeni u MySQL monitor, datoteku koja sadrži komande možete izvr-
Pošto se prijavite u MySQL, možete videti koje sve baze podataka postoje, ako dir kad otkucate:
zadate komandu SHOW:
""ree imedatoteke
show databases;
Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama možete
Kod većine čitalaca, u ovoj fazi rezultat ove komande biće kratak spisak baza poda- rr.vršiti preusmeravanjem rezultata te datoteke; na primer:
taka. Trebalo bi da se na vašem spisku pojavi baza podataka mysql. To je sistemska
my oql -u imekorisnika -p e imedatoteke
baza podataka u kojoj se čuvaju podaci o korisničkim nalozima i njihovim pravima.
Više reči o tome biće u nastavku ove knjige. Ovim ste stekli osnove o načinu upotrebe klijentskog programa mysql.
Obratite pažnju na to da se komanda završava znakom tačka i zarez. Većinu
komandi koje otkucate u MySQL monitoru morate završiti tim znakom inač e ih ažetak
MySQL neće izvršiti. Otkucajte:
• Najvažniji direktorijumi u instalaciji MySQL-ajesu bin (izvršni programi), data
show databases
(podaci iz baze podataka) i does (dokumentacija).
i zatim pritisnite Enter. MySQL će samo mirno čekati. Ako potom otkucate znak tačka
• Dva programa koja ćete n;Učešće koristiti jesu mysqld (MySQL server) i mysql,
i zarez i pritisnete taster Enter, komanda će biti izvršena. To omogućava da složene klijentski program u kojem se komande zadaju preko komandne linije.
komande raspodelite u više redova da bi bile čitljivije. Umesto znaka tačka i zarez,
• Možete birati između više korisničkih interfejsa, odnosno klijentskih programa.
možete upisati \g (obrnuta kosa crta i slovo g), ali većina koristi tačku i zarez.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafički
Možete izabrati neku bazu podataka sa liste i otkucati sledeću komandu:
interfejs) i phpMyAdmin (Web interfejs).
use imebaze; • Program mysql ima više korisnih opcija koje možete zadati na njegovoj komand-
(Upišite tačno ime baze kojoj želite da pristupite.) noj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje
Time navodite MySQL-u da želite da radite sa određenom baz<?m podataka. Izabe- s lozinkom), -h (kojom se zad;Ue ime udaljenog računara) i --i-am-a-dummy
rite jednu sa spiska i otkucaj te ovu komandu. (Možda nećete imati prava da pristupite (za ogranič:lvanjc moguće štete).
24 Poglavlje 2 Kratak obilazak
U sledećem poglavlju

• Pošto se prijavite na server, možete izdati komande SHOW DATABASES ili SHOW Vežbe
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta-
l'r t·uznute i instaliraj te neki grafički ili Web korisnički interfejs, kao što je MySQLCC.
bele da biste dobili podatke o određenoj tabeli.
Vt·zbajte prijavljivanje i prikazivanje spiska postojećih baza podataka pomoću klijent-
• Iz MySQL servera možete se odjaviti pomoću komande \q. lo~ programa koji ste izabrali .
• Komande možete završavati znakom ; ili znakovima \g da biste ih poslali servem
na izvršenje .
• Datoteku koja sadrži komande možete izvršiti iz klijentskog programa pomoću
Odgovori
komande source imedatoteke, ili izvan klijentskog programa- preusmerava-
njem rezultata datoteke.
fl1lanja
l. d
) a
Pitanja \. e
l. Program MySQL server nalazi se u l. e
a) direktorijumu does ili Does 'l . b
b) direktorijumu lib
e) direktorijumu scripts
d) direktorijumu bin
U sledećem poglavlju
l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri ćemo opšte kon-
2. Dokumentacija o MySQL-u nalazi se u
' qllt:u vezi s bazama podataka, terminologiju i principe projektovanja, uključujući i
a) direktorijumu does ili Does
rrnrrnalizaciju.Ako niste početnik u oblasti baza podataka, ali ste početnik u MySQL-u,
b) direktorijumu lib '" rrtorate detaljno pročitati to poglavlje.
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 završavaju znakom tačka i zarez
b) komande treba da se završavaju znacima \g
e) može a) ili b)
d) ništa od prethodnog nije tačno
5. Opcija --i-am-a-dummy zadata u programu mysql
a) znači tačno to što piše
b) sprečava me da napravim previše štete dok učim SQL
e) sprečava me da uradim bilo šta osim prijavljivanja i odjavljivanja
d) ništa od prethodnog nije tačno
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

U OVOM POGLAVLJU RAZMOTRIĆEMO osnovne principe projektovanja i normali-


lu\,lllja baza podataka. U dobro projektovanoj bazi podataka redundantnost (dupli-
' tll)t') podataka svedeno je na minimum, ali bez gubljenja podataka. To znači da će naš
'riJ hrt i što manji utrošak prostora na disku uz očuvanje svih veza koje postoje između
1'•HI.1taka.
R.1zmotrićemo sledeće teme:

• Koncepti i terminologija baza podataka


• Principi projektovanja baza podataka
• Normalizovanje i normalne forme
• Vcžbe 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
l hnovni elementi koje ćemo pokušati 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, možemo se opredeliti da evidentiramo podatke o zaposle-

111111.1 i službama u kojima rade. U tom slučaju bi zaposleni bio jedan entitet, a služba
11 ~nJoj radi- drugi. Relacije su veze koje postoje između entiteta. Na primer, zaposleni
t,tdi ll službi. "Radi u" je relacija (veza) između entiteta zaposleni i služba.
ltdacije mogu biti različitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla više" (ili "više prema jedan", u zavisnosti od toga s koje strane relacije posma-
lt,tlt') 1., više prema više". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.
JU ruyraVIJI:: J VUILdfll ~ur~ fHUJI::~lUVdiiJd UdLd JJUUdld~d Koncepti 1 termrnologiJa oaza podataka

Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s pisaćim stolom, to bi l.tbele
bila relacija tipa ,jedan prema jedan". U primerima kao što je navedeni, ta veza "radi u" ~ tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database
češće je tipa "više prema jedan", tj. više zaposlenih radi u datoj službi .Tc dve vrste rela- \ ltiiWgement System, RDBMS), što znači da podržava baze u kojima postoje relacije
cija prikazane su na slici 3.1. 1 111\!du podataka koji se čuvaju u tabelama (engl. tables). Ako ste ikada koristili neki
i'ln~ram za tabelarne proračune, svaki njegov radni list ima oblik tabele s podacima.
11111llCr tabele je prikazan na slici 3.2.

emolovee
em loveeiD name ob departmentiD
~g
Noro edwards Programmer
1

Ben Smith
1
OBA l~
6651 Ajay Palal Programmer 128
!016 Candy Burnett Systems Administrator 128

Slika 3.2 U tabeli employee (zaposleni) čuvaju se šifre zaposlenih (employee ID),
Istraživanje i razvoj imena (name), poslovi kojima se bave Gob) i službe u kojima rade (departmentiD).

Kao što vidite, ova tabela sadrži podatke o zaposlenima u jednoj kompaniji. (Nisu
pr1bzani podaci o svim zaposlenima, već samo nekoliko primera.)

Kolone ili atributi


l J tabelama baze podataka, svaka kolona ili atribut opisuje određeni podatak koji se
Candy
-Jr________.____", 11.d.tzi u svakom redu tabele. Reči kolona (engl. column) i atribut (obeležje, engl. attri-

~~'
Nora
/111/r) koriste se kao sinonimi, ali tačnije je reći 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.

~-------'----"'
:ru.~.
B dovi, zapisi i n-torke
l'o~ledaj te ponovo tabel u employee. Svaki red te tabele predstavlja zapis o jednom
t.tposlenom. Možda ćete čuti izraze redovi (engl. rows), slogovi ili zapisi (engl. records)
Ajay 11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadrži podatke iz svih kolona tabele.

Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan". Ključevi
Relacija "radi u" jeste tipa "više prema jedan". ..,. IIJII'rkijuč (engl. superkey) je kolona (ili grupa kolona) koja jednoznačno identifikuje red
t.tbele. Ključ (engl. key) je minimalni superključ. Pogledajte tabel u employee. Da bismo
)l'dnoznačno identifikovali svakog zaposlenog, možemo upotrebiti kombinaciju kolona
Imajte u vidu da entiteti, relacije i vrste relacija među njima zavise od okruženja i
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
poslovnih pravila koje pokušavate da modelujete. Na primer, u nekim firmama jedan
tkpartmentiD). Obe kombinacije su superključevi.
zaposleni može raditi u više službi. U tom slučaju bi relacija "radi u" bila tipa "više
Međutim, da bismo jednoznačno identifikovali svaki red tabele, nisu nam potrebne
prema više". Ako više ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u"
sve te kolone, već je dovoljna samo jedna (na primer) employeeiD, odnosno mini-
nije tipa "jedan prema jedan".
Illa ina grupa kolona pomoću koje nedvosmisleno identifikujemo svaki red. Prema
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja važe u sistemu
tome, ključ je kolona employeeiD.
koji modelujete. Ne postoje dva potpuno jednaka sistema.
Pogledajte ponovo tabelu employee. Jednog zaposlenog možemo identifikovati po
1111enu (name) ili po šifri zaposlenog (employeeiD). Obc kolone su ključevi. Tc klju
(·l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogući bndid~ti
1.( t'UYičlVIJC:: J UUfLčlnl KUf~ prUJC::KlUVčlnJčl UčlLčl pUUčllčlKčl nmc1p1 prUJC::KlUVčlnJčl UčlLčl pUUtlliiKil

među kojima ćemo izabrati primarni (engl. pri mary) ključ. Primarni ključ je kolona ili H dundantnost i gubljenje podataka
grupa kolona pomoću koje ćemo jednoznačno identifikovati pojedine redove tabele. l Hla projektujemo šemu baze podataka, to moramo uraditi tako da redundantnost
U ovom slučaju, za tu namenu koristićemo kolonu employee ID. To je bolji ključ od Jlndataka bude minimalna, ali da pri tome ne izgubimo nijedan podatak koji namje
kolone name jer se često događa da dve osobe imaju isto ime i prezime. 111 llphodan. Redundantni podatak u ovom kontekstu znači da se isti podatak ponavlja
Spoijni ključevi (engi.Joreign keys) predstavljaju veze između tabela. Na slici 3.2 vidite 11 1azličitim redovima iste tabele ili u različitim tabelama baze podataka.
da kolona departmentiD sadrži brojeve koji predstavljaju šifre službi u kojima rade Zamislite da umesto dve tabele, employee (zaposleni) i department (službe), imamo
zaposleni. To je spoljni ključ; skup svih podataka o određenoj službi čuva se u drugoj 11110 jednu tabelu koja se zove employeeDepartment. To možemo izvesti ako tabeli
tabeli, u kojoj je primarni ključ kolona departmentiD. • IIIJlloyee dodamo kolonu departmentName tako da šema tabele postaje sledeća:
cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)
Funkcionalne zavisnosti Za svakog zaposlenog koji radi u službi čiji je šifra 128, Research and Development
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ređe nego drugi koje (htt.1Živanje i razvoj), moramo da ponovimo podatak "Research and Development"
smo naveli, ali treba da shvatite njegovo značenje da biste razumeli postupak normali- ( Irb 3.3). Isto važi i za sve ostale službe kompanije.
zavanja o kojem će biti reči u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost između kolone A i kolone B, koja
employeeDepartment
se može napisati kao A -7 B, vrednost u koloni A određuje vrednost u koloni B. Na employeeiD name ob de artmentiD de artmentName
ora_t:a_war s rogrammar ~.esearcn ana Ue\le opment
~~~ ·~
1

primer, u tabeli employee, kolona employeeiD funkcionalno određuje ime zaposlenog 6651
Ben Smith
~ayPatet
OBA
Programmer 128
Fmance
Research and Development
Research and Development
(a u ovom primeru i sve druge atribute). 9006 Candy Burn eU Systems Administrator 128

Slika 3.3 Ova šema dovodi do redundantnosti (ponavljanja) podatka


Šeme o nazivu službe.
Izraz šema ili šema baze podataka (engl. database schema) označava strukturu ili dizajn
baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke. Ovu šemu možemo da izmenimo na sledeći način:
Da bi vam bilo jasnije, šema je "nacrt strukture" podataka koji se čuvaju u bazi. t•mployee(employeeiD, name, job, ~-~P.~r_t_l?}!'!.~-~l:Q)
Šemu jedne tabele u bazi podataka pišemo na sledeći način: dcpartment(departmentiD, name)
employee (employeeiD, name, j ob, ~-~P.~r_t_I?!!'!.~_nR)
U ovom slučaju se naziv službe čuva na samo jednom mestu, pa se minirnizuje
U ovoj knjizi držaćemo se pravila da se atributi koji predstavljaju primarne ključeve 1111 ošak prostora na disku i izbe gavaju određeni problemi.
podvlače punom linijom, a atributi koji predstavljaju spoljne ključeve - tačkastom. Pri-
Obratite pažnju na to da smo morali da ostavimo kolonu departmentiD u tabeli
marni ključevi koji su istovremeno i spoljni, podvlače se i punom i tačkastom linijom. • 111ployee; bez nje bismo izgubili informaciju iz šeme, odnosno u ovom slučaju bismo
1/~llbili vezu između zaposlenog i službe u kojoj radi. Kada poboljšavamo šemu baze

Principi projektovanja baza podataka Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali
Kada projektujemo bazu podataka, moramo razmotriti dva važna pitanja: lll'z gubljenja informacija.

• Koje sve podatke treba čuvati, odnosno o kojim sve stvarima ili entitetima Anomalije
moramo da čuvamo podatke? /\11omalije su nešto složeniji koncept. To su problemi koji se pojavljuju među poda-
• Koju ćemo vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se ' 1111.1 zbog loše osmišljene strukture baze podataka. Mogu se pojaviti tri vrste anoma-
upiti.) lq.t, koje ćemo opisati na primeru loše osmišljene Šeme sa slike 3.3.
Kada tražimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila
organizacije koju pokušavamo da modelujemo, o čemu sve moramo da čuvamo Anomalije pri dodavanju podataka
Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loše osmišljenom struktu-
podatke i koje su veze između tih podataka.
llllll pokušate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji
Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka čija će
poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da
struktura biti takva da isključuje strukturne probleme kao što su redundantnost (dupli-
1111csemo i šifi-u i naziv službe u kojoj radi. Šta se događa ako unesemo podatke koji se
ranje) podataka i anomalije podataka.
1,wlrkujr1 od postojećih u tabeli, npr. ako upišemo da novi zaposleni radi u službi čija
Jl' sili .1 42, J evl'lopment? Nakon toga više neće biti jasno koji redovi tn bele sadrže
1\jli.IVIIl' pod.1tkt• 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOŠl'IIJll pod;~(;1k;l.
ll t'll91ilVIJe J uorzant Kurs proJeKwvanJa oaza pooaraKa NormattzovanJe

Anomalije pri brisanju podataka employee


employeoiD name ob dopartmentiD skills
Anomalije pri brisanju podataka nastaju kada se podaci brišu iz tabele s loše osmišlje- Nora Edwards Programmer
1~
~~ Ben Smith OBA
1 ~~en. Java

nom strukturom. Zamislite da svi zaposleni iz službe čija je šifra 128 daju otkaz (možda 6651
9006
,AJay Palal
Candy Burnett
Programmer
Systems Administrator
128
128
VB, Java
NT, Linu)(
zato što im je sve dojadilo). Pošto izbrišemo sve zapise o tim zaposlenima, više nemamo
nijedan zapis u kojem se pominje služba sa šifrom 128, niti njeno ime. To je primer Slika 3.4 Ova Šema nije u prvoj normalnoj formi zato što kolona
skills sadrži grupu vrednosti.
anomalije pri brisanju.

Anomalije pri ažuriranju podataka Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
Anomalije pri ažuriranju podataka nastaju kada se ažuriraju podaci u tabeli s loše osmi- d.1sadrži prostu vrednost kao što je Java, kolona sadrži listu vrednosti, kao što je e,
šljenom strukturom. Zamislite da je rukovodstvo donelo odluku da služba čija je šifra l ' t l , Java. Time je prekršena pravilo prve normalne forme.
128 promeni ime u EmergingTechnologies. U tom slučaju moramo izmeniti podatke Da bismo ovu šemu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
pojedinačno za svakog zaposlenog koji radi u toj službi. Lako se može dogoditi da nekog 11 koloni skills na proste elemente. To se može obaviti na više načina. Prvi i možda naj-
izostavimo.Ako se to desi, imaćemo anomaliju pri ažuriranju. ' n tglcdniji način prikazan je na slici 3.5.

Null vrednosti emclovee


Poslednje pravilo dobrog projektovanja baza podataka nalaže da treba izbegavati šeme employeeiD Name
IJ\Iora ~dwards
ob del'_artmentiD skill
~~:~ :~ l ~eri
1 ~rogrammer

koje dozvoljavaju veći broj nepopunjenih atributa. Ako želimo da evidentiramo da na 7513
Nora Edwards
Nora Edwards
Pro grammar
Pro grammar 12e Java
9642 Ben Smith OBA 42 082
svakih sto ili više zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee 6651 Ajay Patel Programmer 12e VB
6651 Ajay Patel Pro grammar 128 Java
ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta 9006 Candy Burnett Systems Administrator 12e NT
9006 Candy Bumett Systems Administrator 12e Linux
kolona sadržala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se
čuvale šifre i kvalifikacije samo zaposlenih koji ih imaju. Slika 3.5 Sve vrednosti sada su proste.

U ovom slučaju napravili smo jedan red po stručnoj kvalifikaciji. Ova šema je sada
Normalizovanje 11 prvoj normalnoj formi.
Normalizovanje je postupak koji omogućava ispravljanje loše osmišljene strukture Razume se, ova organizacija podataka je daleko od savršene jer imamo veliku
baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, što su ~t • dundantnost- za svaku kombinaciju stručna kvalifikacija/zaposleni u tabeli čuvamo
grupe pravila o tome šta treba i šta ne treba da bude u strukturama tabela. Tokom ~ VL' podatke o zaposlenom.
postupka normalizovanja, tabele se razbijaju na manje tabele koje čine bolju strukturu. Bolje rešenje i pravilan način organizovanja ovih podataka u prvu normalnu formu
Da biste pratili postupak normalizovanja, na strukturu baze podataka primenićemo prikazano je na slici 3.6.
redom sve tri normalne forme. U svakoj nomalnoj formi obično se polazi od pretpo-
stavke daje šema baze podataka već u prethodnoj normalnoj formi. Da bi baza poda- employee
taka bila u drugoj normalnoj formi, mora prethodno biti dovedena u prvu normalnu employeeiD name ob departmentiD
1 Nora Edwards ':'rogrammer
~:~ l~
1

formu a da bi bila u trećoj normalnoj formi, mora prethodno biti dovedena u drugu 6651
Ben Smith
Ajay Patel
OBA
Pro grammar 12e
9006 Candy Burnett Systems Administrator 12e
normalnu formu itd. U svakoj fazi normalizovanja dodajemo nova pravila koja Šema
mora da ispuni. employeeSkills
employeeiD skill

Prva normalna forma ~~:; lGPerl


7513 Java
9642 082
Prva normalna forma, koja se ponekad naziva i l NF, propisuje da svaka vrednost atri- 6651 VB
6651 Java
buta ili kolone mora biti prosta. To znači da svaki atribut mora sadržati samo jednu 9006 NT
9006 Linux
vrednost, a ne kom.binaciju više vrednosti ili drugi red baze podataka.
Pogledajte tabelu na slici 3.4. Slika 3.6 Pravilno rešenje istog problema je pravljenje
To je nenorm.alizovana verzija tabele employee koju smo razmatrali u prethodnim dodatne tabele.
odcljcima. Kao što vidite, dodata je nova kolona, skills, u kojoj su navedena stručna
znanja svakog zaposlenog.
Jb t"ogtaVIJe J uorzan1 Kurs proJeKtovanJa oaza poaaiaKa Normalizovanjc

U ovom primeru, preneli smo stručne kvalifikacije u zasebnu ta belu koja služi '!''::!belu moramo razdvojiti na više tabela u kojima su svi atributi koji nisu deo pri -
samo da poveže šifre zaposlenih s pojedinim kvalifikacijam.a. Time smo rešili problem liLl rnog ključa funkcionalno potpuno zavisni od primarnog ključa. U ovom slučaju je
redundantnosti. ''' 1glcdno da to možemo postići ako tabelu razdvojimo na dve tabele:
Možda se pitate kako smo došli do drugog rešenja. Postoje dva odgovora.Jedan je: employee(employeeiD, name, job, departmentiD)
na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka <.'mployeeSkills( employeeiD, skill)
-----------------
normalizovanja na šemu sa slike 3.5; u tom slučaju, na kraju dobijamo Šemu sa slike 'lb je Šema prikazana na slici 3.6.
3.6. Prednost iskustva je to što omogućava predviđanje i direktan prelazak na prav1lnu
Kao što je već opisano, ova šema je u prvoj normalnoj formi zato što su sve vred-
strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.
ll osti proste. Ona je takođe u drugoj normalnoj formi zato što svaki atribut koji nije
dl' o primarnog ključa sada je potpuno zavisan od svih delova primarnog ključa.
Druga normalna forma
Pošto postavimo šemu u drugu normalnu formu, možemo je preneti u naredne nor- Ir ·ća normalna forma
malne forme višeg stepena, koje se nešto teže razumeju. I'1111Ckad ćete čuti nekoga da kaže: "Normalizovanje se tiče ključa, celog ključa i ničeg
Kaže se daje šema u drugoj normalnoj formi (koja se takođe zove 2NF), ako su svi
t11t1gog osim ključa". Druga normalna forma nalaže da atributi moraju zavisiti od
atributi koji nisu deo primarnog ključa funkcionalno potpuno zavisni od primarnog 1 1 log ključa. Treća normalna forma propisuje da atributi zavise samo od ključa.
ključa i šemaje već u prvoj normalnoj formi. Šta to tačno znači? To znači da svaki atri-
1:ormalno, da bi Šema bila u trećoj normalnoj formi (3NF), moramo ukloniti sve
but koji nije deo primarnog ključa mora biti funkcionalno zavisan od svih delova pri- li.lllzitivne zavisnosti i šema mora već biti u drugoj normalnoj formi. U redu, ali šta je
marnog ključa, tj. ako primarni ključ čini više kolona, svi ostali atributi tabele moraju lidll:titivna zavisnost?
biti zavisni od kombinacije svih tih kolona. Pogledajte ponovo sliku 3.3. Prikazana je sledeća šema:
Pogledajmo primer da bi postalo jasnije. l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Pogledajte sliku 3.5. U toj šemi, tabela sadrži jedan red po zaposlenom i po stručnoj
kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog čega? Ova Šema sadrži sledeće funkcionalne zavisnosti:
Šta je primarni ključ te tabele? Znamo da primarni ključ mora jednoznačno identifi- l'mployeeiD -7 name, job, departmentlD, departmentName
kovati svaki red tabele. U ovom slučaju, to je moguće samo pomoću kombinacije kolona dcpartmentiD -7 departmentName
employeeiD i skills. Ako je sadržaj kolone skills kao na slici, kolona employeeiD nije Primarni ključ je employeeiD i svi atributi funkcionalno su potpuno zavisni od
dovoljna za jednoznačno identifikovanje redova jer, na primer, vrednost em.ployeeiD "l''ga, što je lako razumljivo jer se primarni ključ sastoji od samo jednog atributa.
7513 postoji u tri reda. Međutim, pošto kombinacija vrednosti u kolonama employeeiD Međutim, vidljivo je i to da imamo:
i skills jednoznačno identifikuje svaki red, upotrebićemo je kao primarni ključ. Tako l'mployeeiD -7 departmentName
dolazimo do sledeće šeme:
l'tnployeeiD -7 departmentiD
employee(employeeiD, name, job, <J.e_p_'!l_'m"!~Đ~_I_.Q, skill)
Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom
dcpartmentiD -7 departmentName
slučajuimamo:
employeeiD, skill -7 name, job, departmentiD Obratite pažnju i na to da atribut departmentiD nije ključ.
ali i Ovaj odnos znači da je funkcionalna zavisnost employee ID -7 departmentName
employeeiD -7 name, job, departmentiD li,lllzitivna zato što postoji "međukorak" (zavisnost departmentiD -7 departmentName) .
Da bismo došli do treće normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Drugim rečima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo Kao i u prethodnim formama, da bismo došli do treće normalne forme, tabel u raz-
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znači da su ti atri- dv.l_J.lmo na više drugih tabela. U ovom slučaju takođe, prilično je očigledno šta bi trc-
buti funkcionalno samo delimično zavisni od izabranog primarnog ključa, odnosno lo.do da uradimo. Šemu d elimo na dve tabele, employee i department, na sledeći način:
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog ključa a
l'mployee(employeeiD, name, job, ~_<:p_~:~~~~-~-t_I_J?.)
njegova cela vrednost nije neophodna. Prema tome, ova šema nije u drugoj normalnoj
d cpa rtmcnt( d epa rtmen t ID, departmentN ame)
formi.
Sledeće pitanje je: "Kako bismo je doveli u drugu normalnu formu?"
'18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
Pitanja 3

To nas vraća na šemu tabele employee prikazanu na slici 3.2. Ona je u trećoj nor- l'rmcipi projektovanja baza podataka
malnoj formi.
• Redundantnost se mora minimizovati, ali bez gublje~a podataka.
Drugi način da opišemo treću normalnu formu jeste da kažemo sledeće: fo~maln~,
ako je šema u trećoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh, • Anomalije pri dodavanju, brisanju i ažuriranju jesu problemi koji se pojavljuju
ispunjen je jedan od sledeća dva uslova: kada se u tabelu s loše osmišljenom strukturom podaci dodaju, brišu iz nje ili
ažuriraju .
• Leva strana funkcionalne zavisnosti je super ključ (tj. ključ koji nije obavezno
• lzbegavajte strukture koje dovode do velikog broja null vrednosti.
minimalan).
ili Normalizovanje
• Desna strana funkcionalne zavisnosti je deo svakog ključa te tabele.
• Normalizovanje je formalni postupak koji omogućava poboljšava~ e strukture
Drugi uslov se ne pojavljuje baš tako često! U većini slučajeva, sve funkcionalne baze podataka.
zavisnosti biće obuhvaćene prvim uslovom.
• Prva normalna forma (lNF) znači da kolone ili atributi sadrže isključivo proste
vrednosti.
Boyce-Coddova normalna forma
Poslednja forma koju ćemo - ukratko- razmotriti jeste Boyce-Cod~ova normalna • Druga normalna forma (2NF) znači da svi atributi izvan ključa mor;Uu zavisiti od
celog ključa.
forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh ~mo ~~a usl.ova.
Da bi tabela bila u BCNF, mora biti u trećoj normalnoj formi i mora 1spumt1 prv1 od • Treća normalna forma (3NF) znači da ne sme biti tranzitivnih zavisnosti.
dva uslova, tj. sve funkcionalne zavisnosti moraju imati superključ na levoj strani. • IJoyce-Coddova normalna forma (BCNF) znači da svi atributi moraju biti funk-
Taj uslov je često automatski ispunjen i bez pred uzimanja posebn~hv mera, kao u cionalno određeni superključem.
ovom primeru. Ako imamo zavisnost koja krši ovo pravilo, moramo j OS jednom raz-
dvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF. Pitanja
Superklj uč je
Normalne forme višeg stepena ..
Postoje i normalne forme viših stepena (četvrta, peta itd.) ali su one pogodmje za aka- a) Minimalni ključ
demske rasprave nego za praktičnu primenu na projektovanje b~za podataka. 3NF b) Spoljni ključ
(ili BCNF) sasvim. je dovoljna da reši te probleme redundantnost1 podataka na koje e) Grupa atributa koja jednoznačno identifikuje svaki red tabele
ćete naići.
d) Minimalna grupa atributa koja jednoznačno identifikuje svaki red tabele
1
Ako je tabela u drugoj normalnoj formi
Sažetak a) Takođe je u prvoj normalnoj formi
Za kraj, evo šta smo sve razmotrili u ovom poglavlju. b) Takođe je u trećoj normalnoj formi
e) Ne sadrži tranzitivne zavisnosti
Koncepti
d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa
• Entiteti su "stvari", a relacije su veze imeđu njih . l, Ako je tabela u trećoj normalnoj formi
• Tabele sadrže podatke koji se prikazuju u tabelarnom obliku.
a) Takođe je u Boyce-Coddovoj normalnoj formi
• Kolone tabela su atributi (obeležja) koji opisuju svaki entitet. b) Sadrži atribute koji nisu prosti
• Redovi tabela sadrže vrednosti iz svih kolona tabele .
e) Ne sadrži tranzitivne zavisnosti
• Ključevi omogućavaju jednoznačno identifikovanje pojedinih redova.
d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa
• Funkcionalne zavisnosti opisuju koji atributi određuju vrednosti drugih atributa. •1. Tri vrste anomalija nastaju pri
• Šeme su "nacrti" baze podataka.
a) dodavanju, učitavanju i brisanju podataka
b) dodavanju, ažurira~u i brisanju podataka
e) učitavanju, ažuriranju i brisanju podataka
40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka

4
5. N-torka je
a) kolona
b) red
e) kandidat za ključ
d) vrsta narodnog kola
e) spoljni ključ
Pravljenje baza podataka,
Vežbe tabela i indeksa
1. Normalizujte sledeću šemu u treću normalnu formu:
Porudžbine(šifraKupea, imeKupea, adresaKupea, brojPorudžbine, datumPorudž-
bine, šifraRobe, nazivRobe, količinaRobe)
2. Pokušajte da osmisli te šemu koja je 3NF ali ne i u BC NF.

Odgovori u O VO M POGLAVLJU NAUČIĆETE


da pravite osnovne MySQL strukture: baze
tabele i indekse. Razmotrićemo sledeće teme:
1tlld,nnka,

Pitanja • Pravljenje baze podataka


1. e • Biranje baze podataka
2. a • Pravljenje tabela
3. e • Tipovi podataka za MySQL-ove kolone
4. b • Pravljenje indeksa
5. b (postoji narodno kolo koje se zove šestorka) • l3risanje tabela, indeksa i baza podataka
• lzmena postojećih struktura tabela.
Vežbe /.a rad s primerima u ovom poglavlju koristićemo jednostavnu bazu podataka: to je
1. 1:,1 podataka employee o kojoj je već bilo reči u prethodnom poglavlju. Šema te baze
Kupei(šifraKupea, imeKupea, adresaKupea) l"'d .1t~kaje sledeća:
Porudžbine(brojPorudžbine, datumPorudžbine, ~~~~~':~~~-~) t·mployee(employeeiD, name, job, ~~p-~:~~~-r:~_I_l2)
StavkePorudžbine(k:~i_~-~:_l!_~~~~~~.' ~~~~~?_<:• količinaRobe) t k·pa rtment( departmentiD. name)
Roba(šifraRobe, nazivRobe)
t•mployeeSkills(employeelD, skill)
2. Postoji puno mogućih rešenja, proverite samo da vaše ne krši pravila
tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)
normalizovanja.
. l ssi gnmcnt(~}~~~-~~~.' ~-~J?!~Y~:!:'?.· workdate, hours)
U sledećem poglavlju l >ok čitate gradivo iz ovog poglavlja, možete unositi odgovarajuće komande da biste
U poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", pretvorićete Šemu baze lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse
podataka u stvarne MySQL tabele. 11111/l'tc praviti pomoću bilo kojeg klijentskog programa za MySQL, ali u ovim primc-
' lllt.l , bazu podataka napravićemo pomoću 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 Biranje baze podataka

Trebalo bi da se najpre prijavite u MySQL monitor, na isti način na koji ste to činili l lgl.tvnom, identifikatori mogu sadržati sve znakove koji postoje, osim sledećih:
u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak". • /.nakove navoda, znakove ASCII(O) i ASCII(255).
U ovom poglavlju koristi ćemo mogućnosti za definisanje podataka koje pruža jezik
• Imena baza podataka mogu sadržati sve znakove koji su dozvoljeni u imenima
SQL da bismo pravili baze podataka, tabele i indekse. Šta to tačno znači? SQL je skra-
1hrcktorijuma, ali ne i znakove koji imaju posebno značenje u imenima direkto-
ćenica od Structured Query Language (strukturirani jezik za upite), što je jezik koji
1 Uu ma (/, \ i .) , iz očiglednih razloga.
ćemo koristiti za izradu relacionih baza podataka i učitavanje podataka iz njih. Čine ga
dve semantički odvojene komponente: jezik za definisanje podataka (engl. Data Difini- • Imena tabela mogu sadržati sve znakove koji su dozvoljeni u imenima datoteka,
tion Language, DDL), koji omogućava formiranje struktura baze podataka), i jezik za rad osi m znakova . i l.
s podacima (engl. Data Manipulation Language, DML), koji omogućava pretraživanje ~vi identifikatori, osim alijasa, mogu se sastojati od najviše 64 znaka. Imena alijasa
baze podataka. (opt~ani su u poglavlju 7 ",Složeniji upiti") mogu sadržati najviše 255 znakova.
U narednim odeljcima saznaćete kako se u MySQL-u prave baze podataka, tabele jt•dno neobično pravilo u MySQL-u glasi da možete koristiti rezervisane reči kao
i indeksi. lo tlllflkatore, pod uslovom da ih pišete između navodnika. Na primer, možete imati
l ''" lu čije je ime TABLE . Razume se, ako je nešto dozvoljeno, to ne znači da to morate
'd •.t vezno i raditi, a u ovom slučaju, navedenu praksu bolje je izbegavati. Čak i ako se
Razlikovanje malih i velikih slova t 11 tome dobro snalazite dok radite s MySQL-om, to može zbuniti program mysql-
Pre nego što započnemo upotrebu jezika SQL i definišemo identifikatore MySQL-ovih d11111p, koji se često koristi za izradu rezervnih kopija baze podataka.
objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u.
!'ostoji kratak spisak rezervisanih reči koje MySQL prihvata kao identifikatore bez
U rezervisanim rečima jezika SQL ne pravi se razlika između malih i velikih slova.
tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je prilično uobičajeno u
To je standardno u svim sistemima za rad s bazama podataka.
' tkodnevnim poslovima. Najčešći primeri na koje ćete nailaziti su upotreba rezervi-
Da li će MySQL praviti razliku između malih i velikih slova u imenima baza poda- litt h reči DATE i TIMESTAMP za imena kolona.
taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to što će
najčešće svakoj bazi podataka odgovarati određeni direktorijum, a svaka tabela biće
smeštena u odgovarajaću datoteku. Imena tih direktorijuma i datoteka slede različita Pravljenje baze podataka
pravila, koja zavise od operativnog sistema. ~~.tkon projektovanja strukture baze podataka, naredni korak je, savim logično, da
To praktično znači da ako koristite Windows, u imenima baza podataka i tabela neće "l' t semo MySQL-u da želimo da napravimo novu bazu podataka. To se radi pomoću
se praviti razlika između malih i velikih slova, ali će suprotno pravilo važiti ako koristite '><>L-ove komande CREATE DATABASE, na sledeći način:
neki operativni sistem iz porodice Unix. To može biti uzrok zbrke, naročito ako je vaš • ~~ate database employee;
operativni sistem OS X, koji možete podesiti tako da ne pravi razliku između malih i
Da li je ova komanda uspešno izvršena, možete proveriti ako izdate komandu:
velikih slova (HFS+, standardno podešavanje), ili naprotiv, da je uzima u obzir (UFS).
rhow databases;
Da biste smanjili mogućnost zbrke, korisno je da se naviknete da sve identifikatore
tretirate kao da je uključeno razlikovanje malih i velikih slova, čak i pod operativnim Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
sistemom Windows. To će vam omogućiti da lako pređete na drugu platformu. 11,1 vašem računaru .
Namerna upotreba dva različita oblika istog identifikatora, npr. Zaposleni i zaposleni, Sada imate praznu bazu podataka koja čeka da u njoj napravite nekoliko tabela.
može 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 reči u
nastavku teksta) nikad ne pravi razlika između malih i velikih slova.
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 našoj novoj bazi
ldentifikatori u MySOL-u podataka. To se radi pomoću komande use, na sledeći način:
Identifikator je opšta reč koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili noe employee;
indeksa. To je način da se nedvosmisleno identifikuje određeni objekat. Pre nego što
Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvršimo od
počnete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifika-
s.tda pa nadalje, podrazumevaće se da se odnose na tu bazu podataka .
tori ispravni u MySQL-u.
44 Pog lavlje 4 Pravljenje baza podataka, tabela i indeksa t'raviJenJe tiltlcla

·u•ltactPerson varchar ( 80) ,


Pravlj enje tabela t'lmtac tNumber char(l2)
Tabele u bazi podataka employee napravićemo pomoću SQL-ove komande CREATE ype= InnoDB;
TABLE. Uobičajen oblik te komande je sledeći:
tle table assignment
create table imetabele ( definicije kolona tabele ) [type=tip_tabele];

Kao što vidite, komanda počinje rečima create table, iza kojih sledi ime tabele 1 l lentiD int not null references client (clientiD),
koju bismo želeli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na • 111ployeeiD int not null references employee (employeeiD),
WtJr·kda te date not null,
kraju komande možete po potrebi zadati tip mašine baze podataka koji biste želeli da
liours float,
se koristi. 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 Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci.
SQL-ovih komandi koja formira bazu podataka employee. Unesite ih ručno, ili preuz- l'očc ćemo od:
mite datoteku (zajedno s nešto pro bnih podataka za bazu) sa Web lokacije posvećene ol t op database if exists employee;
ovoj knjizi.
()va komanda ispituje da li već postoji baza podataka čije je ime employee; ako
Listing 4.1 SQL-ove komande koje formiraju bazu podataka employee l'" ' toji, ona se briše, što vam "priprema teren", ako se tako može reći. To nije baš
111oph odno i može biti čak i opasno, ali ovde smo to uradili da bismo obezbedili da
drop database if exists employee;
111"·'1 skript za izradu baze podataka uvek bude delotvoran, čak i ako ste ranije nešto
create database employee;
l ' pcrim.entisali s bazom podataka employee.
use employee; Ukoliko MySQL koristite u okruženju čiji niste vlasnik, može se dogoditi da kom-
l'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop
create table department 1.11 , ba se. U tom slučaju uklonite taj red iz skripta (ali proverite da ne postoji baza
(
pnd.ltaka čije je ime employee) .
departmentiD int not null auto increment primary key,
name varchar(30) Z atim fonniramo bazu podataka i otvaramo je (biramo da je koristimo), kao što ste
type=InnoDB; 1 1111j c radili:
11 c1te database employee;
create table employee 11w employee;

employeeiD int not null auto increment primary key, Sada počinjemo izradu tabela unutar te baze podataka. Najpre pravimo tabelu
name varchar(BO), 'it'partment, na sledeći način:
job varchar (30), 1" 1 .a te table department
departmentiD int not null references department(departmentiD) (
type=InnoDB; departmentiD int not null auto increment primary key,
name varchar(20)
create table employeeSkills Lype =InnoDB;
employeeiD int not null references employee(employeeiD), Ova tabela ima dve kolone, departmentiD (šifra službe), koja je primarni ključ,
skill varchar(l5) not null, 1 tl.lmc (naziv službe). Kolone tabele deklarišemo tako što zadamo listu deklaracija
primary key (employeeiD, skill) kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne
type=InnoDB;
111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona.
create table client Ovo je naša prva SQL komanda koja se rasprostire u više redova. Budući da su
ll.il'ziku SQL razmaci nebitni, komande možemo pisati u obliku koji nam najbolje
client ID int not null auto increment pri mary key', od govara. Uobičajeno je da se stavke komande CREATE pišu svaka u svom redu, da bi
name varchar(40), l l'l,l komanda bila č itUivija . Interpretator jezika QL ne ć e pokušati da rastuma č i vaŠlt
address varchar(lOO),
46 !'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa l'raviJenje tabela

komandu dok ne otkucate završni znak tačka i zarez (;) i pritisnete taster Enter. Šta to tačno znači? MySQL podržava razne mašine baze podataka, koje ćemo detalj
(Možete se opredeliti i da komande završavate znacima \g, ali se znak tačka i zarez nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
znatno češće koristi.) Ako želite da koristite My ISAM tabele, nije neophodno da na kraj komande create
U ovoj tabeli deklarišemo dve kolone. Svaka deklaracija kolone počinje imenom database dodate odredbu type.
kolone, za čime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu U ovom slučaju potrebne su nam InnoDB tabele zato što ćemo u nekoliko primera
kolonu ovog primera jer se nešto lakše razume. Deklaracija koristiti spoljne ključeve. Mašina baze podataka InnoDB podržava spoljne ključeve i
name varchar(20) lra nsakcije, što nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele često
H l brže od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znači
Mogli smo da zadamo tabele različitih tipova i da imamo, na primer, nekoliko
daje u pitanju znakovna vrednost promenljive dužine, koja u ovom slučaju može
lnnoDB tabela i nekoliko MyiSAM tabela (pa čak i tabele još nekih drugih tipova,
sadržati najviše 20 znakova. Mogli smo da zadamo i tip char, što je znakovna vrednost
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi ćemo isključivo
fiksne dužine. Bez obzira na to da li zadate varchar ili char, način rada s tim poda-
lnnoDB tabele.
cima se neće razlikovati, jedina razlika je u obliku u kojem se ti podaci smeštaju u
Pogledajmo drugu komandu create table:
memoriju. Podatak tipa varchar (2 o) zauzima onoliko prostora koliko je potrebno za
skladištenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna- crea te table employee
kova, bez obzira na to da lije u njega smeštena bilo kakva vrednost.Više o relativnim
employeeiD int not null auto_increment primary key,
prednostima i nedostacima ovih tipova podataka biće reči odeljku "Tipovi podataka u name varchar(BO),
kolonama", u nastavku ovog poglavlja. job varchar (15) ,
Pogledajmo sada definiciju prve kolone, koja izgleda ovako: departmentiD int not null references department(departmentiD)
t ype=InnoDB;
departmentiD int not null auto_increment primary key,
U ovoj komandi samo je jedan deo sintakse nov. Posle dnja kolona tabele employee
Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj
JL' šifra službe (departmentiD) u kojoj zaposleni radi. To je spoljni ključ. U definiciji
(ne ponavlja se) koji ćemo koristiti za identifikovanje pojedinih službi i odeljaka
t.1bele to se deklariše pomoću odredbe references, na sledeći način:
kompanije.
Deklaraciji tipa podataka kolone slede dodatni podaci o koloni. departmentiD int not null references department(departmentiD)
Prvo smo zadali da je ta kolona tipa not null - drugim rečima , u svakom redu Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
tabele, ta kolona mora sadržati neku vrednost. kolonu (povezana je s kolonom) department ID tabele department.
Drugo, zadali smo daje ta kolona takođe tipa auto_increment. To je veoma Imajte u vidu da sintaksu za spoljni ključ možemo koristiti zato što je tabela
korisna mogućnost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih ključeva
šifru službe, MySQL će sam do deli ti jedinstven broj koji će biti sledeći po redosledu nij e moguća. Prema planu razvoja, trebalo bi da spoljni ključevi u MyiSAM tabelama
auto_increment sekvence (niza). To će vam prilično olakšati život. hudu podržani i jednoj od budućih verzija MySQL-a, verovatno u verziji 5.1.
Na kraju, odredba primary key znači da će ta kolona biti primarni ključ tabele. Pogledajte sada treću komandu create table:
Ako se primarni ključ sastoji od samo jedne kolone, može se zadati u ovom obliku. Za create table employeeSkills
primarne ključeve sastavljene od više kolona mora se upotrebiti drugi oblik komande,
koji ćemo razmotriti u nastavku ovog poglavlja. employeeiD int not null references employee(employeeiD),
Time se završava definicija tabele department. A sada, pogledajte sam kraj SQL-ove s kill varchar(15) not null,
p rimary key (employeeiD, skill)
komande. Iza završne zagrade nalazi se sledeći red:
type=InnoDB;
type=InnoDB
U ovoj tabeli takođe imamo spoljni ključ; to je kolona employee ID. Zanimljivo u
Time se zadaje da tabela treba da koristi mašinu baze podataka InnoDB.Ako pažlji- vezi s definicijom ove tabele jeste to da ona ima primarni ključ koji se sastoji od dve
vije pogledate definicije tabela, uočićete da smo sve tabele deklarisali kao InnoDB kolone . Kao što vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim
tabele. JC rasebno deklarisan primarni ključ u sledećem redu:
pt l.mary key (employeeiD, skill)
"Uli ld ll Ud \..nCJ-\ lC l J-\ DLC
48 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

definicija_kolone:
Budući da u sintaksi definicija drugih tabela nema ničeg novog, nećemo ih detaljno
ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT
objašnjavati. Obratite pažnju na to da smo u tabeli assignment upotrebili nekoliko podrazumevana_vrednost ] [AUTO_INCREMENT]
novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokret- [PRIMARY KEY] [definicija_reference]
nim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku ili PRIMARY KEY (ime_indeksirane_kolone, .. . )
ovog poglavlja biće više reči o tim tipovim kolona. ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
Pomoću sledeće komande možete proveriti da li su tabele na vašem sistemu tačno ili INDEX [ime_indeksa] (ime_indeksirane_kolone, ... )
ili UNIQUE [INDEX] [ime_ind eksirane_kolone , ... )
podešene: ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
show tables; ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone , ... )
Trebalo bi da dobijete sledeće rezultate: [definicija_reference]
+-------- ------------+ ili CHECK (izraz)
l Tables_in_employee l Pogledajmo detaljnije opcije koje postoje u opštoj definiciji.
+--------------------+ Rezervisana reč TEMPORARY omogućava izradu privremene tabele koja će biti
assignment
client dosegljiva samo u tekućoj sesiji, a kada se veza s bazom podataka zatvori, tabela se
department automatski briše.
employee Odredbu IF NOT EXISTS možete upotrebiti da biste napravili novu tabelu samo
employeeSkills ako ne postoji tabela s imenom koje ste zadali.
+--------------------+ Pomoću odredbe LIKE izvorna_ tabela možete napraviti novu tabelu koja ima
Detaljnije podatke o strukturi svake tabele možete dobiti pomoću komande des- istu Šemu kao izvorna tabela.
cribe; na primer: U komandi CREATE TABLE deklarišemo unutar zagrada kolone koje nam trebaju,
describe department; njihove tipove podataka i druge informacije koje se tiču strukture tabele. Najjednostav-
Trebalo bi da na svom ekranu dobijete rezultate nalik na sledeće: nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared-
nom odeljku ovog poglavlja objasnićemo važeće tipove podataka za kolone tabele.
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field l Type l Collation l Null l Key l Default l Extra l Svaku deklaraciju kolone možemo, po potrebi, proširiti sledećim opcijama:
+--------------+-------------+-------------------+------+-----+---------+----------------+ • Svaku kolonu možemo deklarisati kao NOT NULL ili NULL, što znači da ne dozvo-
1 departmentiD l int (ll) l bina:ry l l PRI l NULL l auto_increment l
1 name l varchar(20) l latinl_swedish_ci l YES l l NULL l l ljavamo da kolona sadrži vrednost NULL (opcija NOT NULL) ili da prihvatamo vred-
+--------------+-------------+-------------------+------+-----+---------+----------------+ nost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva.
U ovoj fazi korisno bi bilo da proverite i ostale tabele. • Pomoću rezervisane reči DEFAULT iza koje sledi neka vrednost možete zadati
podrazumevanu vrednost za kolonu.
Komanda CREATE TABLE • Rezervisana reč AUTO_INCREMENT omogućava generisanje rednog broja, kao što
Pošto ste videli primer, možemo preći na opis cele sintakse komande CREATE TABLE. smo to učinili u prethodnom primeru.Ta vrednost, koja se automatski generiše
U MySQL-ovoj dokumentaciji stoji da komanda ima sledeći opšti oblik: biće za jedan veća od tekuće najveće vrednosti iz tabele. Prvi red podataka koji
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele un este u tabel u imaće redni broj l. Tabela može sadržati samo jednu kolonu tipa
[ (definicija_kolone, ... ) l AUTO_INCREMENT, koja mora biti indeksirana. Obratite pažnju na to da u prethod-
[ope i j e_ za_ tabel u] [komanda_ se l e ct l
nim primerima nismo ručno napravili nijedan indeks; međutim, neki su ipak bili
automatski napravljeni. Indeksi se automatski prave za kolone koje deklarišete kao
ili
primarne ključeve (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE deklarisali kao AUTO INCREMENT.
izvorna_ tabela; • Pojedine kolone možemo deklarisati kao primarne ključeve (odredba PRIMARY
KEY).
• Pojedine kolone možemo deklarisati kao spoljne ključeve, pomoću opcije REFE-
RENCES, kao u ovom primeru.
rU~IdVIJC .. rldVIJCIIJC UdLd fJUUdldl\d 0 ldUCid l IIIUCI\)d 1\.UIIIdllUd \..nC/"\1 C IMOLI:.

Osim imena kolona i tipova podataka u njima, u ovom delu komande CREATE Možemo zadati još nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri-
TABLE možemo zadati i dodatne podatke: ''"w pre svega optimizaciji. Neke među njima objasnićemo u poglavlju 18",0ptimi-
• Možemo zadati primarni ključ koji se sastoji od više kolona, kao u ovom pri- "v.tnje baze podataka" . To su sledeće opcij e:
meru, tako što iza opcije PRIMARY KEY navedemo imena kolona koje čine pri- • AUTO_INCREMENT = # Omogućava da u koloni tipa auto_increment zadate
marni ključ. Na taj način može se zadati i primarni ključ koji se sastoji od samo poč etnu vrednost različitu od 1.
jedne kolone. Kolona deklarisana kao PRI MARY KEY može sadržati samo jedin- • AVG_ROW_LENGTH = # Omoguć ava da zadate prosečnu dužinu reda da biste
stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne može "pomogli" mašini baze podataka.
sadržati vrednost null. • CHECKSUM = l Omogućava da uključite izračunavanje kontrolnog zbira u redo-
• Opcije INDEX i KEY su sinonimi i znače da će zadata kolona (ili kolone) biti vima tabele, što može biti korisno kada rešavate problem oštećenog sadržaja
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadrže tabele. Zadajte vrednost 1 da biste uključili izračunavanje. Ova opcija je stan-
jedinstvene vrednosti. dardno isključena a upotrebljiva je samo za My ISAM tabele.
• Pomoću opcije UNIQUE zadaje se da određena kolona može sadržati samo jedinst- • COMMENT = "tekst" Omogućava da tabeli pridružite neku napomenu.
vene vrednosti. Kolone deklarisane kao UNIQUE takođe se automatski indeksiraju. • MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se može
• Pomoću opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre- uneti u tabelu.
traživanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraživanje • MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela
možete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9. može sadržati.
• Opcija FOREIGN KEY omogućava da deklarišete spoljne ključeve na isti način kao • PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
primarne ključeve. sadržaj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
Iza zatvarajuće zagrade možete zadati određene opcije koje se tiču tabele. Dosad vrednost 1, svi indeksi će se pakovati; ako zadate vrednost o, nijedan indeks se
smo već videli da to može biti tip tabele.Tipovi tabela detaljnije su opisani u poglavlju 9. n e će pakovati.
Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele može biti jedan • PASSWORD = "tekst• U standardnoj verziji MySQL-a ova opcija na radi baš
od sledećih: ništa.
• My ISAM, koji se podrazumeva, veoma je brz i podržava indekse za tekstualno • DELAY_KEY_WRITE = {o l l } Omogućava da odložite ažuriranje indeksa dok
pretraživanje; zamenjuje nekadašnji podrazumevani tip ISAM. ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.
• ISAM je stariji tip tabela. Sličan je tipu My ISAM ali pruža manje mogućnosti, • ROW_FORMAT= {default l dynamic l fixed l compressed } Omogućava
zbog čega bi trebalo da umesto njega uvek koristite MyiSAM. da zadate format u kojem se skladište podaci u redovima tabele. Upotrebljiva je
• InnoDB je mašina baze podataka usklađena s grupom pravila ACID koja samo za MyiSAM tabele.
podržava transakcije, spoljne ključeve i zaključavanje podataka na nivou pojedi- • RAID_TYPE= { l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=#
načnog reda tabele. Omogućava da u cilju optimizovanja servera zadate tip RAID grupe diskova koji
• BDB (Berkeley DB) je mašina baze podataka koja podržava transakcije i zaklju- imate.
čavanje podataka na nivou stranice tabele. • UNION= (ime_tabele, [ime_tabele ••• ]) Ovaopcija,namenjenaisključivo

• Ceo sadržaj tabela tipa HEAP čuva se u memoriji i nikad se ne upisuje na disk; tabelama tipa MERGE, omogućava da zadate tabele koje čine grupu MERGE.
zahvaljujući tome, te tabele su veoma brze, ali veličina im je ograničena i podaci • INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva isključivo
iz njih se ne mogu restaurirati ukoliko se sistem pokvari. za tabele tipa MERGE i služi da se zada tabela u koju se podaci umeću.
• Tabele tipa MERGE omogućavaju kombinovanje više tabela tipa MyiSAM koje • DATA DIRECTORY="apsolutna putanja• Pomoću ove opcije možete izričito
imaju istu strukturu, tako da se podaci iz njih čitaju kao da radimo s jednom tabe- zadati direktorijum u koji želite da se smeštaju podaci tabele.
lom.To se može iskoristiti kada operativni sistem ograničava maksimalnu veličinu • INDEX DIRECTORY="apsolutna putanja" Pomoću ove opcije možete izri čito
datoteka - pa zbog toga i tabela. zadati direktorijum u koji želite da se smešta sadržaj indeksa tabele.
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 opšti oblik komande CREATE TABLE, uočićete da
• MEDIUMINT zauzima tri bajta (2 24 mogućih vrednosti).
komandu CREATE TABLE možete završiti komandom SELECT. SELECT je SQL-ova
komanda koja omogućava učitavanje redova iz jedne ili više tabela. (Podrobnije je • BIGINT zauzima osam bajtova (2 64 mogućih vrednosti).
opisana u poglavljima 6, 7 i 8 ove knjige.) Pomoću tc opcije možete napuniti novu Aproksirnirani numerički tipovi opisani su u nastavku teksta.
tabelu podacima koje učitava zadata komanda select.
Tip FLOAT
Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti.
Tipovi podataka u kolonama Može predstavljati pozitivan broj u opsegu od 1.18 x 10-38 do 3.40 x 10 38 i sličan opseg
U MySQL-u postoje tri osnovna tipa kolona: numerički, znakovni ili tekstualni 11egativnih brojeva.
i datumsko/vremenski. Objasnićemo ih jedan po jedan u narednim odcljcima.
Tip DOUBLE
Numerički tipovi podataka Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi
Numerički tipovi se koriste za skladištenje brojeva. U našem primeru, upotrebili smo 'la DOUBLE SU REAL i DOUBLE PRECISION. Mogu predstavljati pozitivan broj u opsegu
tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva od 2.23 x 10- do 1.80 x 10 308 i sličan opseg negativnih brojeva.
308

primera podtipova numeričkih tipova: tačni numerički tipovi i aproksimirani (pri-


bližni) numerički tipovi. Znakovni i tekstualni tipovi podataka
Za numeričke tipove možete zadati ukupan broj cifara koji sc prikazuje (širina, M) MySQL podržava više znakovnih i tekstualnih tipova podataka. Osnovni tekstualni
i, za tipove s pokretnim zarezom, broj decimalnih mesta, D.Vrednosti tih parametara tipovi SU CHAR, VARCHAR, TEXT, BLOB, ENUM i SET. OpisaĆemo ih jedan po jedan u
zadaju se iza deklaracije tipa podatka; na primer: 11astavku teksta.
plata decimal(lO, 2)
Ova komanda omogućava prikazivanje vrednosti sa ukupno 12 cifara i dva deci- Tip CHAR
malna mesta. l'ip CHAR omogućava skladištenje znakovnih vrednosti fiksne dužine. Kao u primeru
Možete se opredeliti da ne zadate nijedan od ovih parametara, ili možete zadati haze podataka employee, rezervisanoj reči CHAR obično sledi dužina (broj znakova) zna-
samo ukupnu širinu za prikazivanje, ili i širinu i broj decimala. kovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate dužinu, podrazumeva se CHAR ( 1) .
Uz numeričke tipove možete zadati rezervisane reči UNSIGNED i/ili ZEROFILL. Maksimalna dužina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upiše
Rezervisana reč UNSIGNED znači da kolona može sadržati samo nule ili pozitivne ll kolo~ u ta?ele, on uvek ima dužinu koju ste zadali u definiciji kolone. To se postiže

vrednosti. Rezervisana reč ZEROFILL znači da će se vrednosti iz kolone prikazivati d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri
s vodećim nulama. liCJtavanJU podatka IZ kolone tipa CHAR.
Tačni numerički tipovi opisani su u nastavku teksta. Očigledno je da podaci tipa CHAR zauzimaju više prostora na disku od ekviva-
il'J~tnih z~akovnih ~~ednosti promenljive dužine. Prednost im je to što se podaci brže
Tip NUMERIC ili DECIMAL uČ!tavaju 1z tabele CIJe su sve kolone fiksne širine (tj. CHAR, numerički ili date).
O be reči označavaju potpuno isti tip podataka, a DECIMAL se može skratiti na DEC. Ovi ll udući da je brzina učitavanja podataka često važnija od prostora koji oni zauzimaju
tipovi omogućavaju čuvanje tačnih vrednosti s pokretnim zarezom i obično se koriste na disku, možda ćete se opredeli ti da tekstualna polja u kojima se vrednosti ne razli-
za rad s novčanim vrednostima. Opseg mogućih vrednosti jednak je kao za brojeve kLUU mnogo po dužini deklarišete kao CHAR da biste (malo) optimizovali sistem.
s pokretnim zarezom dvostruke preciznosti. Ispred deklaracija oba tipa, CHAR i VARCHAR, možete dodati rezervisanu reč NATIO-
NAL, Što znači da želite da ograničite sadržaj na standardni skup znakova. Pošto se ova

Tip INTEGER i varijante opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil-
Ovaj tip se može skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se llOSt između različitih platformi.
smcštaju u četiri bajta, što daje 232 moguće vrednosti. Tip INT ima nekoliko varijanti: Deklaracijama tipova CHAR i VARCHAR može slediti rezervisana reč BINARY što znači
d.t sc pri poređer0u znakovnih vrednosti pravi razlika između malih i velikih slova.
• TINYINT zauzima jedan bajt (28 mogućih vrednosti). Rezervisane reči BIT i BOOL
Podrazumevani način poređenja je da se ta razlika ne pravi.
su sinonimi za TINYINT.
16
• SMALLINT zauzima dva bajta (2 mogućih vrednosti).
Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Pravljenje indeksa
54

fip TIME
Tip VARCHAR .. v· v·

Tip VARCHAR omogućava skladištenje znakovnih nizova promenljlVe duzme. Duzma Ovaj tip <:n;ogućava skladištenje podataka koji predstavljaju vreme, koje se prikazuje u
podataka zadaje se između zagrada iza imena tipa, na primer, VARCHAR (l ol . Opseg lormatu CC:MM:SS.
mogućih vrednosti je od O do 255.
Tip DATETIME
Tipovi TEXT, BLOB i njihove varijante Ovaj tip je kombinacija dva prethodna. Format je GGGG-MM-DD ČČ:MM:SS.
Tipovi TEXT omogućavaju skladištenje tekstualnih podataka dužih od ono.g što m?Ž.e
da stane u tipove CHAR i VARCHAR. BLOB je skraćenica za Binary Large OBject (vehki fip TIMESTAMP
binarni objekat). Ovi tipovi se međusobno ni po čemu ne razlikuju, jedino je BLOB <)vo je koristan tip podataka za kolone tabele. Ako u određenom redu ne zada te vred-
namenjen čuvanju binarnih a ne tekstualnih podataka. Pri poređenju podataka tipa IIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
BLOB pravi se razlika između malih i velikih slova, dok se to ne čini pri poređenju P~.da­ t.tbcli ili kada je poslednji put izmenjen sadržaj reda.
taka tipa TEXT. Oba tipa su promenljive dužine i za oba postoje varijante razmh velicma: Kada učitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE-
8 '1'IME. To je značajna razlika između MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla-
• Tip TINYTEXT ili TINYBLOB može sadržati najviše 255 (to je 2 -1) znakova ili
' .tciji kolone tipa TIMESTAMP mogli da zadate širinu na kojoj se prikazuju podaci iz
baj tova. ll' kolone .
• Tip TEXT ili BLOB može sadržati najviše 65,535 (i 6 -1) znakova ili bajtova (64 KB).
24
• Tip MEDIUMTEXT ili MEDIUMBLOB može sadržati najviŠe 16,777,215 (2 -1) znakova rip YEAR
ili bajtova (16 MB). ()vaj tip omogućava skladištenje podataka koji predstavljaju godine. Kada deklarišete
32
• Tip LONGTEXT ili LONGBLOB može sadržati najviše 4,294,967,295 (2 -1) znakova ~o! onu ovog tipa, možete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podra-

ili bajtova (4 GB). t umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.

Tip ENUM . ,. . v
Pravljenje indeksa
Ovaj tip podataka omogućava da zadate hstu moguClh vrednost1. Kolona tabele ~oze
sadržati jednu vrednost iz nabroj anog skupa mogućih. Tip podataka ENUM deklanse se Sve indekse koji vam trebaju najčešće ćete praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklarišete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto-
na sledeći način:
lll.ltski se formira i indeks.
pol enum('m', 'Ž') Ponekad ćete ustanoviti da koristite veći broj upita koji obuhvataju kolonu za koju
Pošto vrednost tipa ENUM može biti i NULL, moguće vrednosti kolone pol su m, 11istc definisali indeks; u takvim slučajevima možete dodati nov indeks pomoću
ž, NULL ili error. ~oman de CREATE INDEX.
Zanimljivo je to da se, pre izvršavanja, komanda CREATE INDEX preslikava u
Tip SET · v . komandu ALTER TABLE. Komanda ALTER TABLE može se upotrebiti i za mnoge druge
Tip SET je sličan tipu ENUM s tom razlikom što kolone u redovima tabele mogu sadrzat1 11.11ncne, koje ćemo opisati u poslednjem odeljku ovog poglavlja.
i više vrednosti iz nabrojanog skupa mogućih. Na primer, tabeli employee možemo dodati nov indeks na sledeći način:
<'l' ate index name on employee (name) ;
Datumski i vremenski tipovi podataka
MySQL podržava više tipova za rad s datumima i vremenima, koji su opisani u nared- Ova komanda pravi indeks čije je ime name nad kolonom name tabele employee.
Komanda create index nema puno opcija. Ispred reči index možete dodati reč
nim odeljcima.
liN J QUE ako želite indeks s jedinstvenim vrednostima. Osim toga, ispred reči index
111ožcte navesti rezervisanu reč FULLTEXT da biste napravili indeks za tekstualno pre-
Tip DATE !I,J~ivanje MyiSAM tabele. (Više detalja o tome naći ćete u poglavlju 9.)
Tip date omogućava skladištenje datuma. MySQL očekuje da datum bude u ISO
redosledu godina-mesec-dan, čime se izbegavaju problemi usled različitih formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.
56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa tzmena struKture postoJece t110e1e

Indeksi definisani nad kolonama tipa char i varchar mogu se ograničiti na prvih ll udući da komanda ALTER TABLE pruža veliki broj mogućnosti, ima i veliki broj
nekoliko znakova u polju. To ćete uraditi tako što iza imena indeksirane kolone zada te lj H 'Ja . Opšti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
između zagrada broj znakova koji želite da se indeksira, na primer: ' '~·. led a ovako:
create index part_name on employee(name(S)); /l.' i'I>R [IGNORE ] TABLE ime tabele vrsta_izmene [, vrsta_izmene ... ]
Pošto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad t a_ izmene:
numeričkim kolonama, indeksiranje samo nekoliko početnih znakova poboljšava ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
performanse. il l ADD [COLUMN] (definicija_kolone, definicija kolon~, ... )
lli ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
l li ADD PRIMARY KEY (ime indeksirane kolone, ... )
Brisanje baza podataka, tabela i indeksa l li ADD UNIQUE [ime_indeksa] (ime indeksirane kolone, . . . )
Pošto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da naučite l li ADD FULLTEXT [ime_indeksa] (i;e indeksira;e kolone, ... )
ll i ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
i da ih brišete. Rezervisana re č koja vam treba za tu namenu jeste DROP.
(ime_indeksirane_kolone, ... )
Celu bazu podataka, zajedno s njenim sadržajem, brišete pomoću sledeće komande [definicija_reference]
(nemojte je još zadati!): l li ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}
drop database employee; l 1i CHANGE [COLUMN] staro_ime_kolone definicija kolone
[FIRST l AFTER ime_kolone] -
Ispred imena baze podataka možete dodati neobaveznu opciju IF EXISTS. Ako se 11 i MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
vratite na listing 4.1, videćete da je u njemu upotrebljena baš ova verzija komande l ll DROP [COLUMN] ime_kolone
DROP DATABASE. l Ji DROP PRIMARY KEY
Tabelu možete izbrisati pomoću komande DROP TABLE, na primer: l li DROP INDEX ime_indeksa
lli DISABLE KEYS
drop table assignment; 1l i ENABLE KEYS
Opšti oblik komande DROP TABLE izgleda ovako: lli RENAME [TO] novo_ime tabele
ll i ORDER BY ime kolone
DROP [TEMPORARY] TABLE [IF EXISTS] ime_tabele [, ime tabele, ... ] ll i opcije_za_tabelu
Ako želite da izbrišete privremenu tabelu, upotrebite rezervisanu reč TEMPORARY Većina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
Istom komandom možete izbrisati više tabela ako zadate listu njihovih imena razdvo- ' 'll EATE TABLE, kao što je ADD PRI MARY KEY Opisaćemo ukratko one koje možda nisu
jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti način kao u komandi t1.1[j asnije.
DROP DATABASE.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omogućavaju izmenu defi-
Indeks brišete pomoću komande DROP INDEX, na primer: lltnj e kolone ili njenog mesta u tabeli.
drop index part_name on employee; Opcija DROP COLUMN briše kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1NDEX brišu samo indeks pridružen koloni.
Kao što vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridružen.
Opcija DISABLE KEYS nalaže MySQL-u da ne ažurira sadržaj indeksa, ali upotre-
i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS uključuje ažuriranje indeksa.
lzmena strukture postojeće tabele Opcija RENAME omogućava promenu imena tabele.
Osim izrade novih tabela i brisanja postojećih, često će vam zatrebati da izmenite Opcija ORDER BY će poređati zadatim redosledom redove tabele na koju je prime-
strukturu postojeće tabele. To se može uraditi pomoću komande ALTER TABLE- ona IIJCI1a, slično opciji ORDER BY u komandi SELECT, koju ćemo razmatrati u poglavlju 6,
ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela. .. Korišćenje upita u MySQL-u". Taj red o sled neće biti očuvan kada se kasnije unesu
Na primer, indeks nad ta belom employee mogli smo da napravimo na sledeći način: Ilovi podaci u tabelu.
alter table employee Opcija opcije_za_tabelu omogućava da na kraj komande zadate iste opcije za
add index name (name) ; t.ll>elu kao u komandi CREATE TABLE- više detalja o tome naći ćete u prethodnom
dl'lu ovog poglavlja.
58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa ;:,azetaK

Sažetak l ipovi podataka za kolone


U ovom poglavlju, naučili ste da pravite i brišete baze podataka, tabele i indekse, i da • Tačni numerički tipovi SU TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC
izmenite strukturu postojeće tabele. i DECIMAL.
• Aproksimirani numerički tipovi su FLOAT i DOUBLE.
ldentifikatori i razlikovanje malih i velikih slova • Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB .
• Za imena baza podataka važe ista pravila razlikovanja malih i velikih slova kao u • Za rad S datumima i vremenima služe tipovi DATE, TIME, DATETIME, TIMESTAMP
direktorij urnima vašeg operativnog sistema. Za imena tabela važe ista pravila kao i YEAR.
za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika • Za navedena imena tipova podataka postoji i više alijasa (sinonima).
između malih i velikih slova.

• Svi identifikatori, osim alijasa, mogu sadržati najviše 64 znaka. Dužina alijasa Brisanje baza podataka, tabela i indeksa
može biti najviše 255 znakova. • Bazu podataka brišete pomoću komande
• Identifikatori mogu da sadrže većinu postojećih znakova, ali imena baze podataka drop database ime_baze;
ne mogu sadržati znakove l, \ i . a imena tabela ne mogu sadržati znakove . i l. • Tabelu brišete pomoću komande
• Rezervisane reči možete koristiti kao identifikatore, pod uslovom da ih pišete drop table ime_tabele;
između navodnika. • Indeks brišete pomoću komande
drop index ime_indeksa on ime_tabele;
Pravljenje baze podataka
• create database ime_baze; pravi novu bazu podataka.
lzmena strukture postojeće tabele
• use database ime_baze; bira (otvara) bazu podataka za upotrebu.
• Strukturu tabele menjate pomoću komande ALTER TABLE, čiji opšti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]
Pravljenje tabela
• Tome služi komanda create table, čiji opšti oblik izgleda ovako: vrsta izmene:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele ADD [COLUMN] definicija_kolone [FIRST l AFTER ime kolone
[ (definicija_kolone, ... ) l ili ADD [COLUMN] (definicija_kolone, definicija_kolo;e, ... )
[opcije_za_tabelu] [komanda_select] ili ADD INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD PRIMARY KEY (ime_indeksirane_kolone, .. . )
ili ili ADD UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . )
ili ADD FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... )
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE ili ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
ime_postojeće_tabele; (ime_indeksirane_kolone, ... )
[definicija_reference]
definicija_kolone: ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l
ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT DROP DEFAULT}
podrazumevana_vrednost] [AUTO_INCREMENT] ili CHANGE [COLUMN] tekuće_ime_kolone definicija kolone
[PRIMARY KEY] [definicija_reference] [FIRST l AFTER ime_kolone] -
ili PRIMARY KEY (ime_indeksirane_kolone, .. . ) ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone]
ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DROP [COLUMN] ime_kolone
ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DROP PRIMARY KEY
ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... ) ili DROP INDEX ime_indeksa
ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili DISABLE KEYS
ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa] ili ENABLE KEYS
(ime_indeksirane_kolone, ... ) ili RENAME [TO] novo_ime tabele
[definicija_reference] ili ORDER BY ime_kolone
ili CHECK (izraz) 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 sadržaj, zadali biste
Pitanja
a) drop all tables on dbname;
1. Šta od sledećeg nije ispravno ime tabele u MySQL-u?
b) drop database dbname;
a) employee
e) drop dbname;
b) select
d) delete database dbname;
e) employee.skill
d) employeeSkills
2. Od sledećih tvrdnji o tipovima podataka CHAR i VARCHAR, koje su tačne? Vežbe
a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadržaj. 1. Napišite SQL komande koje formiraju bazu podataka porudzbine čija je šema
sledeća:
b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisi-
vanju na disk. kupac(kupaciD, kupaclme, kupacAdresa)
e) Kolona tipa CHAR, u proseku, zauzima manje prostora na disku od ekviva- porudzbina(porudzbinaiD, porudzbinaDatum, l_c_t.lP!l.cJQ)
lentne kolone tipa VARCHAR. porudzbinaStavka(B_'?:_':~~-~~~~-I_l?., r:<?.~~lP..•robaKolicina)
d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na roba(robaiD, robaN aziv)
sadržaj. Možete izabrati proizvoljne tipove podataka.
3. Pre nego što počnemo da pravimo tabele u bazi podataka, moramo prvo Testirajte komande u MySQL-u, a zatim pregledajte rezultujuće tabele pomoću
a) napraviti indekse tabela komandi SHOW i DESCRIBE.
b) napraviti bazu podataka 2. Svakoj porudžbini u tabeli porudzbine želimo da dodamo novo polje nazvano
e) napraviti bazu podataka i otvoriti je za upotrebu napomena, koje će biti tipa TEXT. Obavite to pomoću odgovarajuće komande
d) napraviti sve kolone tabela ALTER TABLE, a zatim proverite rezultat pomoću komande DESCRIBE.
4. Od sledećih komandi CREATE TABLE, koja je sintaksno ispravna? 3. Izbrišite bazu podataka porudzbine.

a)
create table department Odgovori
department ID int not null auto - inc remen t pri mary key,
name varchar(20}
type=InnoDB; Pitanja
b) 1. e
create table department type=InnoDB 2. a
(
3. e
department ID int not null auto inc remen t pri mary key,
name varchar ( 2 o} 4. d
}; 5. b
e)
create department Vežbe
create database porudzbine;
department ID int not null auto - increment pri mary key,
name varchar(20} use porudzbine;
type=InnoDB;
d) cre ate table kupac
create table department (
( kupaciD int not null auto increment primary key,
department ID int not null auto- inc remen t pri mary key, kupacime varchar(20},
name varchar(20} kupacAdre sa varchar(BO}
type =InnoDB; 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

robaiD int not null auto_increment primary key,


Upotreba MySQL-a
robaNaziv varchar(20)
type = InnoDB;

create table porudzbinaStavka

porudzbinaiD int not null references porudzbine(porudzbinaiD),


5 Umetanje, brisanje i ažuriranje podataka
robaiD int not null references roba(robaiD),
6 Korišćenje upita u MySQL-u
robaKolicina int,
primary key (porudzbinaiD, robaiD)
7 Složeniji upiti
type = InnoDB;
8 Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT
alter table porudzbine
add column napomena text;

drop database porudzbine;

U sledećem poglavlju
U poglavlju S",Umetanje, brisanje i ažuriranje podataka", unećemo određene podatke
u bazu podataka employee.
5
Umetanje, brisanje
i ažuriranje podataka

u OVOM POGLAVLJU
1 UPDATE umeću
OBJASNIĆEMO
kako se komande
i ažuriraju podaci u MySQL-ovoj bazi podataka .
pomoću INSERT, DELETE

Razmotrićemo sledeće teme:

• Komanda INSERT
• Komanda DELETE
• Komanda UPDATE
• Učitavanje podataka pomoću komande LOAD DATA INFILE

• Proširenja: komande REPLACE i TRUNCATE.


Sada smo prešli na komponentu DML (Data Manipulation Language, jezik za rad s
podacima) jezika SQL. Pošto naučite kako da umećete nove podatke u bazu podataka,
11arcdnih nekoliko poglavlja provešćemo učeći mnogobrojne načine za učitavanje
podataka iz baze.

Koman da INSERT
"iQL-ova komanda INSERT služi za umetanje novih redova u tabele. Pogledaćemo
najpre jedan primer. U ovom slučaju takođe, komande možete zadavati direktno u
MySQL monitoru ili pisati u datoteku, ili možete preuzeti datoteku s Web lokacije
posvećene ovoj knjizi.
U listingu 5.1 prikazano je nekoliko primera komande insert.

Listing 5.1 employee_data.sql


use employee;

d lete from department;


insert into department values
(42 l 'Finance') l

(128 'Rs arch and Development')


1 1

(Nur.r, 'll um<~ n R aout ces' )


l l

---~~~~~~-------~~~~~-~~----------------......- - (NlJI,Io, l M II')U l__ __,_' _) _; -~~~-~----~~~~~~-------


l r_H
t'oglaVIJe o umetanJe, onsanJe 1 azumanJe podataka Komand a INSERT

delete from employee; U prva dva reda izričito smo zadali vrednosti za kolonu departmentiD. Pogle-
insert into employee values dajmo ponovo definiciju kolone departmentiD. Verovatno se sećate iz prethodnog
(7513, 'Nora Edwards', 'Programmer',l28), poglavlja da deklaracija te kolone izgleda ovako:
(9842, 'Ben Smith', 'OBA', 42),
(6651, 'Ajay Patel', 'Programmer', 128), departmentiD int not null auto_increment primary key
(9006, •candy Burnett•, •systems Administrator', 128); Budući daje u pitanju kolona tipa auto_increment, možemo izričito zadati

from employeeSkills; vrednost za nju, ili prepustiti MySQL-u da sam generiše neku vrednost. (Pri upotrebi
delete
insert into employeeSkills values kolona tog tipa obično se prepušta MySQL-u da sam izračuna vrednost, ali postoje
(7513, •e•)' i slučajevi, kao što je ovaj, gde ćete imati postojeću vrednost koju ćete želeti da
(7513, • Perl'), upotrebite.)
(7513, 'Java'), U redovima s podacima o službama Human Resources i Marketing, u koloni
(9842, 'DB2'),
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
(6651, 'VB'),
(6651, 'Java'), koji izračunava novu vrednost. Pogledajmo Šta ćemo dobiti s tom komandom
(9006, 'NT'), lNSERT.
(9006, 'Linux'); Ako pažljivije pogledate pojedine komande INSERT, uočićete da su podaci koji se
umeću u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese-
delete from client; arch and Development'. Polunavodnici se ne koriste za numeričke tipove.
insert into client values
(NULL, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', Ukoliko se podaci uokviruju polunavodnicima, šta treba uraditi kada podatak
l 95551234 l) ' sadrži polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
(NULL, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', Jednostavnije rečeno, ispred svakog polunavodnika treba dodati obrnutu kosu crtu
l 95559876 l) ; (\), na primer, 'o\'Leary'.
Šta treba uraditi ako želimo da obrnuta kosa crta bude baš obrnuta kosa crta, bez
delete from assignment;
insert into assignment values ikakvog posebnog značenja? U tom slučaju, morate na isti način preslikati i obrnutu
(l, 7513, '2003-01-20'' 8.5); kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke učitavamo iz baze pomoću komande SELECT. Tu komandu ćemo veoma
Obratite pažnju na to da pre nego što dodamo nove podatke u tabelu, izvršavamo detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da će se,
komandu DELETE- ni u ovom slučaju to nije neophodno, ali tako ćete ukloniti iz ako zadate:
tabele probne podatke koje ste možda ranije uneli. U narednom odeljku vratićemo se selec t * from ime_tabele;
na komandu DELETE.
učitatisvi podaci koji se nalaze u tabeli.
Osim toga, obratite pažnju i na to da smo uneli probne podatke koji odgovaraju
Ako zadate:
primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i
nekoliko dopunskih redova. select * from department;
Sve navedene komande INSERT međusobno su veoma slične. Pogledajmo prvu da trebalo bi da na ekranu dobijete rezultate nalik na sledeće:
biste shvatili kako deluju: ~ ----- ---------+----------------------+
insert into department values l departmentiD l name
(42, 'Finance'), !---------------+----------------------+
(128, 'Research and Development'), 42 Finance
(NULL, 'Human Resources'), 128 Research and Develop
(NULL, 'Marketing'); 129 Human Resources
130 Marketing
U prvom redu zadali smo ime tabele u koju želimo da unesemo podatke - u ovom ----------- --+----------------------+
slučaju, to je tabela department, u koju unosimo četiri reda s podacima. Možda se ~ rows in set (0.01 sec)
sećate da tabela department ima dve kolone, departmentiD i name. (U to se možete
Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment
uveriti ako izdate komandu describe department.) vrt•dnost koja je za jedan veća od tekuće najveće vrednosti u koloni.
GB Poglavlje 5 Umeta nje, brisanj e i ažuri ra nje podata ka
Komanda INSERT

U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima sledeći opšti oblik: opcija LOW PRIORITY blokira klijentski program koji umeće podatke, dok opcija
INSERT [LOW_PRIORITY l DELAYED] [IGNORE] DELAYED to ne čini. Ukoliko izdate komandu za umetanje podataka s opcijom
[INTO] ime_ tabele [ (ime_kolone, ... ) J LOW PRIORITY, možda ćete morati da sačekate pre nego što budete mogli da
VALUES ((izraz l DEFAULT), ... ),( .. . ), ... nastavite izvršavanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J
DELAYED, biće vam dozvoljeno da započnete izvršavanje drugog upita, ali onda
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] morate imati u vidu da vaši podaci neće biti upisani u tabelu dok ona ne bude
[INTO] ime tabele [ (ime_kolone, ... ) J potpuno slobodna.
SELECT ... • Opcija IGNORE je korisna prvenstveno kada umećete više redova istovremeno.
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] Standardno ponašanje je takvo da ukoliko jedan od redova koji pokušavate da
[INTO] ime_tabele umetnete izazove grešku tipa dupliran primarni ključ ili duplirana vrednost u
SET ime_kolone=(izraz l DEFAULT), ... koloni koja prihvata samo jedinstvene vrednosti, dolazi do greške a operacija
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . J umetanja se poništava. Ako upotrebite opciju IGNORE, greška se zanemaruje a
U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite postupak umetanja se nastavlja s podacima iz sledećeg reda.
pažnju na to da rezervisana reč INTO nije obavezna. Mogli smo je izostaviti i započeti • Možete izričito zadati da kolona treba da preuzme svoju podrazumevanu vred-
upit s insert employee values, ali smatramo da reč INTO doprinosi razumljivosti nost ako umesto vrednosti za kolonu zadate opciju DEFAULT.
upita. • Opcija ON DUPLICATE KEY UPDATE pruža elegantno rešenje problema duplira-
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati nog primam og ključa ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
listu vrednosti poredanih istim redosledom kao odgovarajuće ciljne kolone tabele. komanda update koja menja postojeću vrednost primarnog ključa ili postojeću
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID, jedinstvenu vrednost u koloni tako da se ona više "ne sudara" s podacima iz
a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik novog reda.
omogućava da se jednom komandom INSERT umetne više novih redova u tabel u.
N aredni kratak primer ilustruje uobičajeni način upotrebe opcije ON DUPLICATE
Drugi oblik komande INSERT završava se komandom SELECT. Um.esto da vredno- ~ J•,YUPDATE:
sti umećete ručno, ovaj oblik omogućava da podatke učita te iz jedne ili više tabela
t' t·eate table warning
baze podataka i da ih zatim umetnete u ciljnu tabelu. (
Treći oblik komande INSERT omogućava da izričito zadate kolone u koje treba
employeeiD int primary key not null references employee(employ-
umetnuti podatke. Primer upotrebe ovog oblika komande INSERT: I D),
' t

insert into department count int default l


set name='Asset Management'; ) t ype =InnoDB;
Ovaj oblik omogućava da umetnete samo jedan red po komandi, ali ne morate da insert into warning (employeeiD)
zadate vrednosti za sve kolone. U ovom primeru, zadajemo vrednost samo za kolonu values (6651)
name. Sve ostale kolone će preuzeti podrazumevane vrednosti (u kolonama u kojima su on duplicate key update count=count+l;
takve vrednosti definisane) ili vrednost NULL. U ovom slučaju, koloni department ID Ova opcija je korisna u slučajevima kada ne samo što želite da unesete jedinstvene
prosleđuje se vrednost NULL, usled čega se aktivira mehanizam auto_increment koji vrednosti, već hoćete i da izvršite neku akciju, npr. da povećate određeni brojač, kada
generiše novu vrednost u toj koloni. (U to se možete uveriti ako ponovo izdate w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog događaja je korisna.
komandu select * from department.) Nastavljajući s primerom baze podataka employee, zaposlene kojima je dupliran pri-
Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako IILlrni ključ evidentirali bismo u tabeli warning (upozorenje).
one deluju: Da biste evidentirali upozorenje koje se tiče određenog zaposlenog, izvršite ovu
• Možete zadati da se komanda INSERT izvršava s niskim prioriteom (opcija LOW komandu INSERT. Budući da kolona count ima podrazumevanu vrednost 1 i za nju
PRIORITY), ili da se izvršavanje odloži (opcija DELAYED). Obe opcije čine da se 111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD biće upisana
umetanje podataka u tabelu odloži dok više ne bude nijednog klijenta koji poku- vrt·dnost 1 svaki put kada umetnete red u tabelu . Svaki naredni red koji u kolonu
šava da učita podatke iz tabele. Razlika između ove dve opcije je u tome što • mployeeiD umeće istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE
ko1.1 povcbva brojač.
Poglavlje 5 Umetanje, brisanje i ažuriranje podataka Komanda DELETE
70

ili
Komanda REPLACE
Komanda REPLACE deluje slično komandi INSERT, s tom razlikom što ako dođe do IlE LETE [LOW_PRIORITY] [QUICK] ime tabele [. *] [, ime tabele [. *] ... ]
dupliranja ključa, novi red koji umećete zamenjuje postojeći r~d. ,. v • •
FROM reference na tabele
U MySQL-ovoj dokumentaciji stoji da komanda REPLACE Ima sledeCI opsti obhk: [WHERE uslov]

REPLACE [LOW PRIORITY l DELAYED] .il i


[INTO] ime_ tabele [ (ime_kolone, ... l l
VALUES (izraz, ... ), ( ... ), ... DELETE [LOW_PRIORITY] [QUICK]
FROM ime_tabele[.*] [, ime tabele[.*] ... ]
ili REPLACE [LOW PRIORITY l DELAYED] USING reference na tabele
[INTO] im~_ tabele [ (ime_kolone, ... l l [WHERE uslov]
SELECT ...
Prvi oblik smo već upotrebili u dosadašnjim primerima.
ili REPLACE [LOW_PRIORITY l DELAYED] Druga dva oblika omogućavaju brisanje redova iz jedne ili više tabela uz referenci-
[INTO] ime tabele l anje drugih tabela. Na primer:
SET ime_kolone:izraz, ime_kolone:izraz, ... de lete employee, employeeSkills
Verovatno ste i sami uočili sličnost s komandom INSERT. t r om employee, employeeSkills, department
where employee.employeeiD : employeeSkills.employeeiD
nd employee.departmentiD : department.departmentiD
Komanda DELETE nd department.name:'Finance•;
SQL-ova komanda DELETE omogućava brisanje redova iz tabele. U listingu 5.1 prika- Ovaj primer briše sve zaposlene koji rade u službi Finance i sve zapise o njihovim
zano je nekoliko primera komandi delete, kao što je sledeći: s tručnim kvalifikacijama. Obratite pažnju na to da se redovi brišu samo iz tabela
delete from department; employee i employeeSkills Uer su navedene u odredbi delete), ali ne iz tabele depart-
U ovom obliku, komanda delete briše sve redove iz tabele department. ment Uer je navedena samo u odredbi from).
Redovi će biti izbrisani iz tabela navedenih u odredbi delete, dok će tabele
Pomoću opcije WHERE možete zadati redove koji se brišu, na primer:
navedene u odredbi from biti pretražene ali se redovi iz njih neće brisati, osim ako su
delete from department where name:•Asset Management'; navedene i u odredbi delete.
Ova komanda briše samo redove koji ispunjavaju uslove zadate u odredbi where. Obratite pažnju na to da je ovaj primer prilično složen jer obuhvata čak tri tabele!
U ovom primeru, biće izbrisani samo redovi koji u koloni name sadrže vrednost Za ilustrovanje ovog primera potrebne su nam tri tabele. Takođe vam savetujemo da
Asset Management. ovaj primer i opciju WHERE ponovo proučite pošto pročitate odeljak o spajanju tabela
Nije uobičajeno da se brišu baš svi redove. Međutim, pošto je to najkraći oblik ll poglavlju 7, "Složeniji upiti".
komande delete, može vam se dogoditi daje greškom zadate bez odredbe WHERE. U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju
Možete poštedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa . ta bela. kolona . Pomoću operatora AND spojili smo više uslova . To je primer jedno-
mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano u.pogl.~vlju stavnog logičkog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija
2 Kratak obilazak". Te opcije će vas sprečiti da izbrišete redove (Ih da Izmemte nJihov ~nači "kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije
s~d~žaj) ako pomoću odredbe WHERE ne zadate uslov za ključ, tj. morate zadati da želite će mo objasniti te koncepte.
da izbrišete samo redove koji sadrže određene vrednosti ključeva. Treći oblik komande DELETE sličan je drugom obliku, s tom razlikom što u ovom
U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima sledeći opšti oblik: slu čaju brišemo redove samo iz tabela navedenih u odredbi FROM dok referenciramo
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele tabele u opciji USING. Na primer:
[WHERE uslov] de lete from employee, employeeSkills
[ORDER BY ... ] \! s ing employee, employeeSkills, department
[LIMIT broj_redova] whe re employee.employeeiD : employeeSkills.employeeiD
tnd employee.departmentiD: department.departmentiD
,md department. name : ' Finance' ;
Grupno unošenje podataka pomoću komande LOAD DATA INFILE
72 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka

Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je Možete dodati neobavezno opciju WHERE da biste ažurirali samo određene redove,
1 d o je izosta vite, ažuriraćete sve redove tabele. U ovom slučaju takođe, može vam se
drugačijasintaksa.
Opšti oblik komande DELETE prihvata i druge neobavezne odredbe: ,1, ,Koditi da zaboravite opciju WHERE- sećam se kad je jedan moj površni kolega zadao
111 liO nalik na sledeće:
• Odredba LOW_PRIORITY deluje na isti naČin kao U komandi INSERT.
1 ul te user
• Odredba QUICK može ubrzati komandu DELETE jer nalaže MySQL-u da odloži l password='test';
neke od poslova održavanja indeksa dok briše podatke iz tabele.
Ovaj primer još jednom ističe korist od opcije -- i-am-a-dummy programa mysql,
• Odredba ORDER BY određuje redosled brisanja redova. Najkorisnija je u kombi-
11.11o či tokada imate posla s neznalicama.
naciji sa opcijom LIMIT - na primer, kada želite da izbrišete iz tabele samo n Druga navedena verzija komande UPDATE omogućava ažuriranje više tabela jednom
najstarijih redova. lnluandom. Postupak je sličan brisanju podataka iz više tabela istovremeno, koje smo
• Odredba LIMIT određuje maksimalan broj redova koji komanda DELETE srne da "hJ.ISnili u prethodnom odeljku. Imajte u vidu da će biti ažurirane samo kolone koje
izbriše. Korisna je u kombinaciji sa odredbom ORDER BY ili kada želite da sp re- 1 111.-ito navedete u odredbi SET.
čite brisanje prevelikog broja redova. Sve ostale odredbe komande UPDATE opisali smo ranije . Odredbe LOW_PRIORITY i
IIINORE deluju na isti naČin kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju
11.1 1sti način kao u komandi DELETE.
Komanda TRUNCATE
Komanda TRUNCATE briše sve redove iz tabele. Na primer:
TRUNCATE TABLE employee; rupno unošenje podataka pomoću komande
Ovaj upit briše sve zaposlene iz tabele employee. Brži je od komande DELETE jer LOAD DATA INFILE
radi tako što najpre fizički uklanja celu tabelu a zatim pravi istu takvu ali praznu. l omanda LOAD DATA INFILE omogućava grupno prenošenje podataka iz tekstualne
Vodite računa o tome da komanda TRUNCATE nije uključena u transakcionu obradu. d.tloteke u tabelu, bez potrebe da pišete komande INSERT. Primenjujući ovu tehniku,
1110gli smo da napunimo podacima tabelu department na način opisan u nastavku ovog
•11k·ljka. U listingu 5.2 prikazan je sadržaj datoteke s podacima o nazivima službi koje
Komanda UPDATE lll'ba uneti u tabelu department.
SQL-ova komanda UPDATE omogućava ažuriranje postojećih redova u tabelama baze
podataka. Na primer, pretpostavimo da je jedan od zaposlenih prešao na drugo radno l bli ng 5.2 department_infile.txt
mesto: l Finance
update employee 128 Research and Development
set job='DBA' IWLL Human Resources
where employeeiD='6651'; NULL Marketing
Ova komanda menja vednost u koloni j ob za zaposlenog čija je šifra 6651.
U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima sledeći oblik: Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, što znači
d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna-
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele
SET ime kolonel=izrazl [, ime kolone2=izraz2 ... ) ' una za tabulator. (To se može podesiti i drugačije, što ćemo opisati u nastavku .)
[WHERE uslov] Podatke možete uneti u tabelu department pomoću sledeće komande LOAD DATA
[ORDER BY ... ) INFILE:
[LIMIT broj_redova] lo d data local infile 'department infile.txt'
Into table department; -
ili
Ova mogućnost je naročito korisna kada treba u čitati podatke iz formata neke
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele [, ime_tabele ... ) 1li ugc baze podataka, iz tabele programa za tabelarne proračune ili iz CSV (comma-
SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... ) \l'parated values) datoteke .
[WHERE uslov]
Komanda UPDATE je po mnogo čemu slična komandi DELETE.
Pn1JI;1vlj b Umetanje, brisanje i ažuriranje podataka Sažetak
lli

Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije Za prenošenje podataka iz jednog formata u drugi, često se koristi CSV format
infom1acije o tome potražite u poglavlju ll, "Upravljanje pravima korisnika", naročito (e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi čitaju i
ako imate problema pri izvršavanju ove komande. Pravo izvršavanja ove komande pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu
često je ograničeno iz ozbiljnih bezbednosnih razloga- na primer, da biste sprečili 1. ) prikazana je kratka CSV datoteka dobijena iz Excela.

korisnike da bilo šta unesu u /etc/passwd.


11\ting 5.3 new_programmers.csv
Opšti oblik komande LOAD DATA INFILE izgleda ovako:
tMme, Job, DepartmentiD
LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE
'imeDatoteke.txt' .Julia Lenin,Programmer,128
[REPLACE l IGNORE]
1louglas Srni th, Programmer, 12 8
INTO TABLE ime_tabele
'l' i m O' Le ary, Programmer, 128
[FIELDS
[TERMINATED BY ' \t' ]
[[OPTIONALLY] ENCLOSED BY ''] Ove podatke možete preneti u tabelu employee pomoću sledećeg upita:
[ESCAPED BY ' \ \ ' ] load data infile 'e:\\new_programmers.csv'
Into table employee
[LINES TERMINATED BY '\n'] l ields terminated by • , •
[IGNORE broj LINES] lines terminated by '\n'
[ (ime_kolone, ... ) l lgnore 2 lines
Komanda LOAD DATA INFILE ima sledeće odredbe: (name, job, departmentiD);

• Odredba LOW PRIORITY deluje na isti način kao u komandi INSERT, tj. čeka da Kao što vidite, za prenošenje ovih podataka naveli smo više opcija nego kada su
drugi klijentski programi završe učitavanje podataka iz tabele. Odredba CONCUR- podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istaći
sledeće:
RENT, s druge strane, omogućava drugim klijentskim programima da učitavaju
podatke iz tabele dok je vi punite podacima pomoću komande LOAD DATA • Budućida smo putanju datoteke zadali u formatu uobičajenom u Windowsu/
INF ILE . DOS-u, ~. pu tanja sadrži obrnutu kosu crtu, morali smo da je preslikamo
• U navedenom primeru zadali smo neobaveznu rezervisanu reč LOCAL, koja znači pomoću dodatne kose crte. Zbog toga je putanja zada ta u obliku

da se datoteka s podacima nalazi na klijentskom (lokalnom) računaru. Ako ne 'e:\ \new_programmers. csv'.
zadate ovu odredbu, MySQL će tražiti datoteku na serveru. • Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se
• Ako se pri punjenju tabele podacima ključevi dupliraju, odredbe REPLACE i to ipak mora izričito zadati u komandi .
IGNORE pružaju dve mogućnosti rešavanja tog problema. Opcija REPLACE nalaže • Nije neophodno da izričito zadate da se redovi završavaju znakom za nov red, ali
MySQL-u da postojeći red zameni novim redom, dok opcija IGNORE nalaže mi smo se opredelili da to ipak učinimo.
MySQL-u da zadrži postojeći red. • Pošto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadrže podatke i treba
• Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U opštem ih izostaviti pri učitavanju podataka iz datoteke.
obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih • Pošto datoteka ne sadrži šifre zaposlenih (kolona employeeiD), da bismo preneli
opcija - svaki red s podacima smešten je u zaseban red datoteke, a vrednosti tri kolone podataka u četiri kolone tabele, moraćemo da navedemo ciljne kolone
kolona razdvojene su zarezima.Vrednosti kolona možete omeđiti navodnicima, (i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,
a pomoću obrnute kose crte možete preslikati svaki znak (kao što je polunavod- job, departmentiD).
nik) koji bi MySQL možda pogrešno protumačio .
• Odredba IGNORE broj LINES nalaže MySQL-u da zanemari (preskoči) prvih
broj redova.
Sažetak
U ovom poglavlju razmatrali smo načine umetanja, brisanja i ažuriranja podataka u
• Poslcdnjom odredbom zadajete da želite da popunite podacima samo navedene
tabelama baze podataka.
kolone tabele.
76 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka

LOAD DATA INFILE


Umetanje podataka
• Komanda LOAD DATA INFILE omogućava prenošenje sadržaja tekstualne dato-
• Vrednosti znakovnog tipa treba da budu omeđene navodnicima. Polunavodnike
ili obrnute kose crte unutar vrednosti treba preslikati pomoću obrnute kose crte. teke u tabelu:
LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE
• Komanda INSERT omogućava umetanje podataka u tabelu: •ime_datoteke.txt•
INSERT [LOW PRIORITY l DELAYED] [IGNORE] [REPLACE l IGNORE]
[INTO] ime_ tabele [ (ime_kolone, ... ) l INTO TABLE ime tabele
VALUES ((izraz l DEFAULT), ... ),( ... ), ... [FIELDS
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... ] [TERMINATED BY '\t']
[ [OPTIONALLY] ENCLOSED BY ' ']
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] [ESCAPED BY '\\' ]
[INTO] ime_tabele [(ime_kolone, .. . )]
SELECT ... [LINES TERMINATED BY • \n']
[IGNORE broj LINES]
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] [ (ime_kolone, ... ) l
[INTO] ime_tabele
SET ime kolone=(izraz l DEFAULT), ...
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . .. l Pitanja
• Komanda REPLACE deluje na isti način kao komanda INSERT, s tom razlikom što u 1. Koja od narednih komandi uspešno umeće nov red u tabelu employee?
slučaju dupliranja ključa zamenjuje postojeće redove. Ako se to dogodi u komandi
a)
INSERT, komanda se ne izvrŠava ili aktivira odredbu ON DUPLICATE KEY UPDATE.
insert into employee values
set employeeiD=NULL, name='Laura Thomson',
Brisanje podataka job='Programmer', departmentiD=128;
• Izbegnite katastrofu pomoću opcije --i-am-a-dummy. b)
• Komanda DELETE briše podatke iz atebele: insert employee values
DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele (NULL, 'Laura Thomson', 'Programmer', 128);
[WHERE uslov] e)
[ORDER BY ... ] insert into employee values
[LIMIT redova] (NULL, Laura Thomson, Programmer, 128);
ili DELETE [LOW_PRIORITY] [QUICK] ime tabele [. *]
d)
[,ime tabele[.*] ... ]
- FROM reference_na_tabele insert employee values
[WHERE uslov] (NULL, 'Laura O'Leary', 'Programmer', 128);
ili DELETE [LOW_PRIORITY] [QUICK] 2. Komanda REPLACE
FROM ime_tabele[.*] [, ime_tabele[.*] ... ]
a) slična je komandi INSERT, s tom razlikom što se u slučaju dupliranja vred-
USING reference_na_tabele
[WHERE uslov] nosti ključa postojeći red zamenjuje novim redom
• Komanda TRUNCATE TABLE briše sve redove tabele. b) slična je komandi INSERT, s tom razlikom što se u slučaju dupliranja vred-
nosti ključa postojeći red zadržava a novi zanemaruje
Ažuriranje podataka e) slična je komandi UPDATE, s tom razlikom što se u slučaju dupliranja vred-
• Podatke u tabelama ažurirate pomoću komande UPDATE TABLE: nosti ključa postojeći red zamenjuje novim redom
UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele d) slična je komandi UPDATE, s tom razlikom što se u slučaju dupliranja vred-
SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ] nosti ključa postojeći red zadržava a novi zanemaruje
[WHERE uslov] 3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql
[ORDER BY ... ]
[LIMIT redova] a) sprečava unošenje podataka
ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ] b) spn:čnva ažuriranje podataka ako ni rc zadat~ vrednost odgovarajućeg ključa
SET ime_kolonel•izrazl [, ime kolone2· izraz2 ... ]
[WIIERE us 1ov]
78 Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa

e) sprečava brisanje podataka ako nije zadata vrednost odgovarajućeg ključa


d) i b) i e)
4. U standardnom forma tu datoteke koj u zadate u komandi
podaci su razdvojeni
a) zareztma
LOAD DATA INFILE 6
b) razmacima
e) znakovima za tabulator
Korišćenje upita u MySQL-u
d) znakovima vertikalna crta
5. Neobavezna opcija LOCAL U komandi LOAD DATA INFILE
a) zadaje da klijent i server rade na istom računaru
b) zadaje da se datoteka s podacima nalazi na serveru
e) zadaje da se datoteka s podacima nalazi na klijentskom računaru
D o sAD SMO OBJASNILI PROJEKTOVANJE, izradu i punjenje podacima MySQL-ove
d) zadaje da serverski program radi na lokalnom računaru . haze podataka. U ovom i u dva naredna poglavlja razmotrićemo drugu stranu
postupka: učitavanje podataka iz baze.
Vežbe U ovom poglavlju detaljnije ćemo objasniti SQL-ovu komandu SELECT. To je
wrovatno najvažnija komanda jezika SQL, koja omogućava učitavanje redova iz
1. Napišite grupu komandi INSERT pomoću kojih ćete napuniti podacima tabele
wdne ili više tabela baze podataka.
u svojoj bazi podataka porudzbine.
U ovom poglavlju objasnićemo kako se učitavaju redovi iz jedne tabele baze poda-
2. Izbrišite podatke iz svojih tabela. Lika. Razmotrićemo sledeće teme:
3. Napravite datoteku koja sadrži iste podatke koje ste uneli u tački l i prenesite ih
• Opšti oblik komande SELECT
u svoju bazu podataka porudzbine pomoću komande LOAD DATA INFILE.
• Jednostavni upiti
• Uč itavanje podataka samo iz određenih kolona
Odgovori • Alijasi kolona
• Upotreba odredbe WHERE za učitavanje samo određenih redova
Pitanja
• Upotreba odredbe GROUP BY
l. b
• O graničavanje grupa podataka pomoću odredbe HAVING
2. a
• Sortiranje rezultata upita pomoću opcije ORDER BY
3. d
• O grani čavanje broj a redova rezultata pomoću opcij e LIMIT
4. e
U poglavlju 7, "Složeniji upiti" , b avićemo se složenijim upitima, a naro čito upi-
5. e
tima koji obuhvataju više tabela, te podupitima i raznim vrstama spoj eva izme đu
tabela.
Vežbe U poglavlju 8, "Upotreba M ySQL- ovih ugrađeni h funkcija u komandi SELE CT",
Ne postoji jedno " tačn o" rešenj e vežbi iz ovog poglavlj a. Potrudite se samo da ih sve razmotriće mo brojne fu nkcij e koj e postoj e u M ySQL- u da bi vam pomogle pri upo-
uradite do kraja . trebi upita.
Najpre ćemo pogledati opšti oblik komande SELECT.

U sledećem poglavlju
U poglavlju 6, "Korišćenje upita u MySQL-u", počećemo da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.
HU roglaVIJe b K.OnscenJe up1ta u My:>uL-u Apsolutna 1mena oaza pooataka 1 tabel;

Opšti oblik komande SELECT rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
Komanda SELECT ima sledeći opšti oblik:
Sledeći upit učitava samo vrednosti iz polja employeeiD i name tabele employee:
SELECT kolone
FROM tabele aelec t name, employeeiD from employee;
[WHERE uslovi] Ako ovaj upit izvršite u bazi podataka employee, trebalo bi da dobijete rezultate
[GROUP BY grupe nalik na slediće:
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje] ·---------------+-------------+
[LIMIT broj] ; l name l employeeiD
Ovo nije potpuna sintaksa- objasnićemo je u narednom poglavlju- ali ilustruje
·---- -----------+-------------+
Ajay Patel 6651
opšti oblik komande. Odredbe koje su ovde navedene opisaćcmo u ovom poglavlju. Nora Edwards 7513
Komanda SELECT ima veliki broj neobaveznih odredaba. Ne morate ih uvek navo- Candy Burnett 9006
diti, ali ako ih upotrebite, morate ih zadati redosledom koji je prikazan u opšte m Ben Smith 9842
obliku komande. ·---- ---------+---------------+
~ rows in set (0.00 sec)
Kao što vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu.
Jednostavni upiti Obratite pažnju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne
Primer najjednostavnijeg oblika komande SELECT izgleda ovako: rcdosledom kojim su definisane u šemi baze podataka.
select * from department;
Ako ovaj upit izvršite s podacima koji postoje u bazi podataka employee, trebalo bi Apsolutna imena baza podataka i tabela
da dobijete rezultate nalik na sledeće: Dodatan oblik notacije koji bi trebalo da imate u vidu omogućava zadavanje apsolut-
+---------------+--------------------------+ nih imena baze podataka i tabele s kojom želite da radite. Kolonu name tabele
l departmentiD l name l employee možemo navesti u upitu kao employee. name.
+---------------+--------------------------+
42 Finance l select employee.name
128 Research and Development l from employee;
129 Human Resources l Trebalo bi da rezultati ovog upita budu nalik na sledeće:
130 Marketing l
+---------------+--------------------------+ ·---------------+
4 rows in set (0.00 sec) l name
t---------------+
Ovaj upit je u čitao sve podatke iz zadate tabele - tj. sve redove i sve kolone iz Ajay Patel
tabele department. Nora Edwards
Postupak možete isprobati i na nekoj drugoj tabeli- na primer, učitajte sve redove Candy Burnett
i sve kolone iz tabele employeeSkills. Ben Smith
Razume se, suština relacione baze podataka svakako nije u tome da vam daje sve
·--------- --- ---+
4 rows in set (0.41 sec)
podatke koje ste u nju uneli, već da vam omogući da nađete određene podatke.
Slično tome, možete izričito zadati koju tabelu u kojoj bazi podataka imate na umu,
nn primer:
Učitavanje podataka iz određenih kolona selec t name
U narednom koraku ograničićemo kolone iz kojih učitavamo podatke. Znak * u irom employee.employee;
prethodnom primeru upita (select * from department) znači "sve kolone tabele" . (Trebalo bi da pomoću ovog upita dobijete isti rezultat kao pomoću prethodnog
Umesto zvezdice, možete zadati samo kolone iz kojih vam trebaju podaci. To može upita.)
biti samo jedna kolona, nekoliko kolona tabele, ili čak sve kolone tabele poređane
t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U upuucuct uurcuuc vvncnc Let ucnctVCifiJC ~ctrnu uurcucr1111 rt:uuvd

U ovom primeru, izričito navodimo da želimo podatke iz tabele employee koja se U poslednja dva primera rezervisana reč AS nije bila neophodna. Upit smo mogli
nalazi u bazi podataka employee. Notacija u ovom slučaju je baza_podataka . tabela. da napišemo i u sledećem obliku:
Ako je potrebno, možete zadati kojoj bazi podataka i tabeli pripada određena kolona. oe lect name employeeName
Isti primer može se napisati pomoću sintakse baza_podataka. tabela . . kolona u sle- Lrom employee;
dećem obliku: ili
select employee.employee.name se lect e.name
from employee; from employee e;
Ova sintaksa nije naročito korisna za ovakve jednostavne upite, ali kad budete Upite možete pisati u obliku koji smatrate najpogodnijim. To je isključivo pitanje
prešli na složenije upite, ona će vam omogućiti da na nedvosmislen način zadajete li čnog
stila programiranja. Kao što ćete videti u ovom poglavlju i na mnogim drugim
podatke koji su vam potrebni. mestima u knjizi, isti upit može se napisati na više različitih načina. Kao i u drugim
programskim jezicima, lični stil svakog programera na SQL-u razlikuje se od ostalih .
Alijasi
Sada bi trebalo da objasnimo koncept alijasa kolona i tabela. Upotreba odredbe WHERE za učitavanje
Kolonama i izrazima u komandi SELECT možete dodeliti drugačija imena, koja će
se prikazivati u rezultatima. Na primer, možemo upotrebiti sledeći upit:
samo određenih redova
Dosad smo razmatrali učitavanje svih podataka sadržanih u tabeli i učitavanje svih
select name as employeeName
podataka samo iz određenih kolona. Sada ćemo preći na učitavanje samo određenih
from employee;
redova. To je korisno jer često treba da iz jedne ili više tabela učita te samo zapise koji
U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon- ispunjavaju određene uslove. Ta mogućnost postaje još važnija kada je potrebno uči­
tekstu ovog upita. Rezultati izvršavanja ovog upita u bazi podataka employee izgle- tati samo nekoliko traženih redova iz veoma obinme tabele.
daju ovako: To se može obaviti pomoću odredbe WHERE komande SELECT. Jednostavan primer
+---------------+ bio bi sledeći:
l employeeName se lect employeeiD, name
+---------------+ from employee
Ajay Patel
Nora Edwards where job='Programmer';
Candy Burnett (Uzgred, imajte u vidu da se tekst upita može rasporediti u više redova. Svaki upit
Ben Smith se završava znakom tačka i zarez. (;). Upite pišemo na taj način da bi bili čitljiviji.)
+---------------+ Rezultati izvršavanja ovog upita u bazi podataka employee izgledaju ovako:
4 rows in set (0.01 sec)
Kao što vidite, sadržaj kolone name sada je prikazan ispod zaglavlja employeeName .
+- --- - --------+--------------+
l employeeiD l name
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje određena pra- +--- ----------+--------------+
vila o tome šta se može a šta se ne može raditi sa alijasima, koja ćemo objasniti kad 6651 l Ajay Patel l
dođemo na tu temu . 7513 l Nora Edwards l
Navedeni primer alijasa nije naročito koristan. Međutim, pravu moć alijasa shva- +- ------------+--------------+
2 rows in set (0.42 sec)
ti ćete kad počnete da pišete složenije upite i upite u kojima se nešto izračunava.
Alijasi se mogu zadavati i za tabele, kao u sledećem primeru: 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.
select e.name
from employee as e; Obratite pažnju na to da smo u upitu kombinovali uslov s kolonama koje nam tre-
baju (employeeiD i name) da bismo učitali samo podatke koji su nas zanimali .
Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe ali-
U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite
j asa. Ovaj način notacije postaće koristan kada u narednom poglavlju počnete da
pa žnju na to da u SQL-u znak = služi za ispitivanje jednakosti. To je različito od mn -
izvršavate upite koji obuhvataju više tabela.
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 pomoću opcije DISTINCT

Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje ćemo detaljno d.IJ C ove podatke:
objasniti u poglavlju 8. Zasad ćemo navesti samo operatore koji se najčešće koriste:
--- ------------------+
• Jednakost, ili=, što smo već koristili. job
• Nejednakost (različitost), koja se piše kao ! = ili <>. --- ------------------+
Programmer
• Sve kombinacije > (veće od), < (manje od), >= Uednako ili veće od), i <= Ued- Programmer
nako ili manje od). Sys tems Administrator
OBA
• IS NULL i IS NOT NULL, pomoću kojih se ispituje da li određena vrednost jeste
ili nije NULL. To ne možete utvrđivati pomoću izraza nekavrednost=NULL. (Zbog
-- -------------------+
rows in set (0 . 01 sec)
čega to ne može, objasnićemo u poglavlju 8.)
Obratite pažnju na to da se podatak Programmer pojavljuje dvaput jer postoji
• Uobičajeni aritmetički operatori koje biste očekivali i koji se najčešće koriste
ll dva reda tabele. Upit je u čitao listu svih vrednosti iz kolone job tabele employee .
u kombinaciji s operatorima za poređenje. Na primer, možete ispitati da li je
A sada, pogledajte sledeći upit:
nekavrednost > nekadrugavrednost*lO.
• lect distinct job
• Standardni logički operatori AND, OR i NOT, koji se koriste za povezivanje više It om employee;
uslova. Budući da imaju niži prioritet od operatora za poređenje, na primer,
izraz plata > 30000 AND plata < 50000 izračunava se kako biste i očekivali. Ovaj upit daje sledeće rezultate:

Osim operatora, u nekim primerima koristićemo i funkcije. Funkcija count (l


-- -------------------+
job
omogućava prebrojavanje redova koje je upit učitao. Na primer: --- -------- - ---------+
select count(*) from employee; Programmer
Systems Administrator l
Ovaj upit pokazuje koliko redova sadrži tabela employee. OBA 1
I najzad, standardni redosled prioriteta izračunavanja delova izraza možete menjati - --------------------+
tako što ih grupišete između zagrada. l rows in set (0.04 sec)
Sledeći primer je nešto složeniji upit u kojem je zada ta odredba WHERE: U ovom primeru duplikati se ne pojavljuju.
select * from assignment U ovom slučaju razlika ne izgleda tako značajna - naravno, drugi skup rezultata je
where employeeiD=6651 and hours > 8; tlt'Što uredniji, ali poboljšanje i nije tako veliko. Bilo bi primetnije kada biste imali
Ovaj upit učitava iz kolone assignment sve poslove na kojima je zaposleni čija je opsežnu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili tačne
šifra employeeiD 6651 (Ajay Pate!) radio više od osam časova. podatke.
Važno je istaći da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone S druge strane, pogledajte sledeći upit:
tabela, već morate navesti izvorno ime kolone. To je ograničenje ANSI standarda za mysql> select count(job) from employee;
jezik SQL. Razlog je to što vrednost kolone predstavljene alijasom možda neće biti --- -------+
poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE. count (job) 1

-- --------+
4 l
Uklanjanje dupliranih vrednosti pomoću -- --------+
row in set (0 . 01 sec)
opcije DISTINCT Prema rezultatima ovog upita, kolona j ob sadrži četiri vrednosti . To navodi na
Pomoću rezervisane reči DISTINCT navodite da u rezultatima upita ne želite da vidite
po~rešan zaključak jer nije tačno da u toj koloni postoje četiri različite vrednosti. Ako
duplirane vrednosti. Na primer, sledeći upit:
pogledate podatke u tabeli, videćete da kolona j ob sadrži samo tri različite vrednosti.
select job Lako vam se može dogoditi da greškom zadate prethodni upit kada ste imali na
from employee; 11111u sledeći upit:
l ct count(distinct job) from employee;
Sortiranje učitanih rezultata pomoću odredbe ORDER BY
86 Poglavlje 6 Korišćenje upita u MySQL-u

ltl•zultati će biti nalik na sledeće:


On daje sledeći rezultat:
+---------------------+ -- ---+---------------------- -+
l count(distinct job) l ·ount (*) l job l
+---------------------+ --- ---+-----------------------+
l l Systems Administrator l
3 l
2 l Programmer l
+---------------------+ l l DBA l
1 row in set (0.05 sec)
-- ----+-----------------------+
Ovaj rezultat pokazuje koliko se razli{itih vrednosti nalazi u koloni job, što je koris- oows in set (0 . 04 sec)
niji podatak. )(Jo što vidite, nazivi radnih mesta sada su prikazani opadajućim abecednim redo-
lodom. Možete da zadate opciju ASC (od engl. ascending, rastući redosled), ali pošto se
1 q tl•closled podrazumeva, nema potrebe da ga izričito zadajete.
Upotreba odredbe GROUP BY . , . . V ·

Sledeća 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
l/dvajanje određenih grupa podataka pomoću
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 razmotrićemo više drugih. opcije HAVING
Pogledajte sledeći upit: · l c· d cća odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je
olodata odredba HAVING deluje na sličan način kao komanda SELECT kojoj je dodata
select count(*), job
ou lc cdba WHERE. Na primer:
from employee
group by job; ct count(*), job
1
Ovaj upit prebrojava zaposlene po radnom mestu- tj. utvrđuje broj zaposlenih. po l e om employee
11 oup by job
svakom radnom mestu. Ako izvršite ovaj upit u bazi podataka employee, trebalo bt da
lt.,ving count (*l =l;
dobijete rezultat nalik na sledeći:
O vaj upit učitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu-
+----------+-----------------------+ :hl'nik. Trebalo bi da rezultati budu nalik na sledeće:
l count(*) l job l
+----------+---------------- - ------+ ---- ----+-----------------------+
l l DBA l count(*) l job l
2 l Programmer l ----- -- -+-----------------------+
1 l Systems Administrator l l l DBA l
+----------+----------------- - -----+ l l Systems Administrator l
3 rows in set (0.04 sec) -- ------+---------------------- -+
' rows in set (0.05 sec)
Postoje dve razlike između načina na koji odredba GROUP BY radi u MySQL-u
i u standardnom ANSI SQL-u. Prema našem dosadašnjem iskustvu, početnici u jeziku SQL često brkaju odredbe
U ANSI SQL-u, u odredbi GROUP BY morate navesti sve kolone koje ste zadali WII ERE i HAVING. Odredbu WHERE možete upotrebiti U gotovo svakom upitu koji snu-
u odredbi SELECT. MySQL dozvoljava da u odredbi GROUP BY zadate i dodatna polja \li tc da biste zadali uslove koji se odnose na pojedinačne redove . Odredbu HAVING
~ oristite kada određeni uslov treba da važi za celu grupu.
kojih nema u odredbi SELECT. .
MySQL omogućava da izaberete redosled grupa kojim se prikazuju rezultati. Podra-
zumeva se rastući redosled. Ako želimo da ponovimo poslednji upit, ali tako da se
Sortiranje učitanih rezultata pomoću odredbe ORDER BY
rezultati prikažu opadajućim redosledom, možemo upotrebiti sledeći upit:
S k-d eć a odredba komande SELECT jeste odredba ORDER BY koja omogućava sortiranje
select count(*), job t l'rttltujućih redova po jednoj ili više kolona. Redosled sortiranja može biti rastući , što
from employee st' ozna čava sa ASC, ili opadajući, što se označava sa DESC. Na primer:
group by job dese;
' 1 ct *
l tom employee
o td r by j ob a se , n me d sc ;
Sažetak
BB Poglavlje 6 Korišćenje upita u MySQL-u

Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
Ovaj upit učitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani
kojeg počinje učitavanje) a drugi je maksimalni broj redova koji želimo da se učita.
po abecednom redosledu sadržaja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.t o radno
Uporedite to s prethodnim slučajem: kada zadamo samo jedan parametar, on predsta-
mesto, oni će biti sortirani opadajućim abecedmm redosledom po unemma l prezl-
vlja maksimalni broj redova koji želimo da se učita.
menima. Rezultati upita izgledaju ovako: Kada zadajemo pomak, on počinje od O (kao što se vidi u prethodnom primeru-
+ --------------+-----------------------+--------------+ za šesti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT učitava
+------------ - 1 · b l departmentiD l
1 employeeiD l name JO --------------+ redove od O do 4, a drugi primer učitava redove od 5 do 7.
+------------+---------------+-----------------------i 42 l Ako kao vrednost drugog parametra zadate -1, upit će učitati redove od pomaka
l 9842 l Ben Smith DBA l 128 l do kraja tabele.
l 7513 l Nora Edwards Programmer l 128 l
1 6651 1 Ajay Patel Programmer Odreba LIMIT se najčešće koristi u kombinaciji sa odredbom ORDER BY da bi rede-
9006 1 candy Burnett Systems Administrator l 128 l sled redova u rezultatima upita imao određeni smisao. Imajte u vidu da bez odredbe
l
+------------+---------------+-----------------------+--------------+ ORDER BY, redosled redova rezultata nije predvidljiv.
4 rows in set (0.02 sec) Ova odredba je naročito korisna u We b ili GUI aplikacijama koje koriste MySQL
Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, p~~razumeva se jer omogućava jednostavan mehanizam podele rezultata na stranice.
ASC. Ukoliko ne zadate odredbu ORDER BY, ništa se ne može pretpostav1t1 o redosledu
redova u skupu rezultata.
Sažetak
Ograničavanje broja redova rezultata pomoću • Komanda SELECT ima
SELECT kolone
sledeći opšti oblik:

odredbe LIMIT . . . FROM tabele


Poslednja odredba komande SELECT koju ćemo razmotriti u ovom poglavlju jeste [WHERE uslovi]
[GROUP BY grupa
odredba LIMIT. . . . · le- [HAVING uslovi_ za_grupe]]
Odredba LIMIT ograničava broj redova rezultata koje up1t daje. Na pnmer, pog [ORDER BY kolone_za_sortiranje]
dajte sledeći upit: [LIMIT broj] ;
• Odredba select * učitava sve kolone; select ime kolone učitava samo nave-
select *
from employeeSkills denu kolonu.
limit 5; • Tabele možemo navoditi kao baza_podataka. tabela a kolone kao tabe-
Ovaj upit daje samo prvih pet redova koji ispunj.ava~u zadati uslov. U ovom slu- la. kolona ili baza_poda taka. tabela. kolona da bismo izbegli dvosmislenost.
čaju, to je prvih pet redova učitanih uz tabele, kao sto je pnkazano: • Alijasi su alternativna imena za tabele i kolone, a zadaju se na sledeći način:
select kolona as alijas_kolone
+------------+-------+
1 employeeiD l skill l from tabela as alijas_tabele;
+------------+-------+ • Odredba WHERE služi za učitavanje redova koji ispunjavaju zadate uslove.
6651 l Java l • Rezervisana reč DISTINCT uklanja duplirane podatke iz skupa rezultata.
6651 l VB l
7513 l e l • Odredba GROUP BY obrađuje redove rezultata grupu po grupu. Koristi se prven-
7513 l Java l stveno u kombinaciji s funkcijama koje deluju na grupe redova, kao što je funk-
7513 l Perl l cija count () .
+----------- -+-- --- --+ • Odredba HAVING deluje slično odredbi WHERE, ali na grupe.
5 rows in set (0.44 sec)
Možete zadati i da želite podskup redova drugačiji od prvih n. Ako pomo~u p:e- • Odredba ORDER BY sortira redove rezultata prema sadržaju kolona koje navedete.
thodnog upita hoćemo da učitamo redove od 6 do 8, to ćemo uraditi na sledeCl nacm: • Odredba LIMIT određuje koji će redovi biti učitani iz mogućeg skupa rezultata.
Maksimalni broj redova zadaje se u obliku pomaka od kojeg počinje u čitavanje.
select *
from employeeSkills
limit 5, 3;
Ud govon
90 Poglavlje 6 Korišćenje upita u MySQL-u

4. Gde se alijas ne može zadati?


Pitanja a) za kolone
1. Koji od narednih upita učitava sve podatke iz tabele client? b) za tabele
a) e) U odredbi WHERE
select * d) U odredbi SELECT
from client
where clientiD=2; S. Ako nam iz rezultata upita trebaju redovi od lS do 20, odgovarajuća odredba
LIMIT je
b)
select clientiD, name, address, contactPerson, contactNumber a) LIMIT lS, 20
from client; b) LIMIT 14, 19
e) e) LIMIT 14, s
select * from client d) LIMIT lS, s
limit l;
d)
select all from client; Vežbe
2. Koji od sledećih upita učitava sve programere iz tabele employee? 1. Napišite upit koji daje sve podatke o zaposlenima u službi (tabela department)
čija je šifra 128.
a)
select * 2. Napišite upit koji iz kolone employeeiD učitava sve šifre zaposlenih koji su radili
from employee za klijenta čija je šifra l.
where job='Programmer'; 3. Napišite upit koji za svakustručnu kvalifikaciju evidentiranu u tabeli employee-
b) Skills daje ukupan broj zaposlenih koji je imaju.
select *
from employee
having job='Programmer'; Odgovori
e)
select * Pitanja
from employee l. b
where job='Programmer'
2. a
group by job
having job='Programmer'; 3. d
d) 4. e
select job S. e
from employee;
3. Koji od sledećih upita ne daje ukupan broj zaposlenih evidentiranih u tabeli Vežbe
employee? 1.
a) select *
select count(employeeiD) from employee; from employee
where departmentiD=128;
b) 2.
select count(employeeiD) as total from employee;
select employeeiD
e) from assignment
select count(distinct employeeiD) from employee; where clientiD=l;
d) 3.
select count(employeeiD) from employee group by employeeiD; s l cL skill , count(skill)
f 1·om mploy Skills
CJI Oll Jl IJy ll k { ) J ;
92 Poglavlje 6 Korisćenje upita u My~UL-u

U sledećem poglavlju
U sledećem poglavlju, "Složeniji upiti", razmatraćemo upite koji obuhvataju više
tabela i druge detalje komande SELECT. 7
Složeniji upiti

u OVOM POGLAVLJU BAVIĆEMO


SE složenijim upitima. Razmatraćemo prven-
stveno kako se mogu izvršavati upiti koji obuhvataju više tabela istovremeno. Zbog
toga ćete morati da savladate koncept spajanja tabela, tj. način na koji se tabele mogu
međusobno povezati.
Razmotrićemo sledeće teme:

• Izvršavanje upita koji obuhvataju više tabela primenom sledećih vrsta spojeva:
• Prirodnih, unutrašnjih i unakrsnih spojeva
• Jednakovrednih spojeva
• Levih i desnih spojeva
• Podupiti
• Upotreba opcija komande SELECT

Upotreba spojeva u upitima koji obuhvataju više tabela


Svi upiti iz poglavlja 6, "Korišćenje upita u MySQL-u", učitavali su podatke iz samo
jedne tabele. Budući da smo se potrudili da dođemo do normalizovane strukture baze
podataka u kojoj su podaci razmešteni u više tabela, korist od mogućnosti učitavanja iz
samo jedne tabele prilično je ograničena. Ono što je zaista zanimljivo u relacionim
bazama podataka jesu relacije, odnosno veze koje postoje između pojedinih tabela. Kada
sc podaci učitavaju iz više tabela istovremeno, te veze se nazivaju spojevi (engl.joins).
Pogledajmo prvo upite koji povezuju dve tabele.

Spajanje dve tabele


Pogledajte sledeći upit:
select employee.name, department.name
trom employee, department
where employee.departmentiD = department.departmentiD;
rogtaVIJC l :>IOZCniJI Upili upotreoa spoJeva u up1t1ma KOJI oounvataJu v1se taoela

Kao što vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom ' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih mogućih kombinacija
slučajuželimo da učitamo imena zaposlenih i nazive službi u kojima rade. Rezultati lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
ovog upita izgledaju ovako: Sasvim je očigledno da je odredba WHERE ključna za dobijanje rezultata koji nam
+---------------+--------------------------+ li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomoću kojih pove-
l name l name t ujemo tabele zove se spojni uslov. U ovom slučaju, uslov je employee. department ID
+---------------+--------------------------+ de partment. department ID, što je veza između tabela koju smo definisali preko
Ben Smith Finance \poljnih ključeva još u šemi baze podataka.
Ajay Patel Research and Development
Nora Edwards Research and Development Kada želite da istovremeno učita te podatke koji se nalaze u više tabela, morate upo-
Candy Burnett Research and Development trebiti veze između tih tabela da biste pronašli podatke koje tražite. Ponekad to znači
+---------------+--------------------------+ da morate pronaći put od podataka koje znate do podataka koje tražite. U narednom
4 rows in set (0.42 sec) odeljku opširnije ćemo objasniti tu ideju.
Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u različitim U prethodnom primeru rezultata obratite pažnju i na to da u zaglavljima obe
tabelama. (Obratite pažnju na to da smo upotrebili notaciju s tačkom, kako je opisano kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada.
u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene ltezultati će biti razumljiviji ako upotrebite alijase, na primer:
kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da sel ect employee.name as employeeName, department.name as department-
navedemo imena obeju tabela u odredbi FROM. Name
Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvršite bez Jrom employee, department
where employee . departmentiD department.departmentiD;
odredbe WHERE, u sledećem obliku:
Ovaj upit daje sledeće rezultate:
select employee.name, department.name
from employee, department; 1---- -----------+--------------------------+
dobićete sledeće rezultate:
l employeeName l departmentName
1--- ------------+--------------------------+
+-- -- -----------+--------------------------+ Ben Smith Finance
l name l name Ajay Patel Research and Development
+---------------+--------------------------+ Nora Edwards Research and Development
Ajay Patel Finance Candy Burnett Research and Development
Nora Edwards Finance ·--- ------------+--------------------------+
Candy Burnett Finance 1 rows in set (0.55 sec)
Ben Smith Finance
Ajay Patel Research and Development Sadržaj ovog skupa rezultata je razumljiviji nego prethodni.
Nora Edwards Research and Development
Candy Burnett Research and Development Spajanje više od dve tabele
Ben Smith Research and Development Spajanje više tabela ne razlikuje se od spajanja samo dve tabele.
Ajay Patel Human Resources Recimo da treba utvrditi iz koje su službe zaposleni koji su radili za klijenta čije je
Nora Edwards Human Resources
ime Tele o Inc. Kako da dođemo do tih podataka?
Candy Burnett Human Resources
Ben Smith Human Resources Pošto znamo ime klijenta, u koloni clientiD tabele client možemo pronaći njegovu
Ajay Patel Marketing ši fru . Pomoću tog podatka potražić~mo u tabeli assignment poslove obavljene za tog
Nora Edwards Marketing klijenta i šifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima
Candy Burnett Marketing možemo zatim pronaći u tabeli employee šifre službi u kojima rade ti zaposleni. I najzad,
Ben Smith Marketing
p o moću tih podataka pronaći ćemo u tabeli department odgovarajuće nazive službi!
+- - -------------+--------------------------+
16 rows in set (0.01 sec) Pošto smo osmislili putanju traženja kroz sve Četiri tabele, preostaje nam da tu
logiku preslikamo u odgovarajući upit, što daje sledeće:
Prvi upit, kojem je pridružena odredba WHERE, prikazuje zaposlene s tačnim poda-
cima o slu žbama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i select department.name
irom c l ient, assignment, employee, department
slu žbi , pri če mu nij e moguće utvrditi koji redovi rezultata sadrže ta č n e pod.11 kl· a koji wh re c li ent . name= 'Telco Inc '
I'U91č1VIJe l ::IIUZeniJI Ufllll Vrste spoJeva 1zmeau tall' 1:1

and client.clientiD = assignment.clientiD To možemo obaviti pomoću sledećeg upita:


and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD; select e2.name
from employee el, employee e2
Nakon izvršavanja upita, dobijamo ove rezultate: where el.name = 'Nora Edwards'
+--------------------------+ and el.departmentiD = e2.departmentiD;
l name Kao što vidite, u ovom upitu deklarisali smo dva različita alijasa za tabelu employee.
+--------------------------+ Time smo opisali MySQL-u da ćemo raditi kao da imamo dve zasebne tabele, el i e2,
l Research and Development l
+--------------------------+ koje slučajno sadrže iste podatke. Zatim smo te tabele spojili, na isti način kao što
l row in set (0.00 sec) bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potražili
U upitu koji smo napisali uočićete da smo morali navesti sve tabele u putanji koju red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a
smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom slučaju zatim smo u tabeli e2 potražili redove koji u koloni departmentiD sadrže istu šifru
imamo jedan običan uslov- client. name = 'Tel co Inc' - i više spojnih uslova. službe kao ona u kojoj radi Nora (el. department ID = e2. department ID).
Obratite pažnju na to da smo spojili četiri tabele pomoću tri spojna uslova. Možda će vam trebati malo vremena da se naviknete, ali ako možete da zamislite da
Primenom ovog pravila možete proveriti da li ste zadali sve potrebne uslove. Kada radite s dve različite tabele, ne bi trebalo da imate većih teškoća.
spajate n tabela, u većini slučajeva, trebaće vam po jedna veza između svakog para tabela, Ovo su rezultati prethodnog upita:
što znači 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. 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 službi kao Nora. Kao što se vidi, na listi se
nalazi i Nora. Upitu možemo lako dodati nov uslov koji će je isključiti is skupa rezultata:
assignment.employeeiD=employee.employeeiD select e2.name
from employee el, employee e2
where el.name = 'Nora Edwards'
and el.departmentiD = e2.departmentiD
assignment.departmentiD=department.departmentiD
and e2.name != 'Nora Edwards';

Vrste spojeva između tabela


Postoji više vrsta spojeva koji se mogu uspostaviti između MySQL-ovih tabela.
Slika 7.1 Za povezivanje četiri tabele potrebna su tri spoja.

Osnovni spoj
Spajanje tabele same sa sobom - samospoj U prethodnom odeljku, pomenuli smo koncept Dekartovog proizvoda. On se ponekad
Kao što jednu tabelu spajamo s drugom, isto tako možemo je spojiti i sa samom sobom. naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira
Zašto bismo to uradili? Ponekad ćete tražiti veze između redova u istoj tabeli. Pretpo- na ime, sastoji se od skupa svih mogućih kombinacija redova tabela. Kada tom spoju
stavimo da želimo da saznamo imena svih zaposlenih koji rade u istoj službi kao Nora dodamo određeni uslov (kao što je employee. department ID = department. de-
Edwards. Da bismo došli do tih podataka, prvo moramo u tabeli employee pronaći šifru partmentro), dobijamo nešto što se ponekad nazivajednakovredni spoj (engl. equij"oin),
slu žbe (kolona department ID) u kojoj radi Nora, a zatim ćemo u tabeli employee koji ograničava broj redova u skupu rezultata.
potra7iti i sve ostale zaposlene koji rade u toj službi.
ruyli:IVIJt: l .:>IULt:nljl Upili
Podu piti

Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time
Levi spoj radi tako što za sve redove tabele na levoj strani spoja (u ovom primeru to
se dobija unakrsni spoj, kao što je već opisano, koji se pretvara u jednakovredni spoj kada
ll' tabela employee) traži odgovarajuće redove u tabeli na desnoj strani spoja. Pronađeni
mu dodamo odredbu WHERE. MySQL podržava više oblika sintakse za ou vrstu spoja.
1 ·dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u
Pogledajmo izvorni upit:
desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL . Redove iz leve tabele bez
select employee.name, department . name parnjaka u desnoj možete pronaći ako zadate uslov daje vrednost ključa u desnoj tabeli
from employee, department
NULL.
where employee.departmentiD ; department.departmentiD;
Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za
Umesto zareza, može se zadati neobavezna rezervisana reč JOIN: nekog spoljnog klijenta, dobićemo red s podacima o zaposlenom i o poslu koji je
select employee.name, department.name obavio. Kada za nekog zaposlenog ne postoji odgovarajući red u tabeli assignment, levi
from employee join department spoj generiše "prazan red" u kojem sve kolone sadrže vrednost NULL. Te prazne redove
where employee.departmentiD ; department.departmentiD;
možemo pronaći tako što potražimo sve zaposlene koji su nešto radili za spoljnog
Osim reči JOIN, možete zadati i CROSS JOIN ili INNER JOIN. klijenta čija šifra (kolona clientiD) sadrži vrednost NULL. (Ne bi trebalo da takav
Kada zadate ovu vrstu spoja, MySQL pretražuje sve tabele koje ste zadali i pokušava s l učaj postoji u tabeli assignment budući daje clientiD polje ključa.)
da pronađe najefikasniji način spajanja, pri čemu ne spaja tabele obavezno redosledom U verzijama MySQL-a pre 4.1, ta tehnika se često koristila jer nije bilo podu pita.
koji ste naveli. Događa se i to da upit ne bude uvek najbolje optimizovan, što ćemo Podupiti su objašnjeni u nastavku ovog poglavlja.
detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako želite da zanemarite U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da
rezultate optimizatora i naložite MySQL-u da spoji tabele baš redosledom koji ste upotrebimo i operator RIGHT JOIN, koji deluje na isti način, s tom razlikom što je
naveli, zamenite reč JOIN rečima STRAIGHT JOIN. desna tabela osnova, a nedostajući redovi iz tabele na levoj strani dopunjuju se vred-
nostima NULL .
Levi i desni spoj
Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezer-
visane reČi JOIN, CROSS JOIN, INNER JOIN ili možda STRAIGHT JOIN, i tražili pove- Pod upiti
zane redove u dve ili više tabela. Šta ako želimo da pronađemo sve redove u jednoj Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit čiji se rezultat
tabeli za koje ne postoje odgovarajući redovi u drugoj tabeli? koristi u drugom upitu. Ponekad se nazivaju i ugnežđenim upitima (engl. nested queries).
Razmotrimo slučaj u kojem želimo da pronađemo zaposlene koji još nisu radili na Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogućnost korisnici su već duže
poslovima za spoljne klijente kompanije, tj. zaposlene čije šifre (vrednosti u koloni vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti često lakše razu-
employeeiD) ne postoje u tabeli assignment .To se može uraditi pomoću levog spoja, nlljivi kada se, umesto složenih spojeva između tabela, upotrebe podupiti.
odnosno operatora LEFT JOIN, na sledeći način: Već ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i ažuri-
ra nj e redova u više tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
select employee . name
from employee left join assignment brisanje i ažuriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
on employee.employeeiD; assignment.employeeiD U ovom poglavlju opisaćemo upotrebu podupita u komandama SELECT.
where clientiD is null; MySQL-u su dodate dve osnovne vrste podupita:
Ovaj upit daje sledeće rezultate: • Podupiti za izvedene tabele
+- - -------------+ • Podupiti za izraze.
l name l Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve
+--- ------------+
l Ajay Patel l podvrste:
l Candy Burnett l • Pod upite čiji je rezultat jedna vrednost ili red
l Ben Smith l
• Podupite za izraze logičkog tipa
+-- -------------+
3 rows in set (0.49 sec) Po gledaćemo redom po jedan primer svake pomenute vrste pod upita.
Ako pogledate sadržaj tabela, lako ćete se uveriti da su rezultati tačni, ali kako sm o
do njih došli ?
l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill
Pod upiti

Podupiti za izvedene tabele , . . . U ovom primeru tražimo zaposlenog koji bi mogao zaslužiti "titulu" najvrednijeg
Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta 1.1dnika u firmi. Pita~ e je sledeće: koji je zaposleni proveo najviše radnih sati dnevno
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu. 11~ nekom poslu?
Pogledajte sledeći jednostavan upit: Ovo su rezultati izvršavanja upita:
select employeeiD, name from employee where job='Programmer'; 1--- ----------+---------- ----+
Jasno je da ovaj upit učitava šifre i imena zaposlenih koji su programeri. Ovaj upit l employeeiD l name
možemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:
l -- ----------+--------------+
l 7513 l Nora Edwards l
select programmer.name 1-- -----------+------------ --+
from (select employeeiD, name from employee where job='Programmer') l row in set (0.42 sec)
as programmer,
assignment Mogu se napisati i upiti koji umesto jedne vrednosti, vraćaju red s više vrednosti, ali
where programmer.employeeiD = assignment.employeeiD; .Jl: korist od toga često ograničena. U nastavku teksta obradićemo primer takvog upita.
U ovom primeru upotrebili smo podupit (select employeeiD, name from
Podupiti za izraze logičkog tipa
employee where j ob= • Programmer ') da bismo formirali izvedenu tabel u čiji redovi
Podupiti za izraze logičkog tipa (engl. Boolean expression subqueries) omogućavaju da se
sadrže samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'pro-
u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima
grammer •. Tu tabel u možemo potom pretraživati na isti način kao bilo koju drugu
l ogičkog tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME.
tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili
Rezervisana reč IN omogućava poređe~e s grupom vrednosti. Pogledajte sledeći
za spoljne klijente i dobili smo sledeće rezultate:
upit:
+--------------+ ne lect name
l name I r om employee
+--------------+ where employeeiD not in
l Nora Edwards l (select employeeiD
+--------------+ from assignment);
1 row in set (0.01 sec)
Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT
Podupiti koji daju jednu vrednost JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog
Kao u prethodnom odeljku, počećemo jednostavnim upitom: klijenta. Rezervisana reč IN omogućava da utvrdite da li se data vrednost nalazi u
odre đenom skupu mogućih vrednosti. U ovom slučaju dobijamo jednake rezultate
select max(hours) from assignment;
kao one koje smo dobili u primeru upita za operator LEFT JOIN:
Rezultat ovog upita je jedna vrednost, koja predstavlja najveći broj radnih sati utro-
1-- ---- ---------+
šenih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo l name
pominjali: to je funkcija max () , koja pronalazi najveću vrednost u zadatoj koloni_ 1--- ------------+
tabele. Funkcijom max () bavićemo se više u poglavlju 8, "Upotreba MySQL-ov1h / Ajay Patel l
ugrađenih funkcija u komandi SELECT". U pod upitima koji vraćaju jednu vrednost l Candy Burnett l
(engl. single-value subqueries), često se ova vrsta funkcija koristi za dobijanje međurezul­
l Ben Smith l
1-- ------- ------+
tata koji se potom koristi za druge proračune. 3 rows in set (0.45 sec)
Kao u prethodnim odeljcima, ovaj upit ćemo upotrebiti unutar drugog upita.
Zanimljivo je da se pomoću operatora IN podaci upita mogu porediti i s listom
Rezultat upita koji vraćaju jednu vrednost jeste određena vrednost koja se potom
navedenih vrednosti, kao u narednom primeru:
obično poredi s nekom drugom vrednošću. Pogledajte sledeći upit:
nelec t name
select e.employeeiD, e.name
Irom employee
from employee e, assignment a
where employeeiD not in (6651, 1234);
where e.employeeiD = a.employeeiD
and a.hours = (select max(hours) from assignment);
102 Poglavlje 7 Sl oženiji upiti
Opcije komande SELECT

Rezervisana reč EXISTS deluje na malo drugačiji način od rezervisane reči IN. veći od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL,
U upitima u kojima je zada to EXISTS, pod upit zapravo koristi podatke iz spoljnog gde se utvrđuje da li je broj radnih sati zaposlenog veći od broja radnih sati svakog
(glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit. programera pojedinačno.
Pogledajte sledeći upit: Neće vas iznenaditi informacija da ovaj upit ne vraća nijedan red podataka, čime
select e.name, e.employeeiD dokazuje da niko u toj firmi ne radi više od programera.
from employee e
where not exists
(select * Opcije komande SELECT
from assignment Kada smo prvi put razmatrali komandu SELECT, opisali smo skraćeni oblik opšte
where employeeiD = e.employeeiD);
sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli šta još
U ovom primeru takođe tražimo zaposlene koji nisu nikad radili na poslovima za ne znamo.
spoljne klijente. U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima sledeći opšti oblik:
Pod upit učitava redove u kojima je ispunjen uslov da je vrednost u koloni SELECT [STRAIGHT_JOIN)
employee ID tabele assignment jednaka vrednosti u koloni employee. employee ID. [SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT)
Vrednost e. employee ID potiče iz glavnog upita. Evo šta MySQL zapravo radi: za [SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY)
svaki red iz tabele employee ispituje rezultate podupita; ako u tom skupu ne postoji [DISTINCT l DISTINCTROW l ALL) - - -
izraz_za_učitavanje, ...
nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom prosleđuje
u konačan skup rezultata upita. [INTO {OUTFILE l DUMPFILE} 'ime_datoteke' opcije_pri_izvozu]
[FROM reference_tabela
Mada će neki korisnici lakše razumeti ovu sintaksu, rezultate jednake onima iz [WHERE uslov]
prethodnog odeljka dobijamo i pomoću upita s levim spojem (LEFT JOIN). Ovaj upit [GROUP BY {celobrojna vrednost ime kolone l formula}
daje potpuno jednake rezultate: [ASC l DESC) , . .. J -
(HAVING uslov]
+---------------+-------------+ [ORDER BY {celobrojna vrednost ime kolone l formula}
l name l employeeiD l
[ASC l DESC) , ... J -
+---------------+-------------+ [LIMIT [pomak,] rows l rows OFFSET pomak]
l Ajay Patel l 6651 l
[PROCEDURE ime_procedure(lista_argumenata)]
l Candy Burnett l 9006 l
[FOR UPDATE l LOCK IN SHARE MODE))
l Ben Smith l 9842 l

+---------------+-------------+ Većinu odredaba već poznajete. Pogledajmo ukratko one koje dosad nismo
3 rows in set (0.00 sec) pominjali:
Rezervisane reči ALL, ANY i SOME omogućavaju poređenje sa skupom vrednosti koje • Odredba STRAIGHT JOIN na samom početku komande nalaže optimizatoru
vraća podupit. upita da spoji tabele baš redosledom koji ste zadali. Učinak ove opcije jednak je
Pretpostavimo da Nora Edwards, koje se možda sećate kao programera koji najviše kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao što je napomenuto u
radi, želi da dokaže da niko nema više radnih sati od programera . Da bi dokazala tu prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proširenja ANSI
činjenicu, smislila je sledeći upit: standarda za jezik SQL.
select e.name • Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT omoguća­
from employee e, assignment a
vaju optirnizovanje upita. Pomoću opcija SQL_SMALL RESULT i SQL BIG RESULT
where e.employeeiD = a.employeeiD
and a.hours > all obeveštavate MySQL da očekujete da će se skup rezul~ata upita sastoJati od malog,
(select a.hours odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalaže MySQL-u da
from assignment a, employee e skup rezultata smesti u privremenu tabel u. Tu opciju možete iskoristiti kada znate
where e.employeeiD = a.employeeiD da će slanje skupa rezultata klijentskom programu potrajati prilično dugo, a želite
and e.job='Programmer'); da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se učitaju.
Podu pit učitava listu radnih sati, pojedinačno po programeru i po poslu koji je Ove opcije su MySQL-ova proširenja ANSI standarda za jezik SQL.
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni čiji je broj r:~dnih sati
104 Poglavlje 7 Složeniji upiti rrranJa

• SQL CACHE i SQL NOCACHE nalažu MySQL-u da rezultate smešta, odnosno ne Pod upiti
smeŠta u ostavu (i~eš). Ooš jedno proširenje ANSI standarda za jezik SQL.) • Pod upit je upit ugnežđen unutar drugog upita.
• SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL izraČuna • Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koliko bi ~kup no-redova upit vratio kada ne bi sadržao odredbu LIMIT. Taj broj koristiti i za ispitivanje logičkih uslova pomoću operatora SOME, ALL ili ANY
redova se zatim može učitati pomoću opcije select found_rows () ; Uoš jedno • Pomoću operatora EXISTS može se utvrditi da li u rezultatima podupita postoji
proširenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne red koji je povezan s nekim redom glavnog upita.
ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala,
isti rezultat je mogao da se postigne tako što se najpre izvrši upit s funkcijom Opcije komande SELECT
COUNT (*),a zatim i drugi upit SELECT koji sadrži opciju LIMIT.
• Komandi SELECT mogu se pridružiti razne opcije koje optirnizuju izvršavanje te
• HIGH PRIORITY obaveštava MySQL da taj upit treba da ima prednost nad svim komande.
komandama UPDATE koje čekaju pristup tabelama navedenim u upitu .
• Pomoću komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u
• Već smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima spoljnu datoteku, slično načinu na koji smo u poglavlju 5 učitavali podatke iz
suprotan efekat (učitava sve duplikate) a to je i podrazumevana opcija. datoteke u tabelu pomoću komande LOAD DATA INFILE.
• SELECT INTO OUTFILE deluje suprotno od komande LOAD DATA INFILE koju • Komandi se mogu dodati procedure (napisane na jeziku C++) koje obrađuju
smo razmatrali u poglavlju 5, "Umetanje, brisanje i ažuriranje podataka". podatke pre prenošenja u MySQL ili iz MySQL-a.
Ova komanda smešta rezultate komande SELECT u zadatu datoteku. Odredba
opcije_pri_izvozu ima isto značenje kao u komandi LOAD DATA INFILE (više
detalja o tome naći ćete u poglavlju 5). Pitanja
• Odredba PROCEDURE omogućava da zadate proceduru koja se poziva pre nego što 1. De kart ov proizvod je
se skup rezultata pošalje klijentskom programu. Ta procedura mora biti napisana a) skup svih mogućih kombinacija redova iz dve ili više tabela
na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba više b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
informacija, potražite ih u MySQL-ovoj dokumentaciji.
e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
• Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaŠa mašina baze tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
podataka zaključava podatke na nivou stranice ili reda. U praksi, opcija je upo- NULL na mestima gde bi bili podaci iz druge tabele
trebljiva ako koristite mašine InnoDB i BDB.Ako zadate FOR UPDATE, zaključa­ d) nije ništa od prethodnog
vanje podataka će biti isključivo, a ako zada te LOCK IN SHARE MODE, zaključavanje
2. Levi spoj je
će biti deljeno.Vrste zaključavanja razmotrićemo u poglavlju lO",Upotreba trans-
akcija u InnoDB tabelama". a) skup svih mogućih kombinacija redova iz dve ili više tabela
b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
Sažetak tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
Spojevi d) nije ništa od prethodnog
• Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
3. Jednakovredni spoj je
odredbi FROM, zajedno s vrstom spoja. Treba takođe zadati i uslov koji opisuje na
koji način bi tabele trebalo da budu spojene. a) skup svih mogućih kombinacija redova iz dve ili više tabela
• Operator zarez i rezervisane reči JOIN, INNER JOIN i CROSS JOIN deluju na isti b) skup kombinacija redova iz dve ili više tabela koji su logički povezani
na č in, tj. kombinuju zadate tabele tako da omoguće traženje podataka u svim e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge
tim tabelama. tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
• Lev i desni spojevi omogućavaju pronalaženje redova u jednoj tabeli koji nemaju
odgovarajuće redove u drugoj tabeli. d) nije ništa od prethodnog
106 Poglavlje 7 Složeniji upiti u s1eaecem poglaVlJU

4. Korelirani podupit se tako zove zato što uspostavlja korelaciju između Vežbe
a) redova različitih tabela 1.
select name, skill
b) redova iste tabele
from employee, employeeSkills
e) dva spoja where employee.employeeiD = e mpl oye e Skills.employeeiD;
d) redova glavnog upita i redova podupita 2.
5. Razlika između upita označenih sa 5.1 i 5.2 u nastavku teksta j e sledeća select client.clientiD, name
from client left join assignment
a) nema razlike on client . clientiD = assignmen t. clientiD
b) učitavaju različite podatke where employeeiD is NULL;
e) učitavaju iste podatke ali je verovatno da će se levi spoj (upit 5.1) brže 3.
select clientiD, name
uči tavati
from client
d) učitavaju iste podatke ali je verovatno da će se podupit (upit 5.2) brže where not exists
uči tavati (select *
from assignment
Upit5 .1:
where assignment . clientiD client.clientiD);
select employee.name
from employee left join assignment
on employee.employeeiD = assignment.employeeiD
where clientiD is null;
U sledećem poglavlju
Upit 5.2: U poglavlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT",
select e.name, e.employeeiD razmatraćemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.
from employee e
where not exists
(select *
from assignment
where employeeiD e. employeeiD) ;

Vežbe
1. Napišite upit koji prikazuje imena zaposlenih i njihove stručne kvalifikacije.
2. Napišite upit koji pomoću operatora LEFT JOIN formira listu klijenata za koje
nijedan od zaposlenih nije obavio nijedan posao.
3. Upit iz vežbe broj 2 napišite tako da koristi operator EXISTS.

Odgovori
Pitanja
1. a
2. e
3. b
4. d
5. e
8
Upotreba MySQL- ovih ugrađenih
funkcija u komandi SELECT

MYSQL SADRŽI ŠIROK OPSEG UGRAĐENIH OPERATORA I FUNKCIJA koji mogu biti
korisni pri pisanju upita. Većina 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 poređenje i funkcije count () i
max (). U MySQL-u je na raspolaganju veliki broj ugrađenih funkcija. U ovom pogla-
vlju razmotrićemo najkorisnije među njima. Ovu knjigu nismo zamislili kao referentni
priručnik za MySQL-ove funkcije, već samo pokušavamo da predočimo sliku funkcio-
nalnosti koja je na raspolaganju.
Razmotrićemo sledeće teme:

• Operatori
• Funkcije za upravljanje tokom izvršavanja
• Funkcije za rad sa znakovnim vrednostima
• Numeričke funkcije
• Funkcije za rad s datumima i vremenima
• Funkcije za konverziju tipova podataka
• Druge funkcije
• Funkcije za upotrebu u odredbama GROUP BY.

Važno je zapamtiti da se u MySQL-u svaki izraz koji sadrži vrednost NULL svodi na
vrednost NULL, uz nekoliko izuzetaka koje ćemo istaći kada budemo naišli na njih. O
lome će biti više reči u odeljku o operatorima za poređenje vrednosti.
Poglavlje 8 Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT

Uporedite to sa sledećim upitom:


uovom poglavlju koristićemo komandu SELECT bez navođenja tabela u njoj.
Komanda SELECT može se upotrebiti kao jednostavan kalkulator. N a primer, ako select NULL IS NULL;
za date +--- - ----- - - - --+
se lect 2+2; l NULL IS NULL l
+--------------+
dobićete rezultat
l l
+-- ---+ +--------------+
l 2+2 l l row in set (0.00 sec)
+-- ---+
Ovaj primer ističe ono što smo napomenuli u poglavlju 6, a to je da morate opre-
4 l
+- ----+ zno korisiti operatore za poređenje ukoliko se među podacima može pojaviti i NULL.
1 row in set (0.42 sec) Druga činjenica koju bi trebalo da zapamtite jeste da se u većini slučajeva , pri pare-
Možete izvršavati izraze koji ne sadrže imena tabela i u kojima možete zadavati širok đenju vrednosti znakovnog tipa u MySQL-u ne pravi razlika između malih i velikih
opseg matematičkih i drugih operatora i funkcija. Izračun~:ranje 2+2 je ~aista trivijalno, slova. Ako želite da se znakovne vrednosti porede tako da se ipak pravi razlika između
ali to svakako ne važi za izvršavanje matematičkih operaciJa u komandi SELECT. Na malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,
primer, to vam omogućava da uradite finansijsku analizu vrednosti u tabelama i da select * from department where name='marketing';
zatim prikažete rezultate u obliku izveštaja. Ovaj upit će pronaći reč 'marketing' bez obzira na to kako je napisana, a rezultati
U svim MySQL izrazima možete zadavati zagrade da biste upravljali redosledom izgledaju ovako:
kojim se izračunavaju pojedini delovi izraza, na isti način kao u bilo kom drugom pro-
+- ------- --- ----+-----------+
gramskom jeziku. l departmentiD l name
Pogledajmo najpre operatore. +- -- - ---- - - -- ---+-----------+
130 l Marketing l
+---------------+-----------+
Operatori . . l row in set (0.41 sec)
u MSQL-u postoje tri glavne grupe operatora: aritmetički, za poređenJe vrednosti Ako je potrebno razlikovanje malih od velikih slova, dodajte rezervisanu reč
i logički . Operatore smo ukratko već opisali u poglavlju 6, "Korišćenje upita u binary, na sledeći način:
MySQL-u". Sada ćemo ih detaljnije razmotriti.
select * from department where name = binary 'marketing';
Ovako napisan upit ne učitava nijedan red iz baze podataka employee:
Aritmetički operatori v • • • •

MySQL podržava uobičajene aritmetičke operatore koje biste ocekivali: sabiranJe(+), Empty set (0.18 sec)
oduzimanje (-), množenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL. Posle ovog uvoda, možemo preći na operatore za poređenje. Najčešće se koriste
operatori navedeni u tabeli 8.1.
Operatori za poređenje vrednosti . .
N ajvažnije što bi trebalo da zapamtite ~vezivs~ ope;atorima za poređenJe vr:~nosu Tabela 8.1 Operatori za poređenje
j este sledeće : izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL, Operator Značenje
uvek daje NULL. To važi i za poređenje NULL s NULL:
Jednako
se lect NULL=NULL; != ili <> Različito od
< Manje od
+-- -- - -- - -- - +
l NULL=NULL l <= Jednako ili manje od
+-------- - - -+ > Veće od
NULL l >= Jednako ili veće od
·-----------+
1 row i n set (0 . 00 sec )
ll !'oglavlJe tl upotreoa My:>uL-ovm ugraaenm runKCIJa u KomanOI :>tLtLI runkCIJe za upravlJanje tokom izvršavanja komandi

poređenje
Tabela 8.1 Operatori za (nastavak) Funkcije za upravljanje tokom izvršavanja komandi
Operator Značenje Najpre ćemo razmotriti grupu funkcija za upravljanje tokom izvršava~a komandi.
n BETWEEN min AND max Poređenje da li se n nalazi u opsegu vrednosti od min do max. Među njima su najkorisnije IF i CASE, koje deluju slično iskazu if, odnosno switch
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se može zadati u obliku liste ili case iz većine programskih jezika.
vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah, Prototip funkcije IF izgleda ovako
breskva)
IF (el, e2, e3)
<=> Operator za jednakost koji se može upotrebiti i za NULL. Kada se
pored e dve vrednosti NULL, rezultat je l (true). Ako izraz el ima vrednost true, funkcija IF vraća rezultat e2; u suprotnom, rezultat
n IS NULL Ispituje da li n ima vrednost NULL funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee,
ISNULL(n) Ispituje da li n ima vrednost NULL. možemo zadati sledeći upit:
select name, if(job='Programmer', "nerd", "not a nerd")
Logički operatori from employee;
MySQL podržava sve uobičajene logičke operatore koji povezt~u delove izraza. Ovaj upit daje sledeće rezultate:
Logički izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
+---------------+--------------------------------------------+
MySQL tumači kao true (istinito, tačno) svaku vrednost različitu od nule i različitu od l name l if(job='Programmer', "nerd", "not a nerd") l
NULL. +---------------+--------------------------------------------+
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugačiji l Ajay Patel nerd
od onog što biste očekivali. Tabela 8.2 prikazuje logičke operatore. l Nora Edwards nerd
l Candy Burnett not a nerd
l Ben Smith not a nerd
Tabela 8.2 Logički operatori
+---------------+--------------------------------------------+
Operator Primer Značenje 4 rows in set (0.00 sec)
AND ili && n && m Logičko I. Tabela istine izgleda ovako: Funkcija CASE ima sledeće moguće prototipe (prema MySQL-ovoj dokumentaciji):
true&&true = true CASE vrednost
false&&bilo šta = false WHEN [vrednost-za-poređenje] THEN rezultat
Svi ostali izrazi svode se na NULL. [WHEN [vrednost-za-poređenje] THEN rezultat .. . ]
Logičko ILI. Tabela istine izgleda ovako:
[ELSE rezultat]
OR ili ll n ll m
END
true l lbilo šta= true
NULLI l false= NULL ili
NULL l l NULL = NULL CASE
false! l false = false WHEN [uslov] THEN rezultat
[WHEN [uslov] THEN rezultat ... ]
NOT ili NOT n Logičko NE. Tabela istine izgleda ovako:
[ELSE rezultat]
!true = false END
!false = true
Ovu funkciju možete upotrebiti da biste izdvojili jednu vrednost iz skupa od ~ih
!NULL = NULL
nekoliko. Primera radi, pogledajte sledeći upit:
XOR n XOR m Logičko isključivo ILI. Tabela istine izgleda ovako:
select workdate, case
true XOR true = false
when workdate e 2000-01-01 then "archived"
true XOR false = true when workdate e 2003-01-01 then "old"
false XOR true = true else "current"
NULL XOR n = NULL end
from assignment;
n XOR NULL = NULL
1'14 PoglavlJe 8 Upotreba My:>UL-ovlh ugrađenih tuni<CIJa u 1<omand1 :>tLtCI runKCIJe za raa sa znaKovnim vreanost1ma

Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele Funkcije za poređenje znakovnih vrednosti
assignment. Datumi iz prethodnog veka označavaju se sa "archived", datumi iz pret- Osim operatora jednakosti, u MySQL-u postoji i više drugih funkcija za poređenje
hodne godine označavaju se sa "old", dok se svi ostali datumi označavaju kao dve znakovne vrednosti:
"current". • LIKE: Poređenje s džokerskim znacima.
• RLIKE: Poređenje s regularnim izrazima.
Funkcije za rad sa znakovnim vrednostima • STRCMP: Poređenje znakovnih vrednosti, slično funkciji strcmp () u jeziku C.
MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funk- • MATCH: Tekstualno pretraživanje.
cije za obradu znakovnih vrednosti i funkcije za poređenje znakovnih vrednosti.
U ovom odeljku objasnićemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretraži-
Verovatno ćete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.
vanje je na raspolaganju samo u My ISAM tabelama. Više informacija o tome naći ćete
u poglavlju 9, "Tipovi tabela u MySQL-u".
Funkcije za obradu znakovnih vrednosti
Tabela 8.3 prikazuje najkorisnije funkcije za obradu znakovnih vrednosti. U doku- Poređenje s džokerskim znacima pomoću funkcije LIKE
mentaciji su opisane i mnoge druge. Pogledajmo primer upotrebe operatora LIKE:
select *
Tabela 8.3 Funkcije za obradu znakovnih vrednosti from department
Funkcija Namena where name like '%research%';
concat(s1, s2, ... ) Spaja znakovne vrednosti sl, s2, .... U ovom primeru ne tražimo nazive jednake reči 'research', već nazive koji bilo
conv(n, izvorna_baza, Pretvara broj n iz baze izvorna_baza u broj baze gde sadrže reč 'research'. Rezultati su sledeći:
nova_baza) nova_ baza. (Možda vas je iznenadilo to što je ova funkcija
navedena među funkcijama za rad sa znakovnim vrednostima,
+---------------+--------------------------+
ali se za notaciju nekih baza koriste slova, kao u heksadecimal-
l departmentiD l name
noj bazi.)
+---------------+----------------- ---------+
128 l Research and Development l
length (s) Vraća ukupan broj znakova sadržanih u s.
+---------------+------ --------------------+
load file Vraća sadržaj datoteke ime_ datoteke kao jedan niz l row in set (0.04 sec)
(ime_ datoteke) znakova.
Funkcija LIKE podržava dva načina poređenja s džokerskim znacima. Znak za pro-
locate (igla,plast_sena, Vraća početnu poziciju niza znakova igla u nizu
cenat (%), upotrebljen kao u navedenom primeru, utvrđuje poklapanje s grupom zna-
pozicija) plast_sena. Traženje počinje od pozicije pozicija.
kova bilo koje dužine (uključujući i nula). To znači da se izraz '%research%' poklapa
lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova.
sa svakom znakovnom vrednošću koja sadrži reč research. Imajte u vidu da se pri
quote (s) Preslikava niz znakova s u oblik pogodan za smeštanje u bazu
poređenju znakovnih vrednosti obično ne pravi razlika između malih i velikih slova,
podataka. To podrazumeva uokvirivanje znakovnog niza
polunavodnicima i umetanje obrnute kose crte. kao što je objašnjeno u prethodnom delu ovog poglavlja.
replace(izvor, nađi, Vraća niz znakova izvor u kojem je podniz nađi zamenjen Stariji džokerski znak je podvlaka U, kojim se utvrđuje poklapanje s jednim zna-
za mena) nizom zamena na svim mestima gde se pojavljuje. kom. Na primer, '_at' se poklapa sa znakovnim vrednostima •cat •, •mat •, •bat • itd.
soundex(s) Vraća soundex oblik izvornog niza znakova s. Soundex oblik
znakovne vrednosti predstavlja način na koji znakovna Poređenje s regularnim izrazima pomoću funkcije RUKE
vrednost treba da se izgovara na engleskom jeziku . Na primer, Funkcija RL IKE omogućava poređenje znakovnih vrednosti s regularnim izrazima.
ponekad je lakše pronaći ime osobe ako se traži sound ex oblik Regularan izraz je šablon koji opisuje opšti oblik znakovne vrednosti. Uslovi koje
a ne kako je ime napisano . bi trebalo da ispunjavaju znakovni nizovi koje tražimo, opisuju se posebnom notaci-
substring(s, početak, Vraća ukupno znakova iz niza s, počev od početak. jom. Razmotrićemo ukratko tu notaciju.
ukupno) Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To znači da se šablon
trim (s) Uklanja početne i završne beline iz niza znakova s. (Pomoću 'cat' poklapa s rečju 'cat'. Međutim, poklapanje važi i za • catacomb • i • the cat
funkcije l trim () možete ukloniti samo početne beline, a
sat on the mat'. Šablon 'cat' pronalazi niz znakova •cat • na svim mestinu
funkcija rt rim () uklanja završne beline.)
unutar većeg niza znakova.
116 Poglavlje 8 Upotreba MySQL-ovih ugrađenih tunkciJa u komano1 ::,tLtLI
Numeričke funkcije

Ako želite da šablon pronalazi samo reč 'cat', onda ga morate izmeniti u '"'cat$'. . Regularni izrazi mogu biti veoma moćni, ali i veoma složeni. Ako vam treba više
Znak karet ("') znači "fiksni početak niza znakova"; drugim rečima, niz znakova koji pnmera i opširniji opis sintakse, na Webu ćete naći mnogo dobrih tekstova na tu
tražimo mora da počinje rečju 'cat'. Znak za dolar($) znači "fiksni kraj niza zna- temu.
kova"; drugim rečima, niz znakova koji tražimo mora da se završava rečju 'cat'.
Prema tome, šablon '"'cat$' prihvata samo reč 'cat' i ništa drugo. Poređenje nizova znakova pomoću funkcije STRCMP()
U regularnim izrazima podržani su i džokerski znaci, isto kao u funkciji LIKE. ~a .funkciju s:RCMP (). ~ MySQL-u važe iste konvencije kao i u drugim programskim
Međutim, džokerski znak je drugačiji. Postoji samo jedan - tačka (.) - koji određuje JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvrđuje poklapanje s STRCMP(sl, s2)
'cat', 'bat', 'mat' itd. a funkcija vraća sledeće vrednosti:
Dovoljan je samo jedan džokerski znak jer se u traženom nizu znakova može zadati
i ponavljanje znakova (uključujući i džokerske znakove) određen broj puta.
• o ako su nizovi znakova jednaki
Kada iza nekog znaka postavite specijalni znak *, to znači da se prethodni znak • -l ako je sl maqji od s2 - ~· ako po redosledu sortiranja sl dolazi ispred s2
može pojaviti nula ili više puta. Na primer, šablon 'n*' prihvata ' ', 'n', 'nn', 'nnn' • l ako je sl veći od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2
itd. Znaci se mogu grupisati između zagrada, tako da šablon ' (cat)*' prihvata ' ', Rezultati narednih upita izgledaju ovako:
'cat', 'cat cat', 'catcatcat' itd. Moguća je i upoteba džokerskih znakova, pa
mysql> select strcmp ('cat •, •cat •) ;
šablon ' . * ' prihvata neograničen broj znakova, što praktično znači svaki niz znakova. +- ---------------------+
Slično tome, znak plus(+) znači da se znak ili niz znakova ispred njega može poja- l strcmp ('cat', 'cat') 1
viti jedanput ili više puta, a upitnik (?) znači jednom ili nijednom. Možete zadati i +- ---------------------+
opseg vrednosti, tako da šablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i l o l
+- ---------------------+
'catcatcatcat'.
l row in set (0.42 sec)
Osim pojedinačnih znakova i nizova znakova, možete zadavati i skupove znakova,
koji se pišu između uglastih zagrada. Na primer, šablon ' [a-z] ' prihvata bilo koje mysql> select strcmp('cat', 'dog');
pojedinačno slovo, dok šablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g · - -------------- -------+
broja znakova. l strcmp( 'cat', 'dog') 1

I najzad, postoji više klasa znakova, koje su zapravo unapred definisani skupovi +- ---------------------+
uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumerički znak.
l -1 l
1- ---------------------+
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL l row in set (0.00 sec)
podržava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih
regularnih izraza. mysql> select strcmp('cat', 'ant');
A sada, pogledajmo primer upotrebe šablona s funkcijom RLIKE. Razmotrite sle- · -- --------------------+
l strcmp( 'cat', 'ant') 1
deći upit:
l -- -------------------+
select * from department where name rlike 'an'; l l l

Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadrže niz zna-
l - --------------------+
row in set (0.00 sec)
kova 'an':
+---------------+---------- ----------------+ Imajte u vidu da ~edosled s~rtiranja zavisi od lokalnog skupa znakova koji je akti-
l departmentiD l name van . Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti će biti sortirane
+------------ ---+-------------- ------- -----+ kako biste i očekivali, pod uslovom da ste zadali odgovarajući skup znakova kada ste
42 Finance 11:tprav1h tabelu.
128 l Research and Development l
129 l Human Resources l
+---------------+------- ------- --------- ---+ Numeričke funkcije
3 rows in set (0.00 sec)
l'.1bela .8.4
..
prikazuje
" ,
nekoliko korisnih numeričkih funkciia.
~
U MySQL- OVOJ· d O k ll _
111\'lltnc~p nar1 rete opise mnogih drugih funkcijn iz ll' kategorije.
Funkcije za rad s datumima i vremenima
Poglavlje 8 Upotreba MySQL-ovih ugrađemh tunKCIJa u KomanOI ;:,tLtLI
118

Funkcije za rad s datumima i vremenima


Tabela 8.4 Numeričke funkcije
Tabela 8.5 prikazuje nekoliko najkorisnijih funkcija za rad s datumima i vremenima.
Funkcija Svrha Zahvaljujući MySQL-ovoj orijentisanosti na analizu podataka, skup funkcija za rad
Vraća apsolutnu vrednost n, a to je vrednost bez predznaka. s datumima i vremenima veoma je bogat. Naredni spisak daleko je od potpunog.
abs (n)
Vraća vrednost n zaokruženu naviše na najbliži ceo broJ.
ceiling (n)
Vraća vrednost n zaokruženu naniže na najbliži ceo broj. Tabela 8.5 Funkcije za rad s datumima i vremenima
floor (n)
Ove dve funkcije dele n sa m. Funkcija di v vraća celo brojni rezultat, Funkcija Namena
mod (n, m) i div
a funkcija mod () vraća celo brojni ostatak deljenJa.
adddate(datum , INTERVAL Ove funkcije služe za sabiranje i oduzimanje datuma. Vrednosti
Vraća n podignuto na stepen m. .. n tip) i subdate (datum, zadatoj parametrom datum dodaju, odnosno od nje oduzim~u
power (n, m)
Vraća slučajno generisan broj u opsegu o~ O do l. Parametar n mJe . INTERVAL n tip) period zadat pomoću rezervisane reči INTERVAL. Morate zadati
rand(n)
obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za g~nensanJe i količinu n i tip te količine.
pseudoslučajnih brojeva. ~Za istu vrednost n prosleđenu funkciJI rand Parametar tip može imati vrednost SECOND, MINUTE, HOUR,
generiše se ista pseudoslucaJna vrednost.) DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude
Vraća n zaokruženo na najbližu celobrojnu vrednost. Ako zadate izraženo u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR
round (n[, d])
i parametar d, n vrednost se zaokružuje na d dectmalruh mesta. ('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'),
Vraća kvadratni koren od n. DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s').
sqrt (n)
Ove funkcije su zaista korisne, ali pošto je gotovo nemoguće
Pogledajmo primer upotrebe funkClj3 mod() l d~ v.. v
.. · · u e zi sa ovim funkcijama zapamtiti sve formate za datume i vremena Qer se razlikuju),
moraćete da ih potražite u MySQL-ovoj dokumentaciji.
zbunjujuće je sledeće: dok se mod može napisati u obhku
curdate(), curtime(), Ove funkcije vraćaju tekući datum, tekuće vreme, odnosno
mod(9, 2) now() tekućidatum i vreme.
ili date_format(datum, Pomoću ovih funkcija možete izraziti datume i vremena u
format) i gotovo svakom fom1atu koji zamislite. To se radi tako što se
9 mod 2 time_format(vreme, zada format u obliku niza znakova, kao u sledećem primeru:
ili čak format) date_format(workdate, '%W %D of %M, %Y').
Navedeni format prikazuje datum u obliku, na primer,
9 %2
'Monday 16th of June, 2003 '. Pošto je spisak mogućih
funkcija di v može se napisati samo kao formata prilično dugačak, detaljnije informacije potražite u
dokumentaciji.
9 div 2
dayname (datum) Ova funkcija daje englesko ime dana u nedelji zadatog u
Primera radi parametru da t um (na primer, ' Monday ').
div(9, 2) extract(tip FROM datum) Ova funkcija izdvaja iz datuma datum komponentu čiji tip
neće raditi već će izazvati sintaksnu grešku. zadajete parametrom tip. Na primer, ako zadate YEAR, funkcija
·· d i div u MySQL-u daje sledeće rezultate: izdvaja godinu iz datuma. Tipovi komponente su isti kao u
U potre b a fiun k CIJa mo parametrima funkcija adddate () i subdate ().
mysql> select 9 mod 2; unix_timestamp( [datum]) Ova funkcija daje tekući datum i vreme u Unixovom formatu
+---------+ timestamp. (Vrednost je broj sekundi koji je protekao od 1.
l 9 mod 2 l januara 1970. godine.) Ako zadate i datum, rezultat je timestamp
+---------+ vrednost koja odgovara tom da t umu.
l l
+---------+ Pogledajmo primer upotrebe funkcije adddate (). Datumu 1. januar 1990. doda-
1 row in set (0.00 sec)
jemo godinu i šest meseci:
mysql> select 9 div 2; s elect adddate("l999-01-01", INTERVAL "1-6" YEAR_MONTH);
+---------+
l 9 div 2 l
+-- - -- ----+
4 l
·----
L-------~--~--l_o_w__l_n~n--__(o . oo ae:c~)--------------~------------------------------~---
Fukcije za upotrebu u odredbi GROUP BY
120 Poglavlje 8 Upotreba MySQL-ovih ugrađenih funkcija u komandi ~tltCI

Rezultat je sledeći: Druge funkcije


+--------------------------------------------------+ U MySQL-u postoje i funkcije koje se mogu svrstati u grupu "ostalo". Na primer,
l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l postoje funkcije za generisanje heš vrednosti i šifrovanje, ali i mnoge druge veoma
+------------------- ----------------------- --------+ korisne funkcije. U tabeli 8.6 navedene su najčešće korišćene funkcije.
l 2000-07-01 l
+------------------------------------------------- -+ Tabela 8.6 Ostale funkcije
1 row in set (0.41 sec)
Funkcija Namena
U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom
benchmark Izračunava vrednost izraza izraz zadati broj puta, Ova funkcija
programu, to možda neće biti najpogodniji oblik prosleđivanja datuma. Unixov for-
(broj, izraz) uvek vraća nulu - njena svrha je da meri vreme potrebno za
mat timestamp nije razumljiv čoveku, ali su vrednosti zadate u tom formatu potpuno izračunavanje izraza i prikaže dobijena vreme.
kompatibilne sa API funkcijama drugih programskih jezika. encrypt(s[,zrnce]) Šifruje vrednost s pomoću Unixove sistemske funkcije crypt.
Isti upit, ali s funkcijom unix_timestamp () Neobavezni parametar zrnce je niz od dva znaka. Ako funkcija
select unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" crypt nije na raspolaganju u vašem sistemu Qer imate, na primer,
Windows), funkcija vraća rezultat NULL.
YEAR_MONTH) ) ;
found_rows () Daje podatak o ukupnom broju redova koji bi uči tao poslednji upit
generiše rezultat neupotrebljiv za čoveka ali direktno upotrebljiv u drugom program-
kada ne bi sadržao odredbu limit. Deluje samo ako je u komandi
skom kodu, kao što je PHP-ova funkcija date (): SELECT zadata opcija SQL_CALC_FOUND_ROWS, kao što je opisano
+------------------------------------------------------------------+ u poglavlju 7.
l unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" YEAR_MONTH)) l last_insert_id () Vraća poslednju vrednost AUTO_INCREMENT koja je bila automat-
+------------------------------------------------------------------+ ski generisana. To je korisno kada u tabel u dodate nov red i potre-
962373600 l ban vam je njegov identifikator da biste ga upisali kao vrednost
+------------------- -- ---------------------------------------------+ spoljnog ključa u drugu tabelu.
1 row in set (0.01 sec) md5 (s) Vraća 128-bitni heš ulaznog niza znakova s u MDS formatu. Ako
pišete aplikaciju koja čuva imena korisnika i lozinke, to je prepo-
ručljiv oblik skladištenja lozinki u bazu podataka.
Funkcije za konverziju tipova podataka Algoritmi za šifrovanje podataka imaju ograničen vek upotreblji-
Postoje samo dve funkcije za konverziju tipova podataka, cast () i convert (), koje vosti. Budući da snaga računara neprekidno raste, neophodni su i
daju isti rezultat, ali se sintaksa malo razlikuje. Ove funkcije omogućavaju konverziju sve snažniji algoritmi za šifrovanje podataka. MDS se zasad smatra
tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer) prilično sigurnim.

u drugi (na primer, char). password(s) Izračunava šifrovan oblik za lozinku zadatu parametrom s. To nije

Prototipovi ovih funkcija su sledeći: oblik u kojem se interno čuvaju lozinke korisnika MySQL-a, što je
opisano u poglav~ u 11, "Upravljanje pravima korisnika". Upotreba
cast(izraz AS tip) funkcije password () za šifrovanje lozinki koje se čuvaju u bazi
convert(izraz, tip) podataka ne preporučuje se.
Funkcija cast () podržana je u ANSI standardu, a funkcija convert () podržana je
u ODBC standardu.
Parametar tip može imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
Fukcije za upotrebu u odredbi GROUP BY
Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad
(INTEGER) i UNSIGNED (INTEGER).
Većina konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba; naziVaJU grupne ili agregatne funkcije. Možete ih primeniti i na ceo skup rezultata
na primer, ako funkciji za rad s vrednostima znakovnog tipa prosledite broj, on će upita, pri Čemu se svi redovi obrađuju kao pripadnici jedne grupe. To smo već upo-
trebili u upitima kao što je sledeći:
automatski biti pretvoren u niz znakova.
select count(*)
from employee;
Ovaj upit daje ukupan broj redova u tabeli employee.
122 Poglavlje B Upotreba MySQL-ovih ugrađenih funkcija u komandi SELI::CI
Odgovo1

Ove funkcije se obično primenjuju na grupe podataka , kao u sledećem primeru: 3. Koju biste od sledećih funkcija upotrebili da dobijete ime meseca u datumu?
select job, count(job} a) dayname ()
from employee
b) extract()
group by job;
e) subdate ()
Ovaj upit prebrojava koliko ima zaposlenih na svakom radnom mestu.
d) now()
Tabela 8.7 prikazuje listu najkorisnijih grupnih funkcija .
4. Koju od sledećih funkcija poziva MySQL kada interno šifruje lozinke svojih
Tabela 8.7 Funkcije za rad s grupama podataka korisnika?
Funkcija Namena a) password()
avg (kolona) Vraća prosek vrednosti sadržanih u koloni kolona . b) encrypt ()
count(kolona) Vraća ukupan broj vrednosti u koloni kolona. e) rodS()
min (kolona) Vraća najmanju vrednost u koloni kolona. d) sha()
max (kolona) Vraća n;Uveću vrednost u koloni kolona.
5. Ako u komandi SELECT upotrebite grupnu funkciju a ne zadate odredbu GROUP
std (kolona) Vraća standardni otklon za vrednosti sadržane u koloni kol ona.
a) to je sintaksna greška
sum (kol ona) Vraća zbir vrednosti sadržanih u koloni kolona .
b) cela tabela se obrađuje kao jedna grupa
e) ceo skup rezultata se obrađuje kao jedna grupa
Sažetak d) svaki red se obrađuje kao jedna grupa
• MySQL pruža izbor aritmetičkih i logičkih operatora, kao i operatora za pere-
đenje vrednosti. Pri upotrebi operatora morate naročito obratiti pažnju na
mogućnost pojave vrednosti NULL jer u tom slučaju rezultati neće uvek biti
Vežbe
kakve očekujete. l. Napišite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
• MySQL pruža bogat izbor funkcija za rad s vrednostima znakovnog i numerič­ nog mesta 'Programmer', treba da se prikaže 'Analyst 1 Programmer'.
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije . 2. Napišite upit koji u kolonu department dodaje novu službu čiji je naziv Property
• Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama Services. Zatim napišite upit koji dodaje novog zaposlenog, čije je ime Fred Smith
tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funk- a radno mesto DBA i radi u toj službi. Upotrebite funkciju last_insert_id (} da
cije deluju na sve vrednosti u koloni tabele. biste dobili identifikator nove službe.
3. Napišite upit koji učitava najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .
Pitanja
l . Koji se od sledećih operatora ne mogu upotrebiti za ispitivanje da li je određena
vrednost jednaka NULL?
Odgovori
a) ISNULL ()
Pitanja
b) <=>
l. d
e) IS NULL
2. b
d) 3. b
2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste 4. a
a) -1
5. e
b) o
e) 1
d) 2
124 Poglavlje 8 Upotreba MySOL-ovih ugrađen ih funkcija u komane11 ~tLtLI

Vežbe

I~
l.
select name, replace(job, 'Programmer', 'Analyst/Programmer')
from employee;
2.
insert into department values
(NULL, 'Property Services');

insert into employee values


Tipovi tabela i transakcij
(NULL, 'Fred Smith', 'DBA', last_ins ert_id());
3.
select max(workdate) from assignment;
u MySOL-
U sledećem poglavlju
Ovo poglavlje završava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi
9 Tipovi tabela u MySQL-u
tabela i transakcije u MySQL-u", razmotrićemo pojedine mašine baze podataka koje
MySQL podržava i posebne mogućnosti koje one pružaju. 10 Upotreba transakcija u InnoDB tabelama
9
Tipovi ta bela u MySQL-u

u OVOM POGLAVLJU RAZMOTRIĆEMO TIPOVE TABELA koje su na raspolaganju


projektantu MySQL aplikacija. U dosadašnjim primerima koristili smo uglavnom
InnoDB ili My ISAM tabele, ali postoje i druge.
Projektovanje sistema za upravljanje bazama podataka, slično projektovanju sistema
za druge namene, podrazumeva mnogo kompromisa. Na primer, poželjno je da se
mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo,
treba više vremena i troši se više prostora na disku i veća količina memorije. Deo posla
pronalaženja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta
baze podataka, tako što su vam prepustili izbor tipa tabela koje ćete koristiti. Možete
se opredeliti zajedan od tipova koji podržavaju transakcije, ukoliko je to neophodno
u vašoj aplikaciji, ili možete izabrati tip tabela koji obezbeđuje bolje performanse, ali
ne podržava transakcije. U oba slučaja morate biti svesni kompromisa koje morate
da napravite.
Možda ćete čuti da se tipovi tabela nazivaju mašine za skladištenje (engl. storage
engine). To odražava činjenicu da je za upotrebu nekih tipova tabela neophodna zna-
čajna količina posebnog programskog koda koji upravlja smeštanjem podataka, indek-
siranjem, zaključavanjem podataka i pristupanjem disku. To takođe odražava suštinu
baze podataka: skladištenje podataka.
Izrazi transakcij"a ili podrška za transakcije pojavljivaće se često u ovom poglavlju. To
je važan uslov o kojem treba da vodite računa kada birate tip tabele. U primerima koje
smo dosad naveli u ovoj knjizi, SQL upiti su se izvršavali potpuno izolovana do drugih
korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne dešava.
Zamislite da imate bazu podataka o prometu na bankovnim računima. Ako želite
da prebacite 1.000 dinara s jednog računa na drugi, potrebna su vam najmanje dva
SQL upita- jedan, koji na prvom računu smanjuje stanje za 1.000 dinara i drugi, koji
povećava stanje na drugom računu za 1.000 dinara. Bilo bi prava katastrofa kada bi se
128 Poglavlje 9 Tipovi tabela u My:;,uL-u IVIYIJMIVI ldU~I .

zbog nečeg (na primer, prestanka napajanja) prvi upit izvršio do kraja, ali ne i drugi. MyiSAM tabele su uvele sledeća poboljšanja:
U takvim slučajevima bilo bi neuporedivo bolje da se izvrše ili oba upita, ili nijedan, • Prenosivost tabela. Tabele smešten e na disk ili na druge medije mogu se prene ti na
jer baza podataka mora uvek biti u usklađenom stanju. drugi računar na kojem radi MySQL, bez obzira na platformu. To ne važi za
Tabele koje podržavaju transakcije omogućavaju da za date da je određena grupa ISAM tabele.
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do • Podrška za veoma velike tabele. Veličina ISAM tabela je ograničena na 4 GB.
kraja, a ako to nije moguće, baza podataka mora da je po11išti (engl. roll back), odnosno MyiSAM omogućava da tabela bude velika onoliko koliko to dozvoljava ope-
da se vrati u stanje u kojem je bila pre početka transakcije. rativni sistem. Budući da će to biti važno samo nekim korisnicima, moraćete
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10, pažljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
"Upotreba transakcija u InnoDB tabelama". sistemi za rad s datotekama ograničavaju veličinu datoteka na najviše 2 GB.
U MySQL-u se mogu koristiti sledeći tipovi tabela: (Imajte u vidu da to ograničenje možete zaobići ako upotrebite MERGE tabele.)
• ISAM • Efikasnije iskorišćenje prostora na disku. Manji su rascepkanost i praznine na disku.
• MyiSAM • Manja ograni{enja klju{eva. ISAM tabele podržavaju najviše 16 ključeva po tabeli,
• InnoDB a podrazumevana maksimalna dužina ključa je 256 bajtova. My ISAM tabele
• BerkeleyDB (BDB) podržavaju 64 ključa po tabeli, a podrazumevana maksimalna dužina ključa je
• MERGE 1024 bajta.
• HEAP 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
Sve navedene tipove tabela objasnićemo pojedinačno, ali najviše prostora posveti-
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uložiti je
ćemo najčešće upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
veoma mali, a prednosti su značajne.
podržavaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne čine.
U ovom poglavlju objasnićemo i posebne mogućnosti koje pružaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraživanje. Celo poglavlje 1O posvećeno je MyiSAM tabele
posebnim mogućnostima mašine za skladištenje InnoDB. Mnogi ljudi godinama koriste MySQL ne znajući da može 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 omogućavaju veoma brz pristup podacima ali ne podržavaju
ISAM tabele transakcije. One obezbeđuju visoke performanse u mnogim situacijama, čak i kada
ISAM tabele su uključene u MySQL samo radi podrške starijim aplikacijama. Budući
projektant napravi određene greške, a u rukanu stručnog administratora mogu da
daje njihova funkcionalnost u potpunosti održana MyiSAM tabelama, nećemo ih
podrže i veoma obimne i/ili veoma opterećene baze podataka.
detaljno razmatrati. Planirano je da budu uklonjene iz buduće verzije MySQL-a 5.0.
Naredni kod formira MyiSAM tabelu:
Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:
create table article (
create table asset
articleiD int not null auto_increment primary key,
title varchar(255},
assetiD int not null,
body text
description varchar(255}
};
type=ISAM;
Nije obavezno, ali na kraj možete dodati sledeći red
ISAM tabele omogućavaju brz pristup podacima ali ne podržavaju transakcije. Veći
deo onoga što ćemo reći o My ISAM tabelama važi i za ISAM tabele, pri čemu za sta- type=MyiSAM;
rije ISAM tabele postoji više ograničenja. i dobićete
isti rezultat.
MyiSAM tabele mogu biti jedne od sledeće tri vrste: dinamičke, statičke ili kompri
movane.Tabela automatski postaje dinamička ili statička u zavisnosti od definicija njenih
kolona. Komprimovane tabele možete praviti samo ručno, pomoću alatke myisampack.
IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U IVIYI.li'IIVI liiUCIC

Tabele čiji su redovi fiksne dužine automatski se prave kao statičke, dok se tabele s KomprimovanjeMyiSAM tabela
redovima promenljive dužine prave kao dinamičke tabele. Po čemu možemo utvrditi Iako tabele nastaju kao statičke ili dinamičke bez vašeg izričitog zahteva (ali kao rezultat
da li tabela ima redove fiksne ili promenljive veličine? odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
Tip podataka char i svi numerički tipovi su fiksne veličinc . Veli č ina kolona tipa komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
varchar, text i b lob menja se u zavisnosti od sadržaja. Tabela čije su sve kolone tipa pack_isam, njena verzija isključivo za ISAM tabele, ukoliko ih koristite.)
char ili numeričkog tipa, biće statička, ali tabela koja sadrži barem jednu kolonu tipa Mada se komprimovanje na prvi pogled čini korisno, trebalo bi da ga primenjujetc
varchar, text ili blob biće dinamička. samo za neke aplikacije jer se komprimovane tabele mogu samo čitati. Ako treba da
U odeljku "Tekstualno pretraživanje My ISAM tabela", napravićemo tabel u koju izmenite strukturu komprimovane tabele, ili da ažurirate podatke u njoj, ili da joj
ćemo nazvati article. To će biti dinamička tabela zato što sadrži kolonu tipa varchar dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajuće izmenc
i kolonu tipa text. Prostor na disku koji će biti potreban za skladištenje svakog reda i zatim ponovo komprimujete tabelu.
tabele zavisiće od tekućih podataka u poljima tabele. Postupak komprimovanja koji obavlja alatka myisampack čini kombinacija pravog
Statička tabela pruža više prednosti. Pretražuje se brže od dinamičke ili komprimo- komprimovanja (Hafinanovim kodom) i više optimizacija čiji je cilj sažimanje kolona,
vane tabele. Baza podataka može veoma lako učitati zapis pronađen na osnovu indeksa na primer, konverzijom postojećih tipova podataka u manje, i konverzijom sadržaja
kada se svaki zapis nalazi na određenom pomaku od početka datoteke. Tabela se veoma kolona u nabrajanja . Budući da se svaki zapis komprimuje zasebno, dekomprimovanje
lako smešta u ostavu (keš). Manja je verovatno ća nepovratnog oštećenja podataka u pojedinačnog zapisa je relativno jednostavno. Na sporijim uređajima za skladišteqje
slučaju ozbiljnog kvara sistema- alatka za popravku tabela obično uspeva da restaurira podataka trajanje operacije dekomprimovanja može čak biti i zanemarljivo u pare-
sve redove osim oštećenog. đenju s trajanjem učitavanja podataka s diska.
Nedostatak statičkih 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 uko- Tekstualno pretraživanje MyiSAM tabela
liko se veličina vaših podataka ne razlikuje previše. Na primer, to važi za imena i pre- Jedna od mogućnosti koju zasad pružaju samo My ISAM tabele jeste tekstualno pretra-
zimena ljudi. Međutim, cena će vam možda biti previsoka ako se podaci veoma živanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba pronaći
mnogo razlikuju po veličini. Ako smatrate da će prezimena zaposlenih imati uvek vrednost jednaku traženoj, ali često se traže reči ili nizovi znakova unutar blokova tek-
maqje od 80 znakova, možda nećete želeti da nepotrebno rasipate po 75 znakova svaki sta. U takvim slučajevima tekstualno pretraživanje je korisnije.
put kada se neko preziva Perić ili Jović. Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno
Za dinamičke tabele potrebno je složenije upravljanje unutar samog MySQL-a. pretraživanje:
Posao keširanja, učitavanja ili popravljaqja zapisa nije tako jednostavan za mašinu za create table article (
skladištenje. Razlog je delimično to što je veličina tabele promenljiva, ali i to što tabela articleiD int not null auto increment primary key,
postaje rascepkana (fragmentirana).Ako je zbog promene sadržaja red postao veći, deo title varchar(255),
podataka će ostati na izvornom mestu, a deo će biti smešten u novi blok unutar dato- body text,
fulltext (title,body)
teke.To znači da se ne može garantovati da segment datoteke koji je operativni sistem ) ;
u čitao u keš sadrži sve delove reda. Osim toga, oštećenje tabele može biti teže popra-
vljivo jer ako se izgube blokovi podataka ili veze između njih, ne može se lako utvrditi Naredni upit učitava sve zapise koji sadrže re č 'merger • :
koji delovi kojim redovima pripadaju. select title
from article
Da biste popravili ili defragmentirali My ISAM tabelu, možete s komandne linije
where match (title,body) against ('merger');
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opšir-
nije objašnjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje Moguća su i složenija pretraživanja. Naredni upit učitava zapise koji sadrže bilo
baze podataka, ali bez popravljanja, možete upotrebiti MySQL-ovu komandu OPTI- koju re č iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.
MIZE TABLE. (To je opširnije opisano u poglavlju 18",0ptimizovanje baze podataka".) select title from article
where match (title,body) against ('merge acquisition acquire
takeover');
l ..lL 1 u~tdVIJI;;: ~ ,,._,uv1 LdUCid u tvty..JuL.-u
MyiSAM tabele

Obratite pažnju na to da učitavamo zapise koji sadrže barem jednu od navedenih


U engleskom jeziku, reči kao što su 'the', 'and', 'then' i 'soon' neophodne su, ali
reči. U ovom slučaju ne tražimo nizove znakova niti zapise koji sadrže sve navedene
najčešće nisu korisni pojmovi za traženje. U MySQL-u postoje standardne liste takvih
reči. Pomoću modifikatora IN BOOLEAN MODE, koji ćemo objasniti u nastavku teksta,
reči (za engleski j ezik) , a možete i sami sastaviti takve liste za tekstove na drugim
mogu se zadati obe vrste pretrage istovremeno. . , govornim jezicima koje indeksirate.
Reči •acquire' i • acquis i tions' morali smo da navedemo odvojeno zato sto
Budući da je tekstu~no pretraživanje veoma složen posao, važno je imati na umu
MySQL zasad još ne podržava pretraživanje od korena (engl. stemming). Tehni~a pre-
činjenicu da postoje ozbiljna ograniČe!* u pogledu performansi. Kada MySQL-ove
traživanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe.
tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse tekstu~nog
Ona omogućava da sistem prepoznaje da određeni skup reči ima zajednički koren.
pretraživanja osetno se pogoršavaju. U manjim aplikacijama to ne bi treb~o da pred-
Na primer, 'acquire' je koren drugih reči kao što su 'acquire s', 'acquired' 1
stavlja problem, ~i imajte tu činjenicu na umu kada pravite složenije aplikacije.
'acquisition'.
Reči koje su Česte među podacima ne koriste se pri pretraživanju.Ako vaša tabela
Za svako otkriveno poklapanje izračunava se koeficijent povezanosti s traženim
sadrži tekstove objavljene u biltenu vaše kompanije Acme PTY Ltd., verovatno će
pojmom (engl. relevance value), a rezultati se automatski sortiraju po opadajuć.oj vred-.
nmogi tekstovi u zaglavlju sadržati reč 'Acme'. Pretraga po toj reči će verovatno gene-
nosti tog koeficijenta. Ako želite, možete pogledati i koeficijente povezan os tr za svaki
risati mnogobrojne rezultate, koji ipak neće biti upotrebljivi. Ako 50% ili više zapisa
učitani zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki
sadrži određenu reč, smatra se da ta reč nema vrednosti za izračunavanje koeficijenta
zapis koji ima koeficijent nula nije ni po Čemu povezan s traženim pojmom i zato se ne povezanosti.
učitava.

select title, match (title,body) Logičko tekstualno pretraživanje


against ('merge acquisition acquire takeover') Pri pretraživanju možete imati veći stepen kontrole ako upotrebite modifikator IN
as relevance BOOLEAN MODE.
from article;
Naredni upit će uči tati samo zapise koji sadrže reč 'linux' i izraz "Open source",
Obratite pažnju na to da relevance nije rezervisana reč, već samo alijas za . ali ne i reč 'desktop'. Reči 'Java' i 'Oracle' nisu obavezne, ali kada se određuje
match(title,body) against ('merge acquisition acquire takeover').Zad~r koeficijent povezanosti, reč 'Java' povećava rang zapisa, a reč 'oracle' smanjuje
smo je samo zato da bi rezultati bili lakše čitljivi. rang zapisa. Redosled traženih reči u nizu znakova ili u zapisu nije bitan.
Korisniji je sledeći upit, koji prikazuje naslove i koeficijente povezanosti učitanih nele ct title
dokumenata. Budući da imamo uslov MATCH u odredbi WHERE, rezultati će biti sorti- from article
rani, a redovi koji se ne odnose na traženi pojam biće zanemareni. where match (title,body)
select title, match (title,body) against ('+linux +"Open Source" -desktop Java -Oracle'
IN BOOLEAN MODE) ;
against ('merge acquisition acquire takeover')
as relevance Tabela 9.1 prikazuje listu svih operatora.
from article
where match (title,body) against ('merge acquisition acquire lobela 9.1 Operatori za logičko pretraživaqje
takeover'); ()pcrator Značenje
Postoje određene reči
koje se ne mogu tražiti. Da bi se poboljšale performanse, Ova reč je obavezna.
određene reči su isključene iz indeksa ili se zanemaruju pri pretraživanju.
Ova reč ne treba da se pojavi u rezultatima.
Kratke reči se ne indeksiraju. Standardno se zanemaruju i sve reči koje sadrže manje
Ova reč je manje važna.
od četiri slova. Na nekim instalacijama, kao što je Slashdot.org, to je ozbiljan problem,
Ova reč je važnija.
pošto su troslovni akronimi često važan deo sadržaja tehničkih tekstova.To ograniče-nje )
( Grupiše reči u podizraz.
možete zaobići ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU
vrednost, ali onda morate ponovo generisati sve indekse. Ova reč se može pojaviti u rezultatima ali smanjuje rang zapisa.
U indeksima za tekstualno pretraživanje možete zadati nebitne reči (engl. stop words). Džokerski sufiks. Na primer, merge neće pronaći i merger, ali merge* će
pronaći i merge i merger. Može se upotrebiti samo na kraju reči za prctragu.
Nebitna reč je bez semantičke vrednosti. To su uglavnom reči koje su važne za sasta- ll ll
vo je izraz. Pronalazi samo identičan sadržaj, u istom redosledu .
vljanje rečenice, ali za koje je malo verovatno da će biti važne za sadržaj teksta.
--------------------
BerkeleyDB (B DB) tabele
134 Poglavlje 9 Tipovi ta bela u MySQL-u

Iako je razvijen odvojeno od većeg dela MySQL-a, InnoDB se može koristiti pod
Za logičko pretraživanje nije neophodno da postoje indeksi za tekstualno pretraži-
jednakim uslovima dve vrste licence.
vanje. Tako se mogu pretraživati i neindeksirane tabele, ali je postupak veo~a spo~.
Mnoge opsežne i veoma posećene Web lokacije koje koriste MySQL, kao što su
Još jedna mala razlika između tekstualnog pretraživanja i logičkog p~etr_až_lvanJa jeste
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
to što se pri logičkom pretraživanju zanemaruju reči koje se često poJaVlJUJU _me~u
finance. yahoo. com), koriste mašinu InnoDB. Naročito je pogodna za obradu velikih
podacima. U tom slučaju ne važi pravilo 50%. Ako pretražujemo tekstove obJaVlJene
količina podataka, velikom brzinom i u okruženju koje podržava transakcije.
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno učitao gotovo sve
InnoDB je jedan od najbržih sistema na svetu koji podržava transakcije, ali po cenu
redove, dok bi rezultat upita iza njega bio prazan skup.
izvesnih žrtava. Pri većini upotreba, My ISAM će biti brži, ali razlika najčešće neće biti
select title from article tako značajna.
where match (title,body) against ('Acme' IN BOOLEAN MODE);
InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najno-
select title from article vije informacije o InnoDB-u naći ćete na www. innodb. com.
where match (title,body) against ('Acme');
BerkeleyDB (BDB) tabel e
lnnoDB tabele Druga mogućnost koju imate kada za MySQL birate mašinu za skladištenje koja podr-
Sada ćemo razmotriti InnoDB tabele. InnoDB je mašina za skladištenje koja je brza i žava transakcije jeste BerkeleyDB (obično se skraćuje na BDB). BDB se može nabaviti
podržava transakcije. Njene mogućnosti transakcione obrade su toliko važne da ćemo od kompanije Sleepycat software (www. sleepycat. com) . Ova mašina se koristi za trans-
njihovoj primeni posvetiti celo naredno poglavlje. akcionu obradu u MySQL-u ređe nego InnoDB. Mada je BDB mašina već duže vreme
InnoDB table omogućavaju na tržištu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj
• Transakcionu obradu.Videti poglavlje 10. dokumentaciji stoji da je kvalitet usklađenosti s MySQL-om nivoa "gama". To znači da
j e pouzdanost bolja od verzije beta, ali postoje određeni problemi. Ne zaboravite, u
• Zakiju{avanje podataka na nivou reda. To znači da samo red koji se trenutno obra-
MySQL-ovoj kvalifikaciji beta verzije, pouzdanost je bolja nego u verzijama softvera
đuje u nekom upitu nije na raspolaganju drugim korisnicima.Većma drug1h .
mašina za skladištenje (osim BDB-a) primenjuje zaključavanje podataka na mvou koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".
BDB primenjuje zaključavanje podataka na nivou stranice, usled čega su perfor-
cele tabele, tj. kada jedan proces ažurira jedan red tabele, cela tabela nije dostupna
manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite veći
drugim procesima.
broj tabela.
• Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste
Sve BDB tabele moraju imati primarni ključ (što i nije neki problem, pošto se to
spoljni ključevi neće raditi s tabelama drugog tipa.
ionako preporučt~e) . U stvari, primarni ključ će automatski biti napravljen ako ga
• Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je sami izričito ne zadate.
pozajrnljena iz Oraclea.) BDB tabele se čuvaju u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite
InnoDB ima vlastite konfiguracione opcije, vlastiti direktorijum i vlastiti način skla- to s drugim tipovima tabela za koje se indeksi čuvaju u obliku b-stabala. Posledica je
dištenja podataka. Dok My ISAM smešta svaku tabelu u zasebnu datoteku, InnoDB sporije sekvencijalno učitavanje redova tabele (što se primenjuje, npr. kada bezuslovno
smešta sve tabele i indekse u tabelarni prostor, što znači da se delovi jedne tabele mogu u čitavate sve redove tabele ili izvršavate upite u kojima su indeksi neupotrebljivi).
nalaziti u više datoteka. Zahvaljujući tome, InnoDB može raditi s veoma obimnim Osim toga, BDB tabele zauzimaju više mesta na disku.
tabelama za čiju veličinu ne važe ograničenja koja nameće operativni sistem. Međutim, Važno ograničenje BDB tabela jeste to da ne možete po meri ti postojeće podatke
imajte u vidu da u poređenju s MyiSAM tabelama,jedna InnoDB tabela zauz1ma na drugo mesto na disku. Razlog je to što se zajedno s podacima tabele skladišti i apso-
znatno više prostora na disku za skladištenje istih zapisa. .. . , . lutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate oba-
Celo naredno poglavlje, 10, posvećeno je upotrebi ovih speclJalmh mogucnost1 vezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih nećete moći da
JnnoDB-a. pokrenete bazu podataka.
Podešavanje InnoDB-a zahteva određeni napor. Osnovnu ~onfiguracij~ opisali :~10
u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr-
nijl! u poglavlju 12",Podešavanje MySQL-a" .
IVICn\JC taUt'll"
Poglavlje 9 Tipovi tabela u MySQL-u l '

osobine: ima istu strukturu kao tri tabele koje ćemo grupisati, njen tip je MERGE,
MERGE tabele a sadržaj je unija (UNION) tekućeg sadržaja sve tri tabele. Osim toga, zadali smo last
MERGE tabele predstavljaju vešt način zaobilaženja ograničenja maksimalne veličine (poslednja) kao vrednost opcije INSERT_METHOD. To znači da će nov red koji unesemo
datoteka koja nameće operativni sistem. Pošto se svaka MyiSAM tabela smešta u u ovu MERGE tabel u biti fizički smešten u poslednju tabelu u grupi, u ovom slučaju,
zasebnu datoteku, veličina tabele je ograničena na maksimalnu veličinu datoteke koju log2003Mar. Ostale mogućnosti su FIRST (podaci se umeću u prvu tabelu u grupi) ili
operativni sistem dozvoljava. To se može zaobići pomoću MERGE tabele,j:r one NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
omogućavaju da se u upitima više My ISAM tabela obrađuju kao Jedna log1cka tabela. Tako smo formirali tabelu s kojom možemo da radimo na uobičajeni način i koja
Pogledajmo primer. Listing 9 .l sadrži kod koji formira MERGE tabel u od tn prividno sadrži sve podatke iz svih tabela u grupi. Ako izvršimo upit
tabele dnevnika promena. select * from logs;
Listing 9.1 A MERGE Table Example dobićemo sledeće rezultate:

create database logs; +-------+--------------- ------+-------- ---------+


use logs; l logid l logts l entry
+-------+---------------------+----- ------------+
create table log2003Jan l l 2003-01-01 00:00:00 l first jan entry l

(logid int auto_increment primary key, l l 2003-02-01 00:00:00 l first feb entry l

logts datetime, l l 2003-03-01 00:00:00 l first mar entry l

entry char(255)); +-------+---------------------+-----------------+


insert into log2003Jan values 3 rows in set (0.01 sec)
(NULL, '2003-01-01', 'first jan entry'); Kao što vidite, prikazani su podaci iz sve tri tabele. Zaista je važno da zapamtite da,
iako smo zadali da je kolona log id primarni ključ MERGE tabele, mehanizam radi
create table log2003Feb
(logid int auto increment primary key, malo drugačije od načina na koji obično rade primarni ključevi. Njihove vrednosti
logts datetime, obično moraju biti jedinstvene, ali pošto MERGE tabela upravlja istovremeno s tri
entry char(255)); skupa primarnih ključeva, nipošto nije isključeno da postoji više od jednog reda koji
insert into log2003Feb values sadrže istu vrednost primarnog ključa, kao što je prikazano u rezultatima navedenog
(NULL, • 2003-02 -01', 'first feb entry'); upita.
Čak i kad su tabele koje čine njene komponente grupisane u MERGE tabel u, nad
create table log2003Mar
(logid int auto increment primary key, njima i dalje možemo izvršavati upite na uobičajeni način. Međutim, komande DROP,
logts datetime, ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se viŠe
entry char(255)); izvršiti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE)
insert into log2003Mar values ipak možete izvršiti ukoliko MERGE tabela trenutno nije otvorena. Možete je zatvoriti
(NULL, '2003-03-01', 'first mar entry');
pomoću komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon

create table logs komande FLUSH možete izvršiti i bilo koju od navedenih komandi, ali mi smo ustanovili
(logid int auto increment primary key, da to nije uvek sasvim tačno. Na primer, u vreme pisanja ove knjige, ako se pomoću
logLs datetime, komande DROP izbriše jedna od tabela u grupi, automatski se briše i sama MERGE
• ntry char(255)) tabela. Ako je potrebno da neku od navedenih komandi izvršite nad jednom od tabela
ype • merge u grupi, najbolje je da prethodno izbrišete MERGE tabel u i da je zatim ponovo napra-
Ullion • (log2003Jan, log2003Feb, log2003Mar)
insert_method = last; vite. Brisanje MERGE tabele ni na koji način ne utiče na njene komponente niti na
podatke u njima.
U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan, Tabele koje čine MERGE tabelu možete komprimovati pomoću alatke myisam-
lo~2003Fcb i log2003Mar. MERGE tabele se često primenjuju za beleženje promena, pack. To je naročito korisno u slučajevima kao što je naš primer u kojem skladištima
k.10 što ćete videti u nastavku teksta. datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati
N nkon umetanja nekih pro bnih podataka u te tri tabele, od njih smo naravi li jednu budući da se novi podaci upisuju samo u poslednju datoteku.
M ERG E tabclu.To smo uradili tako što smo napravili tabelu logs, koj;l 1111.1 ''''lk·ćc
.Jdl.l:ldl\

138 Poglavlje 9 Tipovi tabela u MySOL-u

MyiSAM
HEAP tabele • My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podržava transakcije.
HEAP tabele su izuzetno brze i cele se čuvaju u memoriji. Brzina se postiže zahvalju- • MyiSAM podržava komprimovanje tabela.
jući upotrebi heširanih indeksa. • ":eličina ~yiSAM tabela je ograničena
na maksimum koji dozvoljava operativni
Nedostatak čuvanja cele tabele u memoriji jeste, naravno, to da u slučaju problema
s1stem, al1 se to ograničenje može zaobići pomoću MERGE tabela.
s napajanjem računara, podaci iz HEAP tabele nestaju zauvek. Međutim, tabele tog
• Datoteke u koje su smeštene My ISAM tabele prenosive su između različitih ope-
tipa su savršene za čuvanje privremenih podataka.
rativnih sistema.
Tabelu tipa HEAP možete napraviti na sledeći način:
• Jedna tabela može imati najviše 64 ključa a svaki može sadržati najviše 1024 bajta.
create table testHeap
(id int not null primary key,
data char(lOO)) lnnoDB
type=heap • InnoDB tabele podržavaju transakcije.
max_rows = 100; • InnoDB podržavaju zaključavanje na nivou redova.
Kao što vidite, tip tabele zadali smo kao HEAP. Osim toga, primenili smo i dobro
• Ne postoji teorijska gornja granica veličine tabele jer jedna tabela može biti
praktično pravilo ograničavanja maksimalnog broja redova u tabeli. Ako vaša HEAP smeštena u više datoteka.
tabela previše naraste, lako se može dogoditi da vam ponestane memorije. Maksimalan
• InnoDB omogućava dosledno učitavanje redova bez zaključavanja u komandama
broj redova u HEAP tabeli može se zadati u konfiguracionoj opciji
SELECT.
max_heap_table_size.
HEAP tabele imaju sledeća ograničenja: • InnoDB tabele su prenosive između različitih operativnih sistema.
• InnoDB tabele zauzimaju više prostora na disku od MyiSAM tabela.
• Nisu podržane kolone tipa AUTO_ INCREMENT.
• InnoDB tabele podržavaju spoljne ključeve .
• Nisu podržani tipovi podataka BLOB i TEXT.
• U HEAP tabelama ne mogu se tražiti redovi na osnovu početnog dela indeksa.
BDB
(Ako ne znate šta tačno ovo znači, više informacija o indeksiranju naći ćete u
• Kao i InnoDB tabele, BDB tabele podržavaju transakcije. BDB tabele ređe se
poglavlju 19.) koriste u MySQL-u od InnoDB tabela .
• Indeksi se mogu koristiti pri pretraživanju redova tabele samo u upitima koji u
• BDB podržava zaključavanje podataka na nivou stranice.
uslovima za pretragu sadrže operatore = ili <=>.
• BDB tabele nisu prenosive.

Sažetak MERGE
• MySQL podržava šest tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE • MERGE tabele omogućavaju da se više My ISAM tabela tretira kao jedna
i HEAP. logička tabela, zahvaljujući čemu se zaobilazi problem najveće dozvoljene
• Samo tabele tipa InnoDB i BDB podržavaju transakcije. veličine MyiSAM tabela .

• Samo MyiSAM tabele podržavaju tekstualno pretraživanje i indeksiranje.


HEAP
• HE~ t~bele se u celini čuvaju u memoriji i njihova se veličina mora ograničiti
ISAM
• ISAM je zastareli tip tabela, zamenjen tipom My ISAM. da b1 se Izbegla prevelika potrošnja memorije .
• ISAM tabele imaju ograničenu veličinu od najviše 4 GB. • ~o~aci ~mešteni u HEAP tabelu nisu trajni i gube se u slučaju prestanka napa-
JanJa racunara .
• ISAM tabele nisu prenosive između dva sistema.
• HEAP tabele su superbrze, pod uslovom da imate dovoljno fizičke memorije u
• Jedna tabela može imati najviše 16 ključeva, a svaki može sadržati 256 bajtova
koju ćete ih smestiti.
(znakova).
• I lEA l' tabele ne podržavaju kolone tipa AUTO_INCREMENT, TEXT i BLOB.
140 Poglavlje 9 Tipovi tabela u MySUL-u u ~1euecem poglaVlJU

Pitanja Vežbe
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi opera- Za ovo poglavlje nema formalnih vežbi, ali bi bilo korisno da vežbate pravljer~je
tivni sistem. Za tu namenu pogodne su tabele tipa 1upotrebu tabela pojedinih tipova.
a) ISAM
b) MyiSAM
e) InnoDB Odgovori
d) BDB
2. Potrebna nam je privremena tabela za brzo pretraživanje. Trebalo bi da upotre-
Pitanja
bimo tabelu tipa 1. e

a) ISAM 2. d
3. a
b) MyiSAM
e) MERGE 4. a

d) HEAP 5. b
3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa
a) ISAM U sledećem poglavlju
b) MERGE U sled ećem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraćemo šta
e) InnoDB ta čno znači pojam transakcija, zbog čega su transakcije tako važne i kako se one pri-
menJUJU u InnoDB tabelama.
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraživanje. Za tu namenu pogodne su tabele tipa
a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte sledeći upit za tekstualno pretraživa~e:
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
Koja od sledećih tvrdnji o ovom upitu nije tačna?

a) Težina tražene reči 'tutorial' je povećana.


b) Rang rezultata koji sadrže reč 'reference' biće povećan.
e) Rezultati pretrage moraju sadržati re č 'ph p' .
d) Rezultati pretrage koji sadrže re č 'pdfl ib' biće rangirani više od onih
koji je ne sadrže.
10
Upotreba transakcija
u lnnoDB tabelama

u OVOM POGLAVLJU BAVIĆEMOSE transakcijama u MySQL-u. U


merima koristićemo tip tabela InnoDB, ali gotovo sve što bude rečeno
praktičnim pri-
važiće podjed-
nako i za BerkeleyDB tabele.
Razmotrićemo sledeće teme:

• Šta je transakcija
• Upotreba transakcija u MySQL-u
• InnoDB-ov model transakcije i usklađenost 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
obrađivati kao nedeljiva celina. Drugim rečima, sve što treba da bude urađeno u trans-
akciji mora se uraditi u celini, ili ne sme ništa uraditi. Ovaj koncept je poznat kao
nedeljivost (engl. atomicity). Kaže se da je transakcija atom obrade jer se ne može razbiti
na manje delove - obrađuje se u celini ili se uopšte ne obrađuje.
Ovaj koncept ima važne posledice kada se razmatra pristup podacima u okruženju s
više korisnika, procesa i niti izvršavanja (engl. threads) istovremeno, a važan je i za obna-
vljanje podataka nakon kvara. Savremenim računarima često pristupa više korisnika
istovremeno. Na njihovim računarima obično je aktivno više programa u isto vreme,
a često koriste i programe kao što je softver za Web server koji formiraju više istovreme-
nih procesa ili niti izvršavanja. Svakom od tih korisnika, programa, procesa ili niti
izvršavanja može biti neophodan pristup serveru baze podataka.
Više niti izvršavanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
dođe do greške, pri obnavljanju podataka baza podataka mora završiti otvorene trans-
akcije. To znači da se baza podataka mora vratiti u stanje u kojem je bila pre početka
..JI.d j\. ll dllltU\l.ljtll
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

transakcije, ili mora da izvrši celu transakciju do kraja. Uglavnom je bolje izgubiti celu Ukoliko dva klijentska programa izvršavaju parove ovakvih upita istovremeno,
transakciju koja se sastoji od međusobno povezanih izmena nego doći u stanje deli- rezultati će zavisiti od toga koji se u kom trenutku izvršio. Ako smo pomoću ovih
mično unetih izmena čiji rezultat može biti neusklađenost sadržaja baze podataka.
upita pokušali da upišemo uplatu od 500 dolara, a drugi klijentski program je pomoću
Ovaj koncept se može izraziti formalno, ali je verovatno najbolje da na primeru naredna dva upita pokušao da uplati 1 OO dolara, konačno stanje računa može biti 11 OO
shvatite o čemu se tačno radi. Recimo da imate vrlo jednostavnu (ali potencijalno dolara ili 1500 -a nijedno od toga neće biti tačan rezultat.
veoma važnu) bazu podataka u kojoj se čuvaju podaci o prometu na bankovnim raču­ # najpre učitavamo tekuće stanje na računu

nima. Za svaki račun postoje barem podaci o identifikatoru računa i tekućem stanju. select balance from account where number = 2;
# upit daje rezultat od 1000 dolara
Tabelu bankovnih računa, accounts, možemo napraviti sa sledećom strukturom:
# sada upisujemo novo stanje
crea te table account update account set balance = 1100 where number = 2;
Jasno je da bi to bilo neprihvatljivo, ali se u ovom sučaju problem može lako rešiti.
number int not null auto increment primary key,
balance float Ako izmene zadamo kao relativne a ne kao apsolutne, postaće nedeljive jedinice i rešili
type = InnoDB; smo problem. Naredni upit će davati ispravne rezultate, bez obzira na to da li se u isto
Verovatno vas neće iznenaditi način na koji ćemo otvoriti tri nova računa pomoću vreme izvršavaju i drugi upiti:
s l edeći h upita: update account set balance = balance + SOO where number = 2;

insert into account (balance) values (O. O); U MySQL-u je jedna komanda update uvek nedeljiva. Ne može je prekinuti
insert into account (balance) values (1000.0); druga komanda, niti se može izvršiti samo delimično. Izvršiće se cela, ili će u slučaju
insert into account (balance) values (2000.0); greške cela biti poništena.
Pošto dosad ništa nije moglo da krene baš naopako, trebalo bi da rezultati budu sle- Složeniji slučajevi su malo teže shvatljivi. Pogledajte naredni par upita čija je svrha
deći podaci: prenošenje iznosa od 1000 dolara sa računa 2 na račun l:
+--------+---------+ update account set balance = balance - 1000 where number = 2;
l number l balance l update account set balance = balance + 1000 where number = l;
+ ------- +---------+ Oba upita unose izmenu u relativnom obliku, ali je važno da se oba upita izvrše da
l l l o l
1000 l
bismo dobili smislene rezultate. Trebalo bi da nakon izvršavanja upita iznos novca u
l 2 l
3 l 2000 l sistemu bude isti kao pre izvršavanja upita. Novac treba da bude prebačen s jednog
l
+--------+---------+ računa na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako dođe

Ako ništa unapred ne određujemo u vezi s brojevima računa koji se generišu u do prekida napajanja između izvršavanja prvog i drugog upita, podaci više neće biti
koloni tipa auto-increment, nevažan je redosled kojim ćete izvršiti ove upite. Sasvim je usklađeni.

nebitno da li ćete ih izvršiti istovremeno s tri interaktivna klijentska računara i ne U jednostavnim slučajevima, problem se može zaobići tako što se oba upita združe
možete znati koji će upit biti izvršen prvi. u jednu SQL komandu. U ovom primeru možemo napisati sledeći upit:
To često nije tačno kada se izvršavaju složeniji upiti ili grupe upita . Pogledajte update account as source, account as dest
naredne dve komande koje uplaćuju SOO dolara na račun broj 2: set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000
# najpre učitavamo tekuće stanje na računu where source.number = 2 and dest.number = l;
select balance from account where number = 2;
ll upit daje rezultat od 1000 dolara Pošto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili
ll sada upisujemo novo stanje smo da izmena postane nedeljiva i da se u potpunosti izvrši ili da se uopšte ne izvrši.
\lpdate account set balance = 1500 where number= 2; Ne moramo da brinemo da li će server prestati da radi tokom izvršavanja nekog dela
Ova dva upita su međusobno povezana i moraju se izvršiti zajedno. Ako klijentski operacije koju smo zahtevali.
programi s drugih računara mogu da izmene stanje na ovom računu između naše pro- U ovom slučaju "stradala" je jedino razumljivost upita. Ovako kombinovan upit je
vere stanja i našeg ažurira~a stanja, može se dogoditi da ne dobijemo rezultate koje slabije razumljiv i teže se otkrivaju greške nego u prvoj verziji koju smo naveli.
SiliO očekivali.
ruyldVIjt: lU UJJUllt:Ud lldll~dr\\:ljd U IIIIIUUD l.dU'Cidllld UjJUllt:Ui:l lli:lll~i:ll\\:ljCI u IVIY;)UL- U l

U mnogim slučajevima neće biti moguće združivanje svih povezanih upita u jedan Podešavanje automatskog potvrđivanja transakcije
kao u navedenom primeru.Jedino rešenje u takvim slučajevima, ukoliko želite razu- U MySQL-uje standardno uključeno automatsko potvrđivanje transakcija (režim rada
mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi autocommit). Svaki upit koji pokrenete, automatski se izvršava u okviru vlastite
označite kao transakciju, time obaveštava te bazu podataka da je to povezan i nedeljiv transakcije. Možete zamisliti da se sve odvija kao da ste izričito zadali komande START
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvršiti ili sve komande u TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita
skupu ili nijedna od njih. Pomenuta dva upita možete izvršiti kao jednu transakciju kao što su sledeći
pomoću sledećih SQL komandi: update account set balance = balance - 1000 where number 2·
'
s tart transaction; update account set balance = balance + 1000 where number l·
'
update account set balance balance 1000 where number 2
'
o

izvršava se kao da su bili napisani u ovom obliku:


update account set balance balance + 1000 where number l·
'
commit; s tart transaction;
update account set balance balance - 1000 where number 2;
Važna osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu commit;
završene i potvrđene (tj. izmene unete u bazu podataka). Nijedna druga nit izvršavanja s tart transaction;
(proces) ne može da čita neusklađene podatke iz tabele ili tabela dok se ne završi update account set balance balance + 1000 where number l·
commit; '
postupak ažuriranja koji ste započeli.
Druga prednost transakcija jeste to da se delimično izvršene transakcije mogu Ukoliko upišete
poništiti. Ako transakciju poništimo pre nego što je potvrdimo (engl. commit), sve s tart transaction;
izmene koje su načinili upiti koji čine transakciju biće poništene.
ništa se neće dogoditi dok ne upišete i
U našem primeru prenošenja novca na drugi račun, ako dodamo komandu SELECT
da bismo proverili da ne skidamo više novca sa izvornog računa nego što ga ima na commit;
njemu, možemo upotrebiti rezervisanu reč ROLLBACK ukoliko želimo da poništimo Automatsko potvrđivanje transakcija možete isključiti pomoću komande SET na
sledeći način:
r clu transakciju. Sintaksa upita izgledala bi ovako:
aLart transaction; set autocommit=O;
update account set balance = balance - 1000 where number 2; Kao što biste i sami zaključili, sledeća komanda vraća MySQL u režim autocommit:
\lpda t e account set balance = balance + 1000 where number l;
set autocommit=l;
s lec t balance from account where number = 2;
ll select kaže da je stanje na računu broj 2 negativno! Pošto je promenljiva autocommi t lokalna za sesiju, izmena režima rada važi samo za
ll bolj e da poništimo promenu upite koje pokreće tekuća sesija, dok je ta sesija aktivna.
ro llba ck;
Ako isključite automatsko potvrđivanje transakcija, nije potrebno izričito zadati
Komanda ROLLBACK prekida transakciju i poništava sve izmene načinjene od početka komandu START TRANSACTION da biste započeli transakciju. Nipošto ne zaboravite da
transakcij e. Transakcija koja je bila poništena umesto da bude potvrđena ne ostavlja povremeno izdate komandu COMMIT da biste izmene koje ste načinili trajno preneli u
nikakav trag na podacima. Budući da delimični rezultati nisu bili vidljivi iz drugih bazu podataka.
lt .msa kcija , konačno stanje baze podataka isto je kao da transakcija nije ni bila započeta. Bez obzira na to da li je režim autocommit uključen ili isključen, u određenim slu-
čajevima se izmene koje načinite automatski potvrđuju (i prenose u bazu).Ako koristite
tip tabela koji ne podržava transakcije, kao što je My ISAM, sve izmene koje načinite
Upotreba transakcija u MySOL-u
odmah se prosleđuju u bazu, bez obzira na vrednost promenljive autocommit. Slobo-
l >.t bi ste mogli da koristite transakcije kako je opisano u prethodnom odeljku, morate
dno možete grupisati komande između komandi START TRANSACTION i COMMIT, ali to
upotrebiti tip tabela koji podržava transakcije- to može biti InnoDB ili BDB. Postoje
neće imati nikakvog uticaja ako tabela ne podržava transakcije. Možete čak upotrebiti
Lt l' !i č it c sintakse koje daju isti konačan rezultat.
i komandu ROLLBACK. Time nećete izazvati grešku, ali u tabeli koja ne podržava trans-
Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Možda Ćete
akcije, ta komanda prosto neće imati nikakvog efekta ni na šta što ste izmenili.To može
kori stiti jedan od ovih oblika da bi vaš kod ostao kompatibilan s drugom bazom poda-
biti korisno kada testirate kod ili kada iz datoteke slike stanja učitava te podatke na server
l ;tka koju imate, ali uglavnom se preporučuje sintaksa START TRANSACTION, budući da
koji radi s drugim tipom tabela.
Jl' propisana standardom SQL- 99 .
ruyldVIJt: lU UfJUllt:Ud lldll~d"~IJ<l U IIIIIUUD ldUt:ldllld H<~n~čiKtiOnl moae1 1nn on

U tabelama koje podržavaju transakcije, postoje akcije (osim izričitog izdavanja Blokada niskog prioriteta biće odobrena samo ako nema nijedne druge niti koja je
komande COMMIT) koje će automatski pokrenuti komandu COMMIT. Ako zahtevate zahtevala blokadu za čitanje ili pisanje u toj tabeli. Međutim, ako je server veoma opte-
zaključavanje podataka, time ćete implicitno potvrditi sve započete upite. rećen, takva situacija se možda nikad neće dogoditi.
Verovatno nećete često ručno upravljati blokadama na ovakav način, ali postoje
Zaključavanje podataka izvesni razlozi zbog kojih biste to ipak učinili. Ako imate aplikaciju koja treba da obez-
Druga mogućnost da iskoristite deo prednosti transakcija jeste da ručno zaključavate bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu-
i otključavate tabele. čajevima, može biti isplativije da koristite brze tabele koje ne podržavaju transakcije i da
Ako zaista želimo da primer koda za deponovanje novca na bankovni račun napi- ručno postavljate blokade da biste rešili problem nemogućnosti transakcione obrade.
šeme s dva odvojena upita, to bi izgledalo ovako: Još jedan čest slučaj u kojem ćete izdavati komande LOCK TABLES jeste kada
lock tables account write; direktno manipulišete MySQL-ovim datotekama s podacima. Na primer, ako želite da
select balance from account where number = 2; obezbedite da sadržaj datoteka na disku ostane usklađen i nepromenjen dok pravite
update account set balance = 1500 where number = 2; njihove rezervne kopije, morate zaključati te datoteke.
unlock tables; Najvažnije što treba da zapamtite u vezi sa zaključavanjem podataka jeste da morate
Komanda LOCK TABLES pokušava da zaključa sve tabele koje navedete da bi tekuća što pre ukinuti sve blokade koje ste postavili inače će drugi sistemi i korisnici morati
nit izvršenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobađa sve da vas čekaju. Imajte u vidu da neki poslovi za čije obavljanje ćete postavljati blokade,
blokade koje je tekuća nit postavila. Postupak deblokade tabela vrlo je jednostavan. kao što su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri-
Ukoliko ste zaključali tabel u, imajte u vidu da je morate što pre osloboditi da biste što lično dugo.
manje ometali druge niti. Zaključavanje tabela je složenije pitanje.
Sve tabele koje vam trebaju morate zaključati istom komandom. U prethodnom
prim eru zahteva se zaključavanje samo jedne tabele, ali ako nameravate da pristupate
Transakcioni model lnnoDB
grupi tabela istovremeno, ili čak različitim alijasima iste tabele, morate ih sve navesti u Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-više
istoj komandi, na primer: iste ciljeve ali uz primenu različitih pristupa problemu. Da bi izolovao transakcije
jedne od drugih, InnoDB primenjuje zaključavanje podataka na nivou reda tabele. To
lock tables account write, account as a read, othertable low_priority
znači da se različite transakcije mogu odvijati nad sadržajem iste tabele u isto vreme,
write;
pod uslovom da samo čitaju tabelu ili da ne menjaju iste redove kada upisuju podatke.
Pošto komanda LOCK TABLES oslobađa sve blokade koje ste pre nje postavili, ako Nepotvrđene izmene sprečavaju da druge niti pristupaju samo redovima na koje
pokušate da grupišete blokade koje su vam potrebne za više komandi, sve prethodne deluje tekuća transakcija, ali ne i celoj tabeli. Zahvaljujući toj osobini, InnoDB obezbe-
blokade biće ukinute a blokada će važiti samo za poslednju komandu u grupi. đuje visoke performanse uz prednosti koje biste očekivali od jednog savremenog
Postoje dve vrste blokada: za čitanje i za pisanje. Ako vam je potreban pristup tabeli sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste usklađenost s gru-
radi upisivanja podataka i ne možete dozvoliti da druge niti pristupaju tabeli u isto pom pravila ACID.
vreme kad i vi, blokada za pisanje će sprečiti da bilo koja druga nit čita tabelu ili piše
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da čitate tabelu, nema Usklađenost sa ACID pravilima
nik:lkvc štete ako dozvolite da i druge niti čitaju tabelu u isto vreme. Blokada za čitanje Važan pojam iz terminologije baza podataka koji još nismo definisali jeste ACID. To je
sprcbva druge niti da pišu u tabel u samo dok je vaša nit blokira. akronim od engleskih reči Atomicity, Consistency, Isolation i Durability (nedeljivost,
nlokada za pisanje može se zadati sa opcijom low_priority (nizak prioritet). U sva- usklađenost, izolovanost i trajnost). Mnogima smeta činjenica da pri korišćenju
kon! sistemu koji omogućava blokiranje tabela, uključujući i MySQL, neophodna su MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
pr.1v1Ll koja određuju ko će u slučaju sukobljenih zahteva moći prvi da postavi blokadu. MySQL je usklađen sa ACID pravilima.
MySQL obično daje veći prioritet zahtevima za blokade radi pisanja da bi omogućio da Atomicity (nedeljivost) znači da je svaka transakcija nedeljiva celina. U bazu poda-
mncnc uskladištenih podataka budu obavljene što pre. Ako vam takvo ponašanje ne taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U slučaju
odgov:mt, možete zahtevati blokadu za pisanje niskog prioriteta kao što smo uradili spoljne greške, jasno je da bi bilo savršeno kada bi postupak obnavljanja baze podataka
"·' tabel u othertable u prethodnom primeru. Međutim, postoji začkoljica. Kad god bio u stanju da dovrši sve transakcije koje su bile započete u trenutku greške; među­
:t.illtcvatc blokadu tabele, može se dogoditi da morate sačekati da ona bude odobrena. tim, prihvatljivo je i da te transakcije budu poništene.
l ransakciOni model lnnoDB
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Nivo izolovan osti serializable je savršen gledano iz ugla usklađenosti i robusnosti


Consistency (usklađenost) znači da svaka operacija nad podacima treba da prebaci
izme~~ podat~a. S ti~ ~ivoom izlov~osti , čitanje podataka i njihove izmene odvijaju
bazu podataka iz jednog ispravnog stanja u drugo ispravno stanje. N~ sme biti "među­
se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego
stanja" u kojima podaci nisu potpuno usklađeni. Osim toga, trebalo b1 da baza pvodataka
što b.u~e dozvoljeno sledeće čitanje istog podatka. Transakcije ne moraju da se uvek
sprečava operacije koje narušavaju usklađenost podataka. Ako u baz1 podataka :uvate
?dVIJaJU bez međusobnog preplitanja da bi se dobio privid serijalizovanih transakcija
bankovne račune koji pripadaju klijentima banke, ne b1 trebalo da bude moguce da
Jer su mnoge potpuno nezavisne jedna od druge, ali ako dve transakcije deluju na iste
neko otvori račun koji pripada nepostojećem klijentu, niti bi trebalo dozvoliti brisanje
podatke u isto vreme, one će biti serijalizovane. Pošto u tom slučaju mora doći do
klijenta iz tabele klijenata ukoliko u tabeli računa ima računa koji mu pripadaju ....
z~klju.čavanja podataka i čekanja na njih, kombinovano s obavezom ispitivanja i pred-
Isolation (izolovanost) znači da transakcije ne deluju jedna na drugu dok se odviJaJU.
viđanp koje se transakcije međusobno prepliću, konačan rezultat je to da je nivo izo-
Svaka transakcija vidi svet oko sebe kao da je jedina koja čita i menja podatke.~ stvar~
lovanosti serializable naj sporiji način transakcione obrade. Ako želite da radite s tim
nosti to nije uvek tako, ali se pomoću blokada može postići takav priv1d. U zav1snost1
nivoom izolovan osti, komanda je sledeća:
od načina podešenosti baze podataka i opcija koje upotrebite, u praksi ćete imati raz-
ličite nivoe izolovanosti. (Opširnije objašnjenje naći ćete u sledećem odeljku.) se t transaction isolation level serializable;
Durability (trajnost) znači da izmene koje je transakcija načinila a prosleđene su bazi Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka
podataka, treba da postanu trajne. Ovaj uslov se može lako ispuniti u jednostavn~~ transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadržaj k;o na
programu, ali u složenom sistemu za upravljanje relacionim bazama podataka, kojl početku transakcije. Garantuje se da je čitanje reda ponovljivo, tj. da se iz istog reda
zaključava podatke i održava više verzija istih podataka u isto vreme, problem se pret- svaki put učitavaju isti podaci. Ako na početku transakcije pozovete
vara u pravo "minsko polje". Osim toga, trajnost znači i to da bi u slučaju kvara trebalo sel ect * from account where number=l;
da postoji mogućnost povratka baze podataka u tekuće stanje. Ako se pres~~nak napa-
a zatim isti upit ponovo izvršite kasnije u transakciji, oba puta dobićete isti rezultat.
janja, kvar diska ili druga katastrofa dogodi između trenutka u kojem J~ klljentski pro-
Međutim, možete dobiti i ono što se zove jm1tomski podaci (engl. phantom reads). Može
gram poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI
se dogoditi da druga transakcija koja se završi pre vaše doda nove redove u tabelu.Ako
mogućnost da se, pomoću kombinacije rezervnih ko~ija baze podat~ka 1 dnev~1ka . dvaput izvršite isti upit koji sadrži određeni uslov, kao sledeći
transakcija, baza podataka vrati u stanje pre kvara, pa cak 1 da se dovrse transakciJe koje
sele ct * from account where balance>lOOO;
su bile započete ali ne i potvrđene.
Ako koristite Inn oD B tabele (ili BerkeleyDB tabele), MySQL je usklađen sa ACID može se dogoditi da pri drugom čitanju dobijete nove redove - fantomske redove -
pravilima. Nedeljivost je obezbeđena upotrebom sinta~se za trans.a~cije. Transakcije i kojih nije bilo prvi put.
spoljni ključevi obezbeđuju usklađenost podataka. Mozete podes1~1 mvo 1Zolovanost1 Trebalo bi da u praksi vrlo retko naiđete na fantomske podatke u MySQL-u.
transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka ob~z­ lnnoDB rešava problem pomoću algoritma nazvanog blokiranje sledećeg ključa (engl.
beđuju trajnost izmena. (Replikovanje omogućava izgradnju sistema s vrlo v1sokun 11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana.
stepenom trajnosti bez ijedne neusklađenosti.) Verovatno već znate da InnoDB primenjuje zaključavanje podataka na nivou redova .
~ad~ se transakcija odnosi na određeni red tabele, taj red se zaključava da bi transakcija

Izolovanost transakcija bila Izolovana od drugih. Osim zaključavanja redova na koje se transakcija odnosi,
InnoDB tabele mogu da se rade s četiri nivoa izolovanosti transakcija. Redosledom od ,tlgoritam blokiranja sledećeg ključa blokira i razmake između redova koje nađe u
najjačeg ka najslabijem, to su sledeći: tndeksu. Pošto se problem fantomskih podataka rešava na taj način, nivo izolovanosti
wrializ able moraćete da koristite samo u malom broju sistema .
• Serializable (transakcije se serijalizuju)
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo više
• Repeatable read (podaci su ponovljivi pri svakom čitanju)
nece b1t1 ~asv1m 1z~~ovane. Ako izvršite neki upit, a zatim ga kasnije u transakciji pono-
• Read committed (dozvoljava se čitanje podataka iz potvrđenih transakcija) VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u međuvremenu izmenila
• Read uncommitted (dozvoljava se čitanje podataka iz nepotvrđenih transakcija) podatke i prenela izmene u bazu. Ako vam baš to odgovara, komanda je sledeća
Kao i u mnogim drugim slučajevima, morate napraviti kompromis između robu- Hl'L transaction isolation level read committed;
snesti i performansi.
2 Poglavlje 1O Upotreba transakCIJa u lnnouts taoe1ama

Pri korišćenju najnižeg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja- 2. Nedeljivost transakcije znači sledeće:
da li su transakcije izolovane i usklađene, pa prema tome, ne krše ACID pravila, i da li
a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava
se uopšte može pričati o transakcijama. U ovom režimu rada, transakcije mogu da
b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
čitaju izmene koje su druge transakcije načinile a da te izmene još nisu potvrđene
(prenete u bazu podataka). To se zove čitanje prljavih podataka (engl. dirty reads) i može e) transakcije ne utiču jedna na drugu
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da će sve aktivne niti d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
samo čitati ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read 3. Izolovanost transakcije znači sledeće:
uncommitted, upotrebite sledeću komandu: a) se izvršavaju sve operacije koje transakcija zahteva ili se nijedna ne izvršava
set transaction isolation level read uncommitted; b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti. e) transakcije ne utiču jedna na drugu
d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
Tabela 10.1 Osobine nivoa izolovanosti transakcija
4. Trajnost transakcije znači sledeće:
Prljavi podaci Neponovljivi podaci Fantomski podaci
a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava
Read Uncommitted Mogući Mogući Mogući
b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo
Read Committed Nisu mogući Mogući Mogući
e) transakcije ne utiču jedna na drugu
Repeatable Read Nisu mogući Nisu mogući Mogući (ali malo
verovatni) d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne
Serializable Nisu mogući Nsu mogući Nisu mogući 5. U režimu ponovljivog čitanja može se dogoditi da
a) učitate prljave podatke
Sažetak b) učitate neponovljive podatke
e) učitate fantomske podatke
• Transakcija je grupa SQL upita koja se obrađuje kao nedeljiva celina. Izvršava se
u potpunosti ili se poništava u potpunosti. d) nijedno od prethodnog
• Standardna SQL-ova sintaksa za definisa~e transakcije izgleda ovako
start transaction;
# do work
Vežbe
commit; Dokumentacija za MySQL/InnoDB sadrži mnogo saveta za poboljšanje performansi
sistema kada se koriste InnoDB tabele. Primenite što veći broj na svoj sistem.
ali postoji i više drugih ekvivalentnih načina da se postigne isti rezultat.
Možete početi od ovog mesta:
• ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost,
www.innodb.com/ibman.html#InnoDBTuning
usklađenost, izolovanost i trajnost). Trebalo bi da zapamtite šta ove reči znače
inače drugi zaluđenici za računare neće hteti da razgovaraju s vama. Na serveru koji nije previše važan za poslovanje firme, srušite MySQL dok ste
• Redosledom od najjačeg ka najslabijem, nivoi izolovanosti transakcija su sledeći: usred neke transakcije. Nije neophodno da gurnete kućište čvrstih diskova s velike
serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u visine, niti da iščupate kabi za napajanje iz utičnice. Dovoljno je da prekinete rad
Inn o DB tabelama je repeatable read. MySQL-ovog procesa. Pregledajte sadržaj dnevnika izmena i posmatrajte šta se događa
kada ponovo pokrenete server.

Pitanja
l. Ako je režim autocommit isključen, transakcija će biti potvrđena
a) kada se izda komanda COMMIT
b) kada se zahteva blokada tabele
e) i a) i b)
d) ni u jednom od navedenih slučajeva
154 Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Odgovori
Pitanja
l. e
2. a
v
3. e
4. d
Administriranje MySQL-a
5. e

U sledećem poglavlju
U poglavlju ll razmotrićemo MySQL-ov složen sistem upravljanja pravima korisnika . 11 Upravljanje pravima korisnika
Na raspolaganju je bogat izbor mogućnosti za moć koju ćete dati korisnicima baze
podataka. U tom poglavlju savladaćete postojeće opcije i načine na koje se njima 12 Podešavanje MySQL-a
upravlja. 13 Administriranje baze podataka
14 Izrada rezervnih kopija i obnavljanje podataka
15 Zaštita MySQL servera
16 Replikovanje baze podataka
11
Upravljanje pravima korisnika

J EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov složen sistem prava


korisnika. U ovom poglavlju bavićemo se pravljenjem korisničkih naloga, pravima
koja su na raspolaganju i načinom na koji su ta prava predstavljena u MySQL-ovim
l<lbelama. Razmotrićemo sledeće teme:
• Pravljenje korisničkih naloga pomoću komandi GRANT i REVOKE
• Nivoi korisničkih prava
• Tabele prava

Pravljenje korisničkih naloga pomoću komandi


GRANT i REVOKE
Prava za pristup podacima dodeljuju se korisničkim nalozima pomoću komande GRANT,
n ukidaju se pomoću komande REVOKE. To su standardne SQL-ove komande koje
možete izvršiti na isti način 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 izvršavate komande koji se pominju u ovom odeljku, potreban
vam je određen nivo prava za pristup podacima. Ako ste sami instalirali MySQL,
imate pristup nalogu root, pa prema tome i odgovarajući nivo prava. Ako MySQL
koristite na računaru koji neko drugi administrira (kao što je računar na poslu ili iznaj-
mljeni računar), možda nemate odgovarajući nivo prava da biste izvršavali te upite.
U tom slučaju, dobićete poruku o grešci nalik na sledeću:
ERROR 1045: Access denied for user: 'laura®127.0.0.1' (Using pass-
word: YES)

Dodeljivanje prava
Najpre ćemo razmotriti komandu GRANT, koja omogućava da pravite nove korisničke
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk-
cija mn. Pogledajte sledeći 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 pokuša da se pri- Korisnikovu lozinku možete izmeniti ako izdate komandu, na primer,
javi na MySQL server s računara localhost. Tom nalogu dodeljuje lozinku (reč set password for fred®localhost = password('novalozinka');
lozinka, koju je vrlo teško pogoditi - razume se, vi ćete zadati nešto bolje!). Reč
Da biste to uradili, morate imati pristup bazi podataka mysql.
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znači da korisnik
Odredba WITH GRANT OPTION je specijalno pravo koje korisniku omogućava da
može samo da se prijavi na server i ništa više. U odredbi ON zadajemo objekte na koje
svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne možete da dodeljujete
se odnose prava koja dodeljujemo korisniku. Budući da korisniku dodeljujemo samo
prava drugim korisnicima, razlog je to što vam nedostaje ovo pravo. Osim toga, dru-
pravo da se prijavi na server, ta odredba je u ovom slučaju izlišna.
gom korisniku ne možete dodeliti pravo koje sami nemate.
Opšti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledeći:
Odredbu WITH možete upotrebiti i da biste po satu ograničiti broj izvršenih upita,
GRANT vrsta_prava [(lista_kolona)] [, vrsta_prava [(lista_kolona)] unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih
... ]
parametara je nula, što znači da nema ograničenja.
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka'] Odredba REQUIRE omogućava da zahtevate da se korisnik prijavljtije isključivo
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ] putem zaštićene veze . Da biste mogli daje koristite, moraćete da podesite MySQL na
[REQUIRE odgovarajući način. To ćemo podrobnije razmotriti u poglavlju 15, "Zaštita MySQL
NONE l servera " .
[{SSLI X509}]
[CIPHER način_šifrovanja [AND]]
[ISSUER davalac_sertifikata [AND]] Nivoi prava
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l Prava koja možete dodeliti pomoću komande GRANT dele se u dve osnovne kategorije:
MAX_UPDATES_PER_HOUR # l prava za obične korisnike i prava za adnunistratore.
MAX CONNECTIONS_PER_HOUR #]]
U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje, Prava za ob i čne korisn ike
saznaćete u narednom odeljku . Neka prava su globalna (odnosno, važe za sve baze Prava za obične korisnike pobrojana su u tabeli 11.1.
podataka na serveru), dok druga važe samo za određene objekte (baze podataka, tabele
Ta be la 11 .1 Prava za obične korisnike
ili pojedine kolone tabela).
Pravo Zn ačenje
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To može biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim CREATE Korisniku je dozvoljeno pravljenje tabela.
tabelama (oblik ime_baze. *). Umesto imena objekta, možete zadati i *. *, što ozna- CREATE TEMPORARY TABLES Korisniku je dozvoljeno prav ljene privremenih tabela.
Čava sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete DELETE Korisniku je dozvoljeno da briše redove iz tabela.
važe samo za tekuću otvorenu bazu podataka. Ako nije otvorena nijedna baza poda- EXECUTE Korisniku je dozvoljeno da izvršava procedure.
taka, prava se dodeljuju kao da ste zadali *. * u odredbi ON. INDEX Korisniku je dozvoljeno da pravi indekse.
U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik INSERT Korisniku je dozvoljeno da umeće nove redove u table.
već ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL će ga LOCK TABLES Korisniku je dozvoljeno da zaključava tabele.
napraviti. U ovoj odredbi možete zadati više od jednog korisnika te imena računara s SELECT Korisniku je dozvoljeno da učitava redove.
kojih se mogu prijavljivati, na primer, fred®localhost. Ako imate teškoća pri prija- SHOW DATABASES Korisniku je dozvoljeno da izdaje komandu SHOW DATABA-
vUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite SES da bi dobio listu baza podataka koje postoje na serveru.
i ime računara s kojeg se prijavljujete. Ime MySQL-ovog korisničkog naloga ne mora UPDATE Korisniku je dozvoljeno da ažurira podatke.
biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime kori- USAGE Korisniku je dozvoljeno da se prijavi na server, ali osim toga,
snika može sadržati najviše 16 znakova. ne može da radi ništa drugo.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka postojećem korisniku. Prava za administratore
Korisnici mogu da menjaju svoje lozinke pomoću komande: U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 .
seL password = password('novalozinka'); Neka među njima možete dodeliti i određenim korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obične korisnike.
.............. ,., ......
Poglavlje 11 Upravljanje pravima korisnika

• Pravo pristupa određenoj tabeli. Dodeljuje se tako što se navede ime te tabele
Tabela 11.2 Prava za administratore u komandi GRANT:
Pravo Značenje grant select on department to fred;
ALL Korisnik ima sva prava osim WITH GRANT OPTION. • Prava pristupa određenoj koloni. Dodeljuje se tako što se zada ime kolone
ALTER Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo u odredbi GRANT komande GRANT. Na primer:
možete dodeliti korisnicima koji imaju dovoljno stručnog znanja, ali grant select (employeeiD) on employee to fred;
budite oprezni pri tome jer se može (zlo)upotrebiti i za promenu
sadržaja tabela prava. Kada utvrđuje da li korisnik ima pravo da izvrši određeni posao, MySQL kombi-
DROP Korisniku je dozvoljeno da briše tabele. Ovo pravo možete dodeliti nuje pomoću operatora OR korisnikova globalna prava, prava koja ima za bazu poda-
korisnicima u koje imate dovoljno poverenja. taka, prava koja ima za tabelu i prava koja ima za kolonu .
FILE Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili
menja sadržaj druge datoteke. Ovo pravo takođe možete dodeliti
korisnicima u koje imate dovoljno poverenja. Pazite se korisnika Upotreba komande REVOKE
koji pokušavaju da proslede podatke u datoteku koju slobodno Komanda REVOKE suprotna je komandi GRANT i služi za ukidanje prava koja korisnik
izaberu, kao što je /etc/passwd ili slična datoteka! ima. Na primer:
PROCES S Korisniku je dozvoljeno da prikaže listu svih procesa- tj. da vidi sve revoke all on employee.* from fred;
tekuće procese koje MySQL izvršava.
RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda Opšti oblik komande revoke izgleda ovako:
ima više namena. U nastavku ovog poglavlja razmotrićemo REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l
komandu FLUSH PRIVILEGES, a komandom FLUSH bavićemo se ... l
detaljnije u poglavlju 13. ON {irne_tabele l * l *·* l ime_baze.*}
REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni FROM ime korisnika [, ime_korisnika ... l
serven. Kao što vidite, odredbe su u suštini iste kao u komandi GRANT i omogućavaju uki-
REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na danje odgovarajućih prava.
zavisnom serveru.Više informacija o tome naći ćete u poglavlju 16.
SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin
shutdown.Više informacija o tome naći ćete u poglavlju 13. Tabele prava
SUPER Korisniku je dozvoljeno da se prijavljuje na server čak i kada je s Podaci koje menjate pomoću komandi GRANT i REVOKE čuvaju se u bazi podataka koja
MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih se zove mysql. Umesto pomoću komandi GRANT i REVOKE, tabele u toj bazi podataka
veza i može da izvršava komande CHANGE MASTER, KILL (thread) ,
možete me~ati i direktno, ukoliko tačno znate šta treba da uradite. Osim toga,
mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.
podatke iz tih tabela možete i da učitavate da biste lakše rešili probleme u vezi s pra-
WI TH GRANT OPTION Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam
vima ukoliko se pojave.
1ma.
Ako sadržaj tih tabela menjate direktno, morate izdati komandu
Postoji još jedno pravo koje se zove REFERENCES. Rezervisano je za buduću upo- flush privileges;
trebu i mada ga možete dodeljivati, zasad nema nikakvog efekta. da bi izmene počele da važe.
U bazi podataka mysql nalazi se šest tabela:
Utvrđivanje ukupnih prava • user • tables_priv
Pomoću komande GRANT možete dodeliti prava na četiri nivoa: • db • columns_priv
• Globalna prava koja važe za sve baze podataka na serveru. Zadaju se pomoću • host • func
niza znakova*.* u komandi GRANT. Na primer:
Prvih pet tabela koristi se za čuvanje podataka u vezi s pravima korisnika. (U tabeli
grant all on*.* to fred; func skladište se podaci koji se tiču funkcija koje korisnici pišu, ali to je tema koja
• Prava koja važe samo za određenu bazu podataka. Zadaju se izrazom izlazi izvan okvira ove knjige.)
irne_ba z e . * u komandi GRANT:
q n mL a ll on e mpl oy ee .* to fred;
t"091CIVIjt: ll Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d

Prve tri tabele- user, db i host -koriste se kada se utvrđuje da li imate pravo pri- Tabela db
stupa bazi podataka. Svih pet tabela se koristi kada se utvrđuje imate li pravo da U ovoj tabeli čuvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela
izvršite određenu komandu. se sastoji od sledećih kolona:
• Kolone za opseg vidlj'ivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji
Tabela user red treba učitati. Ako imate različita pravila za različite računare, ostavite polje
Tabela user sadrži podatke o globalnim pravima korisnika. host prazno, a u tabeli host dodajte odgovarajuću grupu redova da biste obezbe-
Ova tabela ima sledeće kolone: dili detaljnije podatke. Ovoj grupi pripadaju sledeće kolone:
• Kolone za opseg vidljivosti Na osnovu sadržaja ovih kolona utvrđuje se koji red Host
treba učitati. Ovoj grupi pripadaju sledeće kolone: Db
Host: Ime računara s kojeg korisnik uspostavlja vezu User
• Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host,
user: Ime korisnika
Db i User. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za
Password: Korisnikova lozinka, u formatu šifrovanom pomoću funkcije
prava su sledeće:
PASSWORD ()
Select_priv Create _pri v
• Kolone za prava Svaka kolona odgovara jednom globalnom pravu i može
sadržati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo- Insert _pr iv Drop_pri v
balno pravo). Ovoj grupi pripadaju sledeće kolone: Update_priv Grant_priv
Shutdown_priv Delete _pri v Create_tmp_table_priv
Select_priv
Process_priv Index_pri v Lock_tables_priv
Insert _pri v
File _pri v Alter_pri v
Update_priv
'i' db _pri v
'shOW'_
Delete _pri v
Super_pr iv
Tabela host
Index_pri v
MySQL pretražuje tabelu host kad god naiđe na prazno polje u tabeli db. Takvo
Alter_pri v Create_tmp_table_priv
ponašanje ne možete zadati komandom GRANT, ali možete ga ručno podesiti. Tabela
Create_priv Lock_tables_priv ima sledeće kolone:
Drop _pr iv Execute _pr iv
• Kolone za opseg vidljivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji
Grant _pri v Repl_slave_priv
red treba u čitati. Svaki red u ovoj tabeli sadrži podatke o jednoj bazi podataka
References _pri v Repl_client_priv kojoj se pristupa s jednog računara. Ovoj grupi pripadaju sledeće kolone:
Reload_priv Host
• Kolone za uspostavljanje zaštićene veze Odgovaraju podacima koji se zadaju Db
u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju sledeće kolone: • Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host i
ssl_type Db. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za prava su
ssl_cypher sledeće:
x509_issuer Select _pri v Create _pri v
x509_subject Insert_priv Drop_pr iv
• Kolone za ograničavanje upotrebe resursa Sadrže podatke o eventualnim ograniče­ Update_priv Grant_priv
njima upotrebe određenih resursa koje zadajete na kraju komande GRANT. Ovoj
Delete_priv Create_tmp_table_priv
grupi pripadaju sledeće kolone:
Index_pr iv Lock_tables_priv
max_questions
Alter_pri v
max_updates
max_ connections
ou-.
Sa ela

Tabela tables_priv Sažetak


U tabeli tables_priv čuvaju se podaci o pravima koje korisnici imaju za pojedine
tabele. Ova tabela ima sledeće kolone:
GRANT i REVOKE
• Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U
• Komanda GRANT omogućava da korisniku dodelite prava pristupa ili da napravite
ovom slučaju imamo i kolonu Table_name, koja sadrži podatke o tabeli na koju
nov korisnički nalog. Format komande je sledeći:
se pravo odnosi. Kolone za opseg vidljivosti su sledeće:
GRANT vrsta_prava [ (lista_kolona) J [, vrsta_prava [ (lista_kolona) J
Host ... ]
Db ON {ime_tabele l * l *.* l ime_baze.*)
User TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']
[, ime_korisnika [IDENTIFIED BY 'lozinka'] ... ]
Table name [REQUIRE
• Kolone o dodeli Čuvaju podatke o tome ko je i kada dodelio pravo. Ovoj grupi NONE l
pripadaju sledeće kolone: [{SSLI X509}J
[CIPHER način_§ifriranja [AND]]
Gran tor
[ISSUER davalac_sertifikata [AND]]
Time stamp [SUBJECT subjekt]]
• Kolona Table_priv Čuva podatak o pravu koje je dodeljena kombinaciji [WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l
Host/Db/User za tabelu navedenu u koloni Table_name. Kolona može sadržati MAX_UPDATES_PER_HOUR # l
MAX_CONNECTIONS_PER_HOUR #JJ
jednu iz skupa sledećih vrednosti: Select, Insert, Update, Delete, Create,
Drop, Grant, References, Index i Al ter. • Komanda REVOKE ukida prava dodeljena korisniku. Format komande je sledeći:
REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) J
• Kolona Column_pri v Čuva podatak o pravu koje korisnik ima za sve kolone ... ]
tabele. Može sadržati jednu iz skupa sledećih vrednosti: Select, Insert, Update ON {ime_tabele l * l *.* l ime_baze.*)
i References. Ako je ova kolona prazna, MySQL će potražiti u tabeli FROM ime_korisnika [, ime_korisnika ... ]
columns_priv detaljnije podatke o tome šta jeste a šta nije dozvoljeno
u kolonama tekuće tabele. Prava
• Prava se mogu dodeljivati korisnicima pojedinačno.
Tabela columns_priv • Ovo su prava namenjena običnim korisnicima:
U tabeli columns _pri v čuvaju se podaci o pravima korisnika za pojedine kolone. CREATE LOCK TABLES
Tabela ima sledeće kolone:
CREATE TEMPORARY TABLES SELECT
• Kolone za opseg vidlj"ivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji DELETE SHOW DATABASES
red treba učitati. Ovoj grupi pripadaju sledeće kolone: EXECUTE UPDATE
Host INDEX USAGE
Db
INSERT
User
Table name • Ovo su prava name~ena administratorima:
Column_name ALL REPLICATION CLIENT
• Kolona column_pri v Čuva podatak o pravu dodeljenom kombinaciji vrednosti ALTER REPLICATION SLAVE
navedenoj u kolonama za opseg vidljivosti. Može sadržati jednu iz skupa sle- DROP SHUTDOWN
dećih vrednosti: Select, Insert, Update i References. FILE SUPER
• Kolo/la Time stamp Pokazuje kad je pravo bilo dodeljena. PROCES S WITH GRANT OPTION
RE LOAD
G Poglavlje 11 Upravljanje pravima korisnika
U sledećem po!Jiavl u

Tabele prava 5. Podatak u koloni tables_priv.table_priv


• Podatke o korisničkim nalozima i njihovim pravima MySQL čuva u bazi poda- a) opisuje pravo koje korisnik ima za tu tabel u u obliku jedne iz skupa
taka mysql. vrednosti
• Postoji pet tabela prava. b) ima vrednost Y ili N kada je korisniku dozvolj en pristup toj bazi podataka
• U tabeli user čuvaju se imena korisnika, njihove lozinke i podaci o globalnim e) opisuje jedno od prava koje korisnik ima za tu tabel u
pravima . d) pokazuje da li za tu tabelu postoji odgovarajući 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 računara Vežbe
može pristupati.
l. Napišite komandu GRANT koja pravi korisnički nalog bill, čija je lozinka
• U tabeli tables _pri v čuvaju se podaci o pravima za pojedine tabele.
secret i kome je dozvoljeno da učitava podatke iz tabele department, ažurira ih,
• U tabeli columns_priv čuvaju se podaci o pravima za pojedine kolone dodaje u tabelu i briše iz ~e.
u tabelama.
2. Napišite komandu REVOKE koja ukida prava tog korisnika.

Pitanja Odgovori
l . Pravo GRANT OPTION omogućava korisniku da
a) učitava podatke iz datoteke Pitanja
b) drugima dodeljuje prava koja sam ima l. b
e) se prijavljuje na server, ali ništa više 2. e
d) izdaje komandu FLUSH 3. d
2. Pravo USAGE omogućava korisniku da 4. a
a) učitava podatke iz datoteke 5. a
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali ništa više Vežbe
d) izdaje komandu FLUSH l.
grant select, update, insert, delete
3. Pravo RELOAD omogućava korisniku da on employee.department
a) učitava podatke iz datoteke to bill®localhost
b) drugima dodeljuje prava koja sam ima identified by 'secret';
2.
e) se prijavljuje na server, ali ništa više
revoke select, update, insert, delete
d) izdaje komandu FLUSH on employee.department
4. Pravo FILE omogućava korisniku da from bill;
a) učitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima U sledećem poglavlju
e) se prijavljuje na server, ali ništa više U sledećem poglavlju, "Podešavanje MySQL-a", razmotrićemo mnogobrojne opcije
d) izdaje komandu FLUSH za podešavanje MySQL-a.
12
Podešavanje MySOL-a

U OVOM POGLAVLJU nadovezujemo se na kratak uvod u podešavanje MySQL-a iz


poglavlja l, "Instaliranje MySQL-a". Razmotrićemo razne opcije za podešavanje
MySQL servera, s posebnim osvrtom na internacionalizovanje servera.
Obradićemo sledeće teme:

• Podešavanje MySQL-ovih konfiguracionih opcija


• Konfiguracione opcije za više servera na istom računaru
• Internacionalizovanje

Podešavanje MySQL-ovih konfiguracionih opcija


Kao što ste iz dosadašnjeg čitanja ove knjige saznali, mnogi programi za rad s MySQL-
-om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji,
ali u mnogim slučajevima možete ih zadati i u obliku datoteke opcija. U istoj datoteci
opcija možete zadati vrednosti opcija za komandne linije više 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 omogućava da na jednom
mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL
podržava i upotrebu zasebnih datoteka opcija koje važe za ceo server i za pojedinačne
korisnike.
Rešenje s datotekama opcija naročito je pogodno kada upravljate s više servera.
Ako svi serveri imaju istu konfiguraciju, što je čest slučaj kada se primenjuje replika-
vanje, možete koristiti istu konfiguracionu datoteku za svaki server.
Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada ćemo ih ponovo
razmotriti, ali opširnije. Datoteku ili datoteke opcija naći ćete u direktorijumima
navedenim u nastavku teksta.
Kada je MySQL instaliran na Windowsu, datoteku opcija možete smesti ti u sistem-
ski direktoriju m Windowsa i nazvati je my. ini, a možete 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
ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll upnJA
170 Poglavlje 12 Podešavanje MySQL-a

Kada je MySQL instaliran na Unixu, možete imati jednu globalnu datoteku opcija, Na isti način kao što zadajete opcije za pojedine programe, možete zadati i grup11
po jednu datoteku opcija za svaki MySQL server instaliran na računaru i po jednu opcija [client], koje će važiti za sve programe.
datoteku opcija za svakog korisnika. (Na jednom fizičkom računaru može raditi Redovi koji počinju znakom # su komentari .
istovremeno više MySQL servera, što je objašnjeno u nastavku ovog poglavlja.) Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija • Možete navesti ime opcije koju želite da uključite; na primer:
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za log-bin
pojedine korisnike nalaze se u matičnom direktorijumu svakog korisnika. Imajte u Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
vidu da imena datoteka opcija za korisnike imaju prefiks tačku- tj. ime datoteke je • Možete navesti ime opcije i vrednost koju joj dodeljujete; na primer:
.my.cnf a ne my.cnf. innodb_flush_log_at_trx_commit=l
Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer
• Možete navesti ime opcije i do deli ti joj vrednost pomoću sintakse set -vari a-
sintakse za tu vrstu datoteka. Njen sadržaj ponovo prikazujemo u listingu 12.1.
ble; na primer:
Listing 12.1 Primer datoteke opcija my.cnf set-variable = innodb_log_buffer_size=BM
Treći oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Pošto
[mysqld]
# binarno beleženje i beleženje sporih upita ćete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da

log-bin znate šta on znači. Na primer, to je slučaj s primerom datoteke my. cnf, koju
log-slow-queries smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
# podešavanje za InnoDB tabele
# ovo je osnovna datoteka opcija predložena u dokumentaciji. Neke opcije koje određuju kako će se koristiti datoteke opcija važe za sve programe:
# Datoteke za podatke treba da omoguće • --no-defaults znači da nema datoteka opcija čiji bi sadržaj trebalo učitati.
# skladištenje podataka i indeksa.
# obezbedite dovoljno slobodnog • - -print-defaults prikazuje sve vrednosti opcija koje važe za tekući program.
# prostora na disku. • --defaults-file=/putanja/do/datoteke nalaže programu da koristi zadatu
innodb_data_file_path = ibdatal:lOM:autoextend datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena
# podesite veličinu rezerve za bafere na
konfiguracije.
# so-so% količine memorije
# na računaru • --defaults-extra-file=/putanja/do/datoteke učitaće navedenu datoteku
set-variable = innodb_buffer_pool_size=70M nakon učitavanja globalne datoteke opcija, ali pre učitavanja datoteka opcija za
set-variable = innodb_additional_mem_pool_size=lOM pojedinačne korisnike.
# podesite veličinu dnevnika na približno
# 25% veličine rezerve za bafere Opcije za mnoge programe koje možete podesiti pomoću datoteka opcija opisane
set-variable = innodb_log_file_size=20M su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmo-
set-variable = innodb_log_buffer_size=BM trićemo najvažnije i najkorisnije opcije za komandnu liniju programa MySQL server.
# podesite .. flush_log_at_trx_commit
# na o ako možete da prihvatite gubljenje
u nekoliko poslednjih transakcija Opcije za program mysqld
innodb_flush_log_at_trx_commit=l Naredna lista opcija nije potpuna, a svrha joj je da predoči najčešće korišćene opcije
za mysqld. Svaka opcija se može zadati na komandnoj liniji pri pokretanju programa
Pogledajmo format ove datoteke. mysqld ili, kao što smo već pomenuli, putem datoteke opcija.
Prvi red u datoteci je Listu svih opcija (upozorenje: prilično je dugačka) dobićete ako na komandnoj
[mysqld] liniji otkucate
To znači da su opcije navedene iza ovog reda namenjene programu mysqld. Ako mysqld --help
želite da zadate opcije za drugi program, navedite njegovo ime na početku grupe
opcija. Imc mora biti napisano unutar uglastih zagrada.
1/2 Pog lavlje 12 Podešavanje MySQL-a

Evo nekoliko korisnih opcija: • innodb_additional_mem_pool_size=lOM


Ova opcija odvaja memoriju koja će služiti za smešta~e MySQL-ovih internih
• ansi: Pokreće server u režimu kompatibilnosti sa standardom ANSI. U tom slu-
struktura podataka. Ako MySQL- u ponestane ove vrste memorije, počeće da
čaju, MySQL prihvata samo sintaksu koja je u skladu sa standardom ANSI-99 SQL.
upisuje upozorenja u dnevnik grešaka .
• basedir: Zadaje kerenski direktorijum instalacije ukoliko želite da server radi • innodb_log_file_size=20M
u nestandardnom direktorijumu.
Ova opcija podešava veličinu datoteka dnevnika . InnoDB cikli č no popunjava n
• datadir: Isto kao basedir, ali za direktorijum data. datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_ log_ files_
• log-bin: Uključuje binarno beleženje u dnevnik izmena. Možete zadati ime in_group; podrazumevana vrednost je 2 i preporu č uje se.
i direktorijum datoteke dnevnika izmena. • innodb_log_buffer_size=8M
• log-error: Uključuje beleženje grešaka. Možete zadati ime i direktorijum dato- Ova opcija podešava veličinu bafera u koji sc upisuje dnevnik izmena pre nego
teke dnevnika grešaka. što se upiše na disk.
• log-slow-queries: Uključuje beleženje sporih upita. • innodb_flush_log_at_trx_commit=l
• port: Zadaje TCP priključak na kojem server osluškuje. Podrazumeva se Ako ovoj opciji zadate vrednost 1, to znači da se sadržaj dnevnika izmena iz
priključak broj 3306. bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponašanje.
• user: Zadaje ime korisničkog naloga pod kojim MySQL server treba da radi. Kada je ova opcija podešena na vrednost nula, dnevnik se upisuje i prenosi na
disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upi-
Tokom ovog poglavlja razmotrićemo još nekoliko drugih opcija, a to ćemo uraditi suju u dnevnik kad god potvrdite transakciju, ali se sadržaj bafera prazni i upisuje
i u poglavlju 17, "Optimizovanje MySQL Servera". na disk jedanput svake sekunde.Vrednosti o ili 2 poboljšavaju performanse, ali
verovatno ne treba da objašnjavamo koliko je to rizično.
Opcije za lnnoDB Postoje i druge konfiguracione opcije za InnoDB. Više informacija o tome naći
U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na ćeteu MySQL-ovoj dokumentaciji.
InnoDB. Komponentu InnoDB možete koristiti i ako ne zadate izričito vrednosti za
te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sle-
deće opcije:
Konfiguracione opcije za više instalacija
• innodb_data_file_path = ibdatal : lOM:autoextend na istom računaru
Ova opcija opisuje MySQL-u gde da smešta podatke kojima upravlja InnoDB. Često je korisno omogućiti da više MySQL servera radi na istom računaru. Na pri-
Za razliku od My ISAM tabela koje su smeštene svaka u svojoj datoteci, InnoDB mer, korisnici dobavljača Internet usluga mogu imate vlastite instalacije. Ovu odliku
tabele se čuvaju u deljenom prostoru za tabele, koji se može sastojati od jedne ili MySQL-a koristimo kada želimo da polaznicima kursa o MySQL-u omogućimo da
od više datoteka. U ovom primeru nalažemo MySQL-u da sve InnoDB podatke svako podešava svoj server.
smešta u istu datoteku čije je ime ibdatal, a početna veličina 10 MB automatski Za svaki server koji pokrećete morate zadati različite vrednosti sledećih opcija za
se povećava (u koracima od po 8 MB) kada se prostor za tabele popuni. mysqld:
Opšti format ove opcije je • port: Svaki server mora osluškivati na drugom TCP priključku.

imedatoteke : veličina [; imedatoteke:veličina; .. . ] [ :autoex- • socket: Na Unixu, svaki server mora koristiti drugu datoteku utičnice. Na
tend [:max: veličina]] Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server
Opcija autoextend omogućava da se veličina prostora za tabele povećava prema koristi. U oba slučaja, vrednost opcije socket mora biti različita za svaki server.
potrebama. Opcija max omogućava da zadate maksimalnu veličinu do koje dato- • shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti
teka može da naraste. drugi blok deljene memorije.
• innodb_buffer_pool_size=70M pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju
Ova opcija podešava veličinu bafera koji se koristi kao ostava za (keš) pri radu upisuje identifikator svog procesa (picl).
s podacima u InnoDB tabelama i indeksima . Kao i svaka druga ostava, što veća,
• Opcije za beleženje podataka u dnevnike izmena: Ako zadate vrednost bilo koje
to bolja- omogućava manje direktnih pristupa disku . Koliko ćete memorije
opcije koja se odnosi na datoteke dnevnika, za svaki server moraćctc da zadatl~
odvojiti za rezervu bafera zavisiće od toga da li na serveru ima i drugih aplikacija 1h 111-1i direktorij um za datoteke dnevnika.
i kmisnik.l, ali i ml količine memorijl' s kojo111 raspolažete.
1 14 Poglavlje 12 Podešavanje MyS UL-a

Jednostavan način da to postignete jeste da opciji basedir dodelite različitu vred- • Sintaksa datoteke počinje imenom programa između uglastih zagrada, Čl'lllll
nost za svaki server. Tako će direktorijumi data i datoteke dnevnika automatski biti slede opcije koje se odnose na taj program. Komentari počinju znakom ll. Sv.d.;,1
različiti. Toplo preporučujemo da svaki server ima svoj direktorijum data, tako izbe- opcija može se zadati u obliku opcija, opcija=vrednost, ili set-variabl
gavate razne neprijatnosti. opcija=vrednost.
Opcija --defaults-fileje veoma korisnajer omogućava da se svaki server • Listu svih opcija za program mysqld možete dobiti pomoću komande mysqlcl
pokrene s različitim skupom podrazumevanih vrednosti opcija (ili da se svaki server --help.
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija). • Više MySQL servera može raditi na istoj mašini u isto vreme, pod uslovom da
Važno je da zapamtite sledeće: kada na istom računaru radi više servera, klijentskim podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate
programima i drugim programima koji uspostavljaju veze sa serverom, kao što je mys- zadati različite brojeve TCP priključka, utičnica i datoteka dnevnika.
qladmin, morate zadati server s kojim treba da se povežu. U takvim situacijama može
• U datoteci opcija možete zadati podrazumevani skup znakova i jezičkih pravila
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
koja će važiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola .
kojoj ćete zadati odgovarajući broj TCP priključka- tako korisniku omogućavate da
Jezička pravila određuju redosled sortiranja.
automatski uspostavi vezu sa svojim serverom.

lnternacionalizovanje Pitanja
l. Opcija --no-defaults za mysqld znači
Postoje dve opcije za mysqld koje omogućavaju da se zada podrazumevani skup zna-
kova i jezičkih pravila. Skup znakova je skup simbola koji se može koristiti na serveru. a) ne važe podrazumevane vrednosti, već samo vrednosti zadate u datoteci
Jezička pravila određuju način na koji se parede nizovi znakova iz tog skupa- čime se opcija
određuje i redosled sortiranja- što zavisi od govornog jezika. b) ne učitavati ništa iz datoteka opcija
Podrazumevani skup znakova možete zadati pomoću opcije --default -charac- e) učitati vrednosti samo iz globalnih datoteka opcija
ter-set. Svakom skupu znakova pridružen je i podrazumevani skup jezičkih pravila, d) nijedno od prethodnih
ali možete zadati i neki drugi pomoću opcije --default-collation option. Ako
2. Opcija za Inn oD B koja podešava veličinu prostora za tabele je
kombinacija skupa znakova i skupa jezičkih pravila nije ispravna, mysqld će prikazati
a) innodb_buffer_pool_size
poruku o grešci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup b) innodb_data_file_path
jezičkih pravila latinl_swedish_ci. Taj skup znakova se takođe označava kao IS0- e) innodb_log_buffer_size
-8859-1 West European. Jezička pravila latinl_swedish_ci određuju redosled sor- d) nijedna od prethodnih
tiranja teksta na Švedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l. 3. Opcija za InnoDB koja podešava veličinu bafera za podatke je
(Možda niste znali da za reči napisane istim slovima važe različita pravila sortiranja u a) innodb_buffer_pool_size
različitim jezicima.) Postoje i jezička pravila koja se mogu pridružiti skupu znakova
b) innodb_data_file_path
latinl koja opisuju kako se sortira tekst na nemačkom, danskom i norveškom jeziku.
Više informacija o skupovima znakova koje MySQL podržava, naročito ako vas e) innodb_log_buffer_size
z~nima baš određeni skup, potražite u MySQL-ovoj dokumentaciji. d) nijedna od prethodnih
4. Kada više servera radi na istom računaru, nUe neophodno da sledeći elementi
budu odvojeni:
Sažetak
a) datoteke dnevnika
• MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
b) TCP priključci
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podržavaju upotrebu zajedničkih datoteka opcija. e) utičnice
• Opcije možete podesiti tako da važe na globalnom nivou, na nivou pojedinač­ d) klijentski programi
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.
~G Poglavlje 12 Podešavanje MySOL-a

S. Šta je od sledećeg tačno?


a) Jedan skup jezičkih pravila može se pridružiti samo jednom skupu znakova.
b) Jedan skup jezičkih pravila može se pridružiti svakom skupu znakova.
e) Jednom skupu znakova može se pridružiti samo jedan skup jezičkih pravila.
d) Nijedno od prethodnih.
1
Vežbe Administriranje baze podataka
Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj računar. Podesite sistem
tako da imate i tekuću i stariju verziju servera koje rade na istom fizičkom računaru
Pokušajte da uspostavite vezu sa obe verzije. .

Odgovori
Pitanja
u OVOM POGLAVLJU RAZMOTRIĆEMO uobičajeneposlove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata sledeće aktivnosti:
l. b • Pokretanje i spuštanje srevera
2. b • Prikazivanje podataka o serveru i bazama podataka na njemu
3. a • Podešavanje serverskih promenljivih
4. d • Uništavanje niti
S. a • Pražnjenje ostava
• Analiziranje tabela
U sledećem poglavlju • Pregledanje datoteka dnevnika izmena

U sledećem poglavlju, "Administriranje baze podataka", razmotrićemo uobičajene Mada prvenstveno objašnjava poslove koje treba da obavlja administrator baze
t svakodnevne poslove održavanja koje treba obavljati u MySQL-ovoj bazi podataka.
podataka, ovo poglavlje opisuje i jedan važan skript, mysqladmin, koji omogućava da
automatizujete neke od tih poslova.
Zadavanjem odgovarajućih parametara, skript mysqladmin se može upotrebiti za
obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja naći ćete
njihov spisak.
U ovom poglavlju razmotrićemo i upotrebu skriptova mysqlshow i mysqlcheck, te
SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.

Pokretanje i spuštanje MySQL servera


Kao što smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server ćete naj-
verovatnije podesiti tako da se automatski pokreće zajedno sa operativnim sistemom.
Međutim, postoje situacije u kojima ćete morati da spustite, pa da ponovo pokrenete
server jer je došlo do greške.
Već smo objasnili kako se pokreće MySQL server. Način na koji ćete to uraditi
zavisi od vašeg operativnog sistema, sadržaja standardnih putanja i opcija koje ste
izabrali kada ste instalirali MySQL server. Na Linuxu, server možete pokrenuti
pomoću komande

/t Lc/lnit ,d/ mysqld start


18 Poglavlje 13 Administriranje baze podataka III~UL.I.UIIJ'- f'i'"""" ... '-""''"'..,- ... ...,,._,_. -- ---.---------~

ali samo ako imate kopiju izvršne datoteke mysqld u direktorijumu koji se podrazu-
meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraćete da
zadate tačnu putanju. Više informacija o tome naći ćete u poglavlju l. Server možete
pokrenuti i pomoću skripta
safe_mysqld
Ovaj skript najpre pokušava da automatski odredi odgovar~uće opcije za pokre- 1'1-0Yidosn..,
~o ...
.......
........ toc•~
Locd~~Sys;t~

tanje MySQL-a, a zatim pokreće MySQL s tim opcijama.Ako skript nije na vašoj (alecb ..... ..
~'-·· '"""""'
Lout5o,ostem

podrazumevanoj putanji, moraćete da zadate celu putanju na kojoj se on nalazi.


Cohdtpe ...
,...,"..,.
NetWOik.S...

........ ,....
-.......
fnobiH• ... 51:•ted
Atltritvw:t ... 51:•ted Local~

Da biste na Linuxu spustili MySQL server, imate dve mogućnosti. Možete izdati loadJNe. ... St•ted
l'rl;wlcle$p . .• St•ted ............- "..,
Locals-,.tem
LCIUIISyod:em
komandu ........ """""-
Crut••···
Mlnoqei: • ...
5t•ted
....... Loct/Sysl:.-!1
LQ(also,stem
/etc/init.d/mysqld stop
ili
PnNidest ...
~t

ENbletrl ...
...
St•ttd .........
.........
.........
"""-
Net.-lo.S ...

,....
lCIUIISerw;•

....
"._
Lou!So,lt.,..

.....
Offeru- . ..
,
su..-.....
-- ........
~- "....

.....
5l•ted

mysqladmin -u root -p shutdown Sl4IPCIUI'i... ,....


Loul System
"._

Razume se, možete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
J~W~eoet:e ...
fNtllessu .. .
St•t..:l
....... Loul Sylt. .

,.... ,.,...
LouoiSeMc:e

loc.. s.r.t:e
~·-··..
uvek upotrebljiv. Nalozi pod kojima rade obični korisnici ne bi trebalo da imaju pravo Tr.:boy~.
.....
..... -...
5t•t..:l
.-
Lauls,.st. .
Loul~
LocdiiSytten~

spuštanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
način da pokrenete bilo koji servis jeste da otvorite Control Panel i pređete u Admini-
Slika 13.1 Prozor Services alatke Windows
strative Tools, Services. Ako izaberete servis MySQL,Windows će vam za njega ponuditi
Administrative Tools.
opcije Stop (spuštanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao što je
prikazano na slici 13.1. (Pošto je ovo ekranska slika iz Windowsa XP Professional, sadržaj
vašeg ekrana će se možda malo razlikovati, što zavisi od verzije operativnog sistema.) Kao i većinu skriptova koji se pokreću s komandne linije, skript mysqlshow možete
Server možete spustiti i pomoću skripta mysqladmin za Linux, na opisani način. pokrenuti s parametrom -u kojem sledi ime korisničkog naloga, i parametrom -p,
kojim se prosleđuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
Prikazivanje podataka o serveru i bazama podataka
prikazaćese lista svih opcija na raspolaganju.
na nJemu Jedna od njih omogućava da zadate ime baze podataka da biste prikazali podatke
Skript mysqlshow i SQL-ova komanda SHOW pružaju vam, kao administratoru, puno samo o određenoj bazi koja vas zanima. Na primer, ako ime baze podataka zadate u
informacija o onome što se odvija u bazama podataka i na samom serveru. sledećem obliku, prikazaće 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 para- Ako na kraj ovog reda dodate i parametar --status, dobićete detaljnije podatke
metara, na sledeći način: o tabelama. Isprobajte to na bazi podataka employee, na sledeći način:
mysqlshow mysqlshow -u imekorisnika --status employee

prikazaće se lista baza podataka u koje vam je dozvoljen pristup pod vašim tekućim Rezultati su malo teže čitljivi zbog dugačkih redova, ali se za svaku tabelu prika-
korisničkim nalogom. Rezultat je isti kao kada zada te zuju podaci o mašini za skladištenje podataka koja se koristi, količini podataka u tabeli,
tekućoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
show databases;
o skupu znakova koji važi za tabelu.
u programu mysql ili u nekom drugom korisničkom interfejsu.
l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'--· •- · - • ..,._"_,.._. .,,.,_. r----~---- ··-''l "'
l tlU

Podatke o bazi podataka i stanju servera možete pribaviti i pomoću SQL-ove Vrednosti većine serverskih promenljivih možete zadati u konfigur a<:tonoj datoteci,
komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre- na komandnoj liniji kada pokrećete server ili dinamički, unutar MySQL· ,t, ponto ć u
balo da već znate da izdate komande kon1ande SET. Podešavanje servera opisano je u poglavlju 12",Podešavanjc MyS(~J .t'',
a upotreba komande SET opisana je u nastavku ovog poglavlja.
show databases;

Prikazivanje podataka o procesima


show tables; Koji su sve procesi aktivni na serveru možete videti ako unutar MySQL-a izdate sle-
da biste prikazali podatke o bazama podataka i tabelama u njima. Međutim, komanda deću komandu:
SHOW ima veliki broj drugih opcija koje možete iskoristiti. show processlist;
Na primer, zadajte Prikazaće se podaci barem o upitu koji ste upravo poslali (show processlist).
show columns from ime_tabele; Iste podatke možete dobiti i s komandne linije, ako zadate
da biste dobili iste podatke kao pomoću komande DESC. Slično tome, možete zadati mysqladmin -u imekorisnika -p showprocesslist
show table status
da biste dobili iste podatke kao pomoću skripta mysqlshow --status.
Prikazivanje podataka o dodeljenim pravima
Koja su sve prava dodeljena određenom korisniku možete saznati pomoću sledeće
komande
Prikazivanje statusa servera i vredn..asti serverskih promenljivih
Da biste dobili podatke o !l!!rveru i načinu na koji radi, pogledajte status servera i vred- show grants for imekorisnika@imeračunara;
nosti serverskih promenljivih Rezultat je izražen u obliku komande GRANT pomoću koje možete zadati drugom
Da biste saznali kakav je tekući-sta~us MY_SQL-a, možete izdati komandu korisniku ista prava kao tekući korisnik. Na primer,
SHOW STATUS mysql> show grants for root@localhost;
unutar MySQL-a, ili komandu na mom sistemu daje sledeće rezultate:
mysqladmin -u imekorisnika -p -extended-status +--------------------------------------------------------------------+
na komandnoj liniji. l Grants for root@localhost l
+--------------------------------------------------------------------+
Time ćete dobiti veću količinu statističkih podataka o tome šta se sve događalo na l GRANT ALL PRIVILEGES ON* · * TO 'root'@'localhost' WITH GRANT OPTION!
serveru od trenutka pokretanja. Može vas zanimati da pogledate vrednosti svih pro- +--------------------------------------------------------------------+
menljivih čije ime počinje s com_*- na primer, promenljiva com_ select pokazuje l row in set (0.40 sec)
koliko je server izvršio komandi select. Možete se podsetiti i koja sve prava postoje ako zadate
Ovo su neke od najzanimljivijih vrednosti:
show privileges;
• threads_connected: Broj otvorenih i aktivnih veza između korisnika i servera.
Time ćete prikazati spisak svih prava koja postoje u sistemu.
• slow_queries: Ukupan broj upita koje je server izvršio i čije je izvršavanje trajalo
duže od granične vrednosti zadate u serverskoj promenljivoj long_query_time. Prikazivanje sistemskih podataka o tabelama
Ti upiti se beleže u dnevnik sporih upita (Slow Query Log). Sporim upitima Saznaćete koji se sve tipovi tabela mogu koristiti u sistemu ako zadate
bavićemo se više u poglavlju 19",0ptimizovanje upita".
show table types;
• uptime: Broj sekundi koji je protekao od trenutka pokretanja servera.
Ako vas zanima kako bi izgledala komanda create koja formira određenu tabelu
Da biste videli vrednosti serverskih promenljivih, možete izdati komandu koja postoji u sistemu, zadajte
show variables; show create table ime_tabele;
unutar MySQL-a, ili komandu Na primer, ako u bazi podataka employee zadate
mysqladmin -u imekorisnika -p variables show create table department;
na komandnoj liniji.
Uatoteke dnevnTk.t
182 Poglavlje 13 Administriranje baze podataka

Komanda RESET koristi se na isti način kao komanda FLUSH. Na primer, možete
dobićete sledeći rezultat:
zadati
CREATE TABLE 'department'
'departmentiD' int(ll) NOT NULL auto_increment, reset query cache;
•name' varchar(30) default NULL, Umesto da samo defragmentira ostavu za upite, ova komanda je prazni.
PRIMARY KEY ('departmentiD') Listu svih promenljivih na koje deluju komande FLUSH i RESET naći ćete u
TYPE=InnoDB CHARSET=latinl MySQL-ovoj dokumentaciji.
(Obratite pažnju na to da su, za svaki slučaj, imena ko~ona napisa~:. između polu-
navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada
smo napravili tabel u).
Datoteke dnevnika
MySQL održava više datoteka dnevnika koje mogu biti korisne. Budući da beleženje
u većinu tih datoteka dnevnika nije uključeno u standardnoj konfiguraciji servera,
Podešavanje serverskih promenljivih .. . . to ćete morati sami da učinite. Svaki dnevnik se aktivira pomoću opcije zadate na
Komanda SET omogućava da zadajete vrednosti serverskih promenljlVlh - koje ste komandnoj liniji pri pokretanju servera ili pomoću komande set.
mogli da vidite pomoću komande show variables. Sintaksa komande izgleda ovako: Možete održavati sledeće dnevnike:
set promenljiva=vrednost; • Dnevnik grešaka (engl. Error log): tu se beleže sve greške nastale pri radu servera.
Na primer, možete zadati: Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu
set sql_safe_updates=l; data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je
mysql. err. Možete je smestiti i u neki drugi direktorij um, koji morate navesti u
Time se uključuje bezbedno ažuriranje podataka (isto se postiže i ako na koman-
opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.
dnoj liniji zadate --i-am-a-dummy). v. . . .

Ovu komandu koristićemo često kada budemo dosh do opt1m1zovanp servera u • Dnevnik upita (engl. Query log): tu se beleže svi upiti koji se izvršavaju u sistemu.
poglavlju 17 ",Optimizovanje MySQL Servera". Ovaj dnevnik možete aktivirati i zadati direktorijum za njegovu datoteku
pomoću opcije log=imedatoteke.

• Dnevnik izmena (engl. Binary log): tu se beleže rezultati svih upita koji menjaju
Uništavanje niti . podatke. Ovaj dnevnik zamenjuje nekadašnji Update log, koji će ostati na raspo-
Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja laganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik
omogućava da vidite koje se sve niti izvršavaju na serveru. Između ostalog, komanda možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije
prikazuje i jedinstveni identifikator dodeljen svakoj niti. Ak~ za ~:~~ m.~ sum~jate da log-bin=imedatoteke.
je uzrok problema (na primer, upit koji s; izv.ršava "celu vecnos: ih klljentskl pro-
• Dnevnik sporih upita (engl. Slow query log): tu se beleže svi upiti čije izvršavanje
gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
traje duže od vremena zadat og u promenljivoj long_query_t ime. Ovaj dnevnik
kill id_procesa; možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije
log-slow-queries=imedatoteke
Pražnjenje ostava v . . • ,
Svi navedeni dnevnici, osim dnevnika izmena, obične su tekstualne datoteke.
MySQL koristi pri radu grupu internih ostava (kešova), koje m.ozete 1spra~mt1 pom~cu Sadržaj dnevnika izmena možete videti pomoću komande
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno mysqlbinlog logfile
izmenili sadržaj tabela prava, te izn1.ene će početi da važe u celom sistemu tek kad izdate
Upotrebu dnevnika sporih upita razmotrićemo u poglavlju 19.
komandu: Pošto veličina datoteka dnevnika raste, trebalo bi da ih ciklično zamenjujete dru -
flush privileges; gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
Druga česta upotreba komande FLUSHjeste pražnjenje bafera za upite: koji formira grupu datoteka za cikličnu upotrebu.
(lush query cache;
Time ćete defragmentirati bafer za upite, čime se poboljšavaju performanse.
R4 Poglavlje 13 Administriranje baze podataka

Ako koristite neki drugi operativni sistem, stare datoteke dnevnika možete ručno • Vrednosti serverskih promenljivih možete zadati pomoću konlalhh•
premestiti na bezbedno mesto a zatim naložiti MySQL-u da započne upisivanje u menlj iva=vrednost;.
novu datoteku dnevnika, pomoću sledeće komande • Listu aktivnih niti možete prikazati pomoću komande show proceoo l l t 1 1 11
mysqladmin flush-logs možete uništiti pomoću komande kill id_procesa.
• Ostave se prazne pomoću komandi FLUSH i RESET.
Opcije za skript mysqladmin • Brzinu upita u kojima se spajaju tabele možete povećati pomoću komandl" 111,
Za skript mysqladmin postoje mnogobrojne, manje ili više korisne opcije. lyze table ime_tabele; .
Neki poslovi, kao što je pravljenje i brisanje baza podataka, mogu se obaviti • MySQL beleži podatke u dnevnik grešaka, dnevnik upita (svi upiti), dnevnik
pomoću SQL-ovih komandi ili pomoću skripta mysqladmin:
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti čije izvršava liJI'
mysqladmin create databasename traje duže nego što je zadato upromenljivoj long_query_time).
mysqladmin drop databasename
Skript mysqladmin se često upotrebljava za prikazivanje podataka o serveru i Pitanja
njegovom. tekućem stanju. Podatak može biti bilo šta u opsegu od vrlo jednostavnog, 1. Koji su od sledećih dnevnika standardno aktivni?
npr. "Da li server radi?'' (ping), do nečeg znatno detaljnijeg, kao što je lista vrednosti a) dnevnik upita
serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta b) dnevnik sporih upita
mysqladmin za mnoge takve poslove.
e) dnevnik grešaka
Da biste saznali da li server uopšte radi, zadajte sledeće:
d) dnevnik izmena
mysqladmin ping
e) svi prethodni
Da biste saznali koja je verzija softvera za MySQL server instalirana na računaru,
2. SQL-ova komanda SHOW može se upotrebiti za prikazivanje
zadajte sledeće:
a) liste svih baza podataka na serveru
mysqladmin version
b) liste svih tabela u određenoj bazi podataka
Da biste prikazali kratak ili dugačak opis statusa servera, zadajte sledeće:
e) liste svih kolona u određenoj tabeli
mysqladmin status
d) svega prethodnog
mysqladmin extended-status
3. Skript mysqladmin može se upotrebiti za
Da biste prikazali listu aktivnih niti na serveru, zadajte sledeće:
a) učitavanje prava nakon izmena da bi se obezbedile da izmene počnu da
mysqladmin processlist
važe
Ako se prikaže lista procesa (niti), neželjene niti možete uništiti na sledeći način:
b) prikazivanje tekućeg statusa servera
mysqladmin kill idl,id2,id3 ... e) spuštanje i pokretanje servera
Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte sledeće: d) zatvaranje i ponovno otvaranje datoteka dnevnika
mysqladmin variables e) sve prethodno

Sažetak Vežbe
• Server se može pokrenuti pomoću skripta mysqladmin, pokretanjem izvršne Aktivirajte sva četiri dnevnika. Pošto izvršite više upita, pregledajte sadržaje dnevnika .
datoteke mysqld, ili pomoću Windowsove alatke Services manager. Ako nemate pristup većoj bazi podataka, možda nećete postići da se nešto upiše u
• Server se može spustiti pomoću komande mysql. server stop ili pomoću dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .
skripta mysqladmin shutdown .
• Komanda mysqlshow omogućava prikazivanje podataka o tekućoj bazi ili
o MySQL serveru .
186 Poglavlje 13 Administriranje baze podataka

Odgovori
Pitanja
l. e
2. d
3. e
Izrada rezervnih kopiJ
U sledećem poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objašnjavamo izradu
i obnavljanje podatak
rezervnih kopija baza podataka i šta treba uraditi kad nešto krene naopako.

u OVOM POGLAVLJU RAZMOTRIĆEMO


se one mogu preneti na drugi računar
KAKO SE prave kopije baze podataka, bko
i kako se podaci obnavljaju kada nešto krene
naopako.
Obradićemo sledeće teme:

• 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 ure-
đaju, morate praviti rezervne kopije datoteka baze podataka. To možete činiti i radi
replikovanja baze podataka ili prelaska na drugi računar.
Rezervnu kopiju MySQL-ove baze podataka možete napraviti na četiri načina:
• Pomoću skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj.
datoteku koja sadrži sve SQL komande koji su neophodne da biste obnovili
tekuće stanje baze podataka.
• Pomoću skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript
direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.
• Sami direktno napravite običnu kopiju datoteka s podacima. Time zapravo ručno
radite ono što skript mysqlhotcopy radi. Ako se opredeli te za ovu mogućnost,
moraćete da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da
zaključate tabele da biste obezbedili da podaci u njima ostanu međusobno uskla
đeni. Pošto skriptovi mysqldump i mysqlhotcopy prazne ostave i zaključavaj u
tabele umesto vas, oni su bezbednije rešenje .
• 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 1\..L\..1 VIlli l "VtJIJU t VVIIU"IJUIIJ'- t-'vuu .. uou.o ,.....,,,,._..._ _ _.._,, ..... .,_ ,,, , - , . - --..-

Objasnićemo redom sve navedene mogućnosti. hours float default NULL,


Ako je izrada rezervnih kopija od ključne važnosti, imajte u vidu da se za vreme tog PRIMARY KEY (clientiD,employeeiD,workdate)
TYPE=InnoDB CHARSET=latinl;
postupka korisnicima sprečava pristup podacima. Zbog čega? Da bi se napravila uskla-
đena kopija stanja baze podataka, baferi tabela moraju se isprazniti a tekući sadržaj Dumping data for table 'assignment'
tabela mora ostati nepromenjen dok traje kopiranje. To se može obezbediti zaključava­
njem tabela (u većini slučajeva) ili isključivanjem servera iz upotrebe (što se ne prepo-
ručuje), ali u oba slučaja pristup bazi podataka neće biti moguć dok traje izrada kopije /*!40000 ALTER TABLE assignment DISABLE KEYS */;
LOCK TABLES assignment WRITE;
podataka.
INSERT INTO assignment VALUES (1,7513, '0000-00-00' ,5), (1,7513, '2003-
Jedno rešenje problema jeste replikovanje. Jedan od zavisnih servera možete isključiti -01-20' ,8.5);
iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju UNLOCK TABLES;
svoje uobičajene poslove. Replikovanje ćemo razmotriti u poglavlju 16",Replikovanje /*!40000 ALTER TABLE assignment ENABLE KEYS */;
baze podataka".

Table structure for table 'client'


Izrada rezervnih kopija i obnavljanje podataka
pomoću skripta mysqldump
Najuobičajeniji način izrade rezervnih kopija baze podataka jeste pomoću skripta DROP TABLE IF EXISTS client;
mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu CREATE TABLE client (
s MySQL serverom i formira datoteku slike stanja, koja sadrži sve SQL komande clientiD int(ll) NOT NULL auto_increment,
name varchar(40) default NULL,
potrebne za rekonstruisanje tekućeg stanja baze podataka. address varchar(lOO) default NULL,
Tipičan primer upotrebe ovog skripta izgledao bi ovako contactPerson varchar(80) default NULL,
mysqldump --opt -u imekorisnika -p lozinka employee > backup.sql contactNumber varchar(12) default NULL,
PRIMARY KEY (clientiD)
U ovom primeru zadali smo samo opciju--opt; ona grupiše nekoliko drugih TYPE=InnoDB CHARSET=latinl;
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, dobićete rezultu- Dumping data for table 'client'
juću datoteku čiji će sadržaj biti nalik na listing 14.1.

/*!40000 ALTER TABLE client DISABLE KEYS */;


Listing 14.1 Primer rezultata skripta mysqldump LOCK TABLES client WRITE;
MySQL dump 10.2 INSERT INTO client
VALUES
Host: localhost Database: employee (1, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', '95551234'),
(2, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', '95559876');
Server version 4.1.0-alpha-max-debug UNLOCK TABLES;
/*!40000 ALTER TABLE client ENABLE KEYS */;

Table structure for table 'assignment'


Table structure for table 'department'

DROP TABLE IF EXISTS assignment;


CREATE TABLE assignment ( DROP TABLE IF EXISTS department;
clientiD int(ll) NOT NULL default '0', CREATE TABLE department (
employeeiD int(ll) NOT NULL default '0', departmentiD int(ll) NOT NULL auto_increment,
workdate date NOT NULL default '0000-00-00', 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 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',


Dumping data for table 'department' skill varchar(l5) NOT NULL default
PRIMARY KEY (employeeiD,skill)
TYPE=InnoDB CHARSET=latinl;
/*!40000 ALTER TABLE department DISABLE KEYS */;
LOCK TABLES department WRITE;
INSERT INTO department Dumping data for table 'employeeSkills'
VALUES
(42, 'Finance'),
(128, 'Research and Development'), /*!40000 ALTER TABLE employeeSkills DISABLE KEYS */;
(129, 'Human Resources'), LOCK TABLES employeeSkills WRITE;
(130, 'Marketing'), INSERT INTO employeeSkills
(131, 'Property Services'); VALUES
UNLOCK TABLES; (6651, 'Java'),
/*!40000 ALTER TABLE department ENABLE KEYS */; (6651, 'VB'),
(7513, 'C'),
(7513, 'Java'),
Table structure for table 'employee' (7513, 'Perl'),
(9006, 'Linux'),
(9006, 'NT'),
DROP TABLE IF EXISTS employee; (9842, 'DB2');
CREATE TABLE employee ( UNLOCK TABLES;
employeeiD int(ll) NOT NULL auto_increment, /*!40000 ALTER TABLE employeeSkills ENABLE KEYS */;
name varchar(80) default NULL,
job varchar(30) default NULL, Bazu podataka employee možete da rekonstruišete na drugom računaru ako uradite
departmentiD int(ll) NOT NULL default '0',
sledeće:
PRIMARY KEY (employeeiD)
TYPE=InnoDB CHARSET=latinl; l. Napravite bazu podataka sa odgovarajućim imenom na ciljnom računaru.
2. Učitate ovu datoteku pomoću komande
mysql -u imekorisnika -p < backup.sql
Dumping data for table 'employee'
Skript mysqldump ima više opcija koje možete upotrebiti. U ovom slučaju zadali
smo --opt, koja grupiše sledeće opcije:
/*!40000 ALTER TABLE employee DISABLE KEYS */;
LOCK TABLES employee WRITE; • --quick: Nalaže MySQL-u da podatke upisuje direktno u datoteku, umesto da
INSERT INTO employee ih prethodno upiše u memorijski bafer (što je standardni način rada).Time se
VALUES postupak kopiranja ubrzava.
(6651, 'Ajay Patel', 'Programmer',128),
• --add-drop-table: Nalaže MySQL-u da ispred svake komande CREATE TABLE
(7513, 'Nora Edwards', 'Programmer',128),
(9006, 'Candy Burnett', 'Systems Administrator',128), u rezultujućoj datoteci doda komandu DROP TABLE. (To vidite u listingu 14.1.)
(9842, 'Ben Smith', 'OBA' ,42), • --add-locks: Dodaje komande LOCK TABLES i UNLOCK TABLES koje se poja-
(9843, 'Fred Smith', 'OBA' ,131); vljuju u rezultujućoj datoteci.
UNLOCK TABLES;
/•140000 ALTER TABLE employee ENABLE KEYS */; • --extended- insert: Nalaže MySQL-u da koristi sintaksni oblik s više redova da
bijednom komandom INSERT uneo više zapisa u tabelu. Na primer, u listingu to
izgleda ovako:
Table structure for table 'employeeSkills' INSERT INTO employeeSkills
VALUES
(6651, 'Java'),
DROP TABLE IF EXISTS employeeSkills; (6651, ' VB'),
CHF.ATE TABLE employeeSkills ( (7513,'C'),
J t'OglaVIJe '14 Izraela rezervn1n kopiJa 1oonaviJanJe podataka IL.IUUU 1'-L.'-1 or ooooo '"""I"''J..,. o."..,..,,_,.,)-'')- r - - - o o - · · - r--.-·---·.--...... . - - - - -

Ako vam zatreba da pomoću ove datoteke ponovo formirate bazu podataka i njen Ovaj skript se pokreće na sledeći način:
sadržaj, postupak će biti brži nego kada zadate niz pojedinačnih komandi INSERT. mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum
• --lock-tables: Nalaže MySQL-u da zaključa sve tabele pre nego što započne
Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn
izradu datoteke slike stanja. je sigurno da negde imate i izvršnu datoteku perl. Ukoliko imate Windows, morale
Imajte u vidu da opcija --opt (koja znači optimizovati) optimizuje vreme potrebno instalirati Perl da biste mogli da koristite ovaj skript. Ako ga još nemate, možete p rl'
za rekonstruisanje baze podataka pomoću datoteke slike, a ne vreme potrebno za izradu same uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState:
datoteke slike. Postupak izrade datoteke slike može biti prilično spor. www.activestate.com/Products/ActivePerl
Evo još nekoliko korisnih opcija:
Datoteke koje pravi skript mysqlhotcopy identične su kopije datoteka baze poda
• --databases: Omogućava da zadate više odjedne baze podataka čije slike stanja taka. Da biste mogli da upotrebite te kopije za restauriranje baze podataka, morate
želite da napravite. spustiti MySQL server i zameniti tim kopijama datoteke u MySQL-ovom direkto-
• --all-databases: Nalaže MySQL-u da napravi slike stanja svih baza podataka rijumu data.
na serveru.
• --allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervi- Ručna izrada rezervnih kopija i obnavljanje podataka
sane reči MySQL-a (ili onima koje u budućnosti mogu postati rezervisane reči), Umesto skripta mysqlhotcopy, možete i sami ručno uraditi sve što taj skript radi. To
ova opcija nalaže MySQL-u da svakom imenu kolone pridruži i ime tabele kojoj podrazumeva pražnjenje bafera, zaključavanje tabela i kopiranje datoteka s podacima
kolona pripada. u odredišni direktorij um, pri čemu tabele moraju biti zaključane.
• -d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog To znači da morate otvoriti novu sesiju na MySQL serveru. Možete najpre izdati
sadržaja. To je veoma korisno kada testirate baze podataka ili ih instalirate na komandu LOCK TABLES da biste zaključali sve tabele za koje nameravate da napravite
druge računare. rezervne kopije:
lock tables
Prednosti skripta mysqldump jesu u tome što se jednostavno upotrebljava i auto-
employee read,
matski rešava problem zaključavanja tabela umesto vas. department read,
Međutim, ima i nekoliko nedostataka. Prvi je to što skript zaključava tabele: kada client read,
skript pokrenete na serveru, korisnicima sprečavate pristup tokom više sekundi ili čak assignment read,
minuta, što zavisi od veličine tabela. Ako planirate izradu slike stanja na serveru koji se employeeSkills read;
ne replikuje, trebalo bi da pokušate da taj postupak obavite u vreme manje optereće­ Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju posta-
nosti sistema da ne biste previše ometali korisnike. Ako u svako doba dana imate velike vljate, READ ili WRITE. Za izradu rezervnih kopija obično je dovoljna blokada tipa
količine podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi način READ. To znači da druge niti (otvorene veze sa serverom) mogu neometano da čitaju
izrade rezervnih kopija. tabele ali ne mogu ništa da menjaju u njima dok traje postupak kopiranja.
Drugi nedostatak je sledeća činjenica: pošto skript mysqldump za svoj rad koristi Zaključavanje tabela je važno u ovakvim situacijama jer kopiranje može da potraje
MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript prilično dugo. U našem primeru baze podataka employee, bilo bi veoma nezgodno da
mysqlhotcopy ne zavisi mnogo od MySQL servera, već se pri svom radu obraća nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbriše
direktno sistemu datoteka na računaru. sve zaposlene iz neke službe, a zatim izbriše i samu službu. Rezultat bi bio neusklađena
kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojećoj službi.
Izrada rezervne kopije i obnavljanje baze podataka Sledeći korak je izdavanje komande FLUSH TABLES:
pomoću skripta mysqlhotcopy flush tables;
Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome što direktno kopira
Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak možete
datoteke baze podataka, umesto da učitava podatke preko veze koju uspostavi sa serve-
kombinovati s prethodnim pomoću sledeće komande:
rom. On se povezuje sa serverom da bi ispraznio bafere tabela i zaključao tabele, ali
budući da komunicira sa sistemom datoteka na računaru i ne izvršava upite na serveru, flush tables with read lock;
trebalo bi da bude nešto brži od skripta mysqldump. Sada možete započeti kopiranje datoteka s podacima.Veoma je važno da vaša sesija
(u kojoj ste zaključali tabele i ispraznili njihove bafere) ostane otvorena tokom celog
I!J4 PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka O O-' -•- O -·-·- ··.-e...._.....,_____

postupka jer će tako blokade koje ste postavili biti održane. Kada zatvorite tu sesiju, Korisno je da pregledate tu listu pre nego što ponovo izvršite upite ev1dclllll.lll
tabele će biti oslobođene. u dnevniku jer neke među njima možda nećete žele ti da izvršite. Moguće je d.1 \l
Kada završite kopiranje, trebalo bi da oslobodite tabele: zbog loše osmišljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H
unlock tables; kopije.
Opisani postupak je ono što radi skript mysqlhotcopy, a podatke možete obnoviti Na primer, imali smo slučaj da je program er zadao upit nalik na sledeći
iz kopija na isti način kao da ste kopije napravili pomoću tog skripta. update user set password='password';
Jasno je da kada obnavljate tabelu, ne biste želeli da se ovakav upit ponovo izvrši
Izrada rezervni h kop ija i ob navljanj e podataka pomoću komandi i da lozinka svakog korisnika sistema ponovo bude password!
BACKU P TABLE i RESTORE TABLE
Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat
možete postići i pomoću dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE. Testiranje rezervne kopije
Te komande deluju samo na tabele tipa MyiSAM. Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je važno da je
Rezervnu kopiju MyiSAM tabele možete napraviti na sledeći način: testirate ili, tačnije rečeno, da ispitate njenu upotrebljivost za obnavljanje podataka.
Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju
backup table tl to 'putanja/do/kopije';
da li bi iz tih kopija mogli da restauriraju podatke ako zatreba.
Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u Postupak izrade rezervne kopije morate pažljivo razmotriti kada analizirate rizike
sledećem primeru: ' i odlučujete o tome šta ćete raditi. Gde ćete tačno smestiti datoteke rezervnih kopija
backup table tl to 'c:/putanja/do/kopije'; da bi bile na drugom fizičkom disku? Kako ćete obezbediti da rezervna kopija ostane
Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM neoštećena na udaljenoj lokaciji gde je čuvate? Ako donesete odgovarajuće odluke

tabela. Tabela se automatski zaključava tako da bude dozvoljeno samo čitanje i pravi se na osnovu ovih pitanja i počnete da pravite rezervne kopije u redovnim vremenskim
njena kopija. razmacima, nema razloga da brinete da li će te kopije biti upotrebljive. Ukoliko resta-
Možete zadati i listu imena tabela razdvojenih zarezima; međutim, u tom slučaju se urirate bazu podataka kao vežbu, možete otkriti eventualne probleme pre nego što
tabele zaključavaju i kopiraju jedna za drugom.Ako želite da podaci u svim navedenim postanu nerešivi.
tabelama budu međusobno usklađeni, izdajte najpre komandu LOCK TABLES (pogle- Izuzetno važan element pri instaliranju MySQL-a, kao i za postupak obnavljanja
dajte prethodni odeljak, "Ručna izrada rezervnih kopija i obnavljanje podataka") . podataka, jeste da uključite beleženje izmena u dnevnik izmena. Taj dnevnik stan-
Da biste iz rezervne kopije obnovili tabelu, izdajte sledeću komandu: dardno nije aktivan, ali je neophodan za dovođenje res ta urirane baze podataka u
poslednje ispravno stanje.
restore table tl from 'c:/tmp';
Rezultat će biti uspešan samo ako tabele koje obnavljate ne postoje u tekućoj bazi
podataka. Ako već imate tabel u sa istim imenom, morate je prethodno izbrisati Proveravanje i popravljanje tabela
komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE. Proveravanje da li su tabele oštećene, deo je standardnog postupka održavanja tabela
Komanda RESTORE takođe deluje samo na MyiSAM tabele. a deo je i postupka restauriranja baze nakon katastrofalne greške, na primer, u slučaju
prekida napajanja računara .
Restauriranje podataka iz dnevnika izmena U MySQL-u postoje tri načina da proverite ispravnost tabela: pomoću komande
l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo često se dešava da korisici CHECK TABLE, pomoću skripta myisamchk (ili isamchk) i pomoću skripta mysql-
dodaju nove podatke i ažuriraju postojeće nakon izrade poslednje rezervne kopije. check.Tabele u kojima otkrijete problem možete popraviti pomoću komande REPAIR
U tom slučaju se stanje baze podataka može restaurirati iz rezervnih kopija na jedan TABLE ili takođe pomoću skripta myisamchk (ili isamchk) ili mysqlcheck.
od na čina opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve Kada razmatrate koju ćete mogućnost primeniti, trebalo bi da imate u vidu sledećih
i;-mene načinjene nakon izrade rezervne kopije. nekoliko činjenica. Komande CHECK i REPAIR možete izdati iz samog MySQL-a, dok sc
Tc izmene se čuvaju u dnevniku izmena (engl. binary log), što ga čini izuzetno druge mogućnosti mogu primeniti samo s komandne linije. Komande CHECK i REPAIR
va7n im . Listu izvršenih operacija možete u čitati iz dnevnika izme na pomoću komande deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele,
mysqlbinlog logfile > updates.sql 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. Program myisamchk izuzetno je koristan i izvući će vas iz neprilika u koje ste
Bolje je da spustite server pre nego što pokrenete jedan od tih skriptova, ali ako je možda upali. Za program myisamchk takođe važi da se ne sme pokrenuti dok se server
neophodno, možete i zaključati tabele. Ako te skriptove pokrenete za tabele s kojima još koristi. Bezbednije je da ga spustite.
u isto vreme možda rade druge MySQL-ove niti, podaci se mogu oštetiti. Komande Najjednostavniji način da pokrenete myisamchkjeste da na komandnoj liniji
CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele otkucate l
se koriste. myisamchk tabela
Razmotrićemo redom navedene alatke. Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smeštena
MyiSAM tabela.
Proveravanje i popravljanje tabela pomoću komandi CHECK i REPAIR Ovaj program prikazuje podatke o praktično svim mogućim greškama do kojih
Ispravnost tabele možete proveriti pomoću komande CHECK TABLE, kao u ovom može doći.Ako vam se čini da ne uspeva da reši vaš problem, pokušajte da ga pokrenete
primeru: sa opcijom -m. Standardno ponašanje je da progran1 ispituje da li su indeksi oštećeni;
check table department; kada zadate ovu opciju, ispituju se i redovi tabele.
Komanda CHECK TABLE deluje i na MyiSAM i na InnoDB tabele. Alatka myisamchk omogućava i ispravljanje otkrivenih grešaka. Tako se može ispra-
Trebalo bi da dobijete rezultat nalik na sledeći (ako je sve u redu): viti velika većina grešaka do kojih dolazi u MyiSAM tabelama. Program myisamchk
možete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u sledećem primeru:
+---------------------+-------+----------+----------+
l Table l Op Msg_type Msg_text l l l
myisamchk -q -r tabela
+---------------------+-------+----------+----------+ Ako je rezultat neuspešan, napravite rezervnu kopiju datoteke s podacima a zatim
l employee.department l check l status l OK
pokušajte potpuno obnavljanje tabele:
+---------------------+-------+----------+----------+
l row in set (0.00 sec) myisamchk -r tabela
Može se pojaviti i poruka Table is already up to date, koja takođe znači da je Ako i to bude bezuspešno, pokušajte opciju --s af e- recover, koja ispravlja neke
sve u redu. greške koje opcija -r ne može da ispravi:
Ako se pojavi bilo kakva drugačija poruka, to znači da imate problem pa pokušajte myisamchk --safe-recover tabela
da popravite tabel u. To možete učiniti pomoću komande REPAIR TABLE (ako je u
Program myisamchk ima veliki broj mogućih opcija, koje ćete videti ako na
pitanju MyiSAM tabela) na sledeći način:
komandnoj liniji otkucate myisamchk bez parametara.
repair table tl;
Ako se postupak popravljanja završi uspešno (ili ako popravljanje zapravo nije ni Proveravanje i popravljanje tabela pomoću alatke mysqlcheck
bilo poptrebno), trebalo bi da dobijete rezultat nalik na sledeći: Program mysqlcheck može se upotrebiti za proveravanje i popravljanje MyiSAM
+---------+--------+----------+----------+ i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi.
l Table l Op Msg_type Msg_text
l l l Da biste pomoću alatke mysqlcheck proverili tabele baze podataka, pokrenite je
+- --------+--------+----------+----------+ kao u sledećem primeru:
test.tl l repair l status l OK
mysqlcheck -u imekorisnika -p employee
l -- ------+--------+----------+----------+
l row in set (0.03 sec) Iza ovih parametara možete navesti imena tabela koje želite da proverite, ali ako
Ako se pojavi poruka drugačija od OK, komanda REPAIR nije delovala i morate da ništa ne zada te, biće proverene sve tabele u bazi podataka (što je korisna odlika). Ako
upotrebite moćniju alatku myisamchk. se sve završi bez grešaka, trebalo bi da dobijete rezultate nalik na sledeće:
employee.assignment OK
Proveravanje i popravljanje tabela pomoću alatke myisamchk employee.client OK
U ovom poglavlju razmotrićemo samo alatku myisamchk a zanemarićemo alatku employee.department OK
employee.employee OK
isamchk. Ako još radite sa ISAM tabelama, predlažemo da ih pretvorite u My ISAM employee.employeeSkills OK
tabele (videti poglavlje 9",Tipovi tabela u MySQL-u").
8 Poglavlje 14 Izrada rezervn1n KOpija 1 ounaviJčHIJt: flUUCILCIII.d
U ~II::Ut:l:t:m poglaVlJU l'

Opcijom --databases možete zadati listu baza podataka koje treba proveriti, 2. Trebalo bi da ručno zaključate tabele pre nego što
a opcija --all-databases čini da se proveravaju sve baze podataka na serveru. a) započnete ručnu izradu rezervne kopije
Programu mysqlcheck možete zadati opciju -r da bi popravio sve oštećene
b) pokrenete skript mysqldump
MyiSAM tabele na koje iđe.
e) pokrenete skript mysqlhotcopy t' J
d) nijedno od prethodnog
Sažetak 3. Koji se tipovi tabela mogu proveravati pomoću komande CHECK
TABLE?
a) InnoDB i MyiSAM
Izrada rezervnih kopija
b) samo MyiSAM
• mysqldump pravi datoteku slike stanja koja sadrži SQL komande.
e) MyiSAM i BDB
• mysqlhotcopy kopira datoteke baze podataka u odredišni direktorijum.
d) InnoDB i BDB
• BACKUP TABLE kopira datoteku tabele u odredišni direktorijum.
4. Koji se tipovi tabela mogu popravljati pomoću komande REPAIR TABLE?
• Rezervne kopije možete napraviti i ručno, tako što zaključate tabele, ispraznite
a) InnoDB i MyiSAM
njihove bafere a zatim napravite kopije datoteka baze podataka.
b) samo MyiSAM
Restauriranje podataka e) MyiSAM i BDB
• Izvršite komande iz datoteke slike stanja napravljene pomoću skripta mysqldump. d) InnoDB i BDB
• Vratite kopije datoteka koje ste napravili pomoću skripta mysqlhotcopy ili 5. Ako je rezultat komande CHECK TABLE poruka Table is already up
to date
ručno. a) morate upotrebiti komandu REPAIR TABLE
• Pomoću komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili b) komanda CHECK TABLE ne podržava mašinu baze podataka
komandom BACKUP TABLE. e) tabela je dobra
• Ponovo izvršite sve operacije evidentirane u dnevniku izmena nakon izrade d) nijedno od prethodnog
poslednje rezervne kopije.

Proveravanje i popravljanje tabela Vežbe


• Proverite stanje tabela pomoću komandi CHECK TABLE ili skriptova myisamchk, Napravite rezervnu kopiju ~voje baze podataka primenom svih metoda opisanih u
isamchk ili mysqlcheck. ovom poglavlju. RestaunraJte bazu podataka iz svake kopije koju ste napravili.
• Popravite tabele pomoću komande REPAIR TABLE ili skriptova myisamchk,
isamchk ili mysqlcheck. Odgovori
• Nemojte pokretati skript myisamchk dok se server koristi.
Pitanja
1. b
Pitanja
2. a
l. Ako želite da napravite rezervnu kopiju baze podataka, morate prethodno
3. a
a) spustiti server
4. b
b) zaključati tabele i isprazniti njihove bafere
5. e
e) i a) i b)
d) nijedno od prethodnog
U sledećem poglavlju
U sledećem poglavlju",Zaštita MySQL servera", saznaćete kako da izbegnete najčešće
bezbednosne propuste.
15
Zaštita MySQL servera

U OVOM POGLAVLJU razmatraćemo opšte probleme zaštite o kojima bi trebalo da


vodite računa kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se
objasne i najsitniji detalji, prilažemo spisak najvažnijih preporuka o tome šta ne treba
raditi. Obradićemo sledeće teme:
• Kako sistem prava korisnika deluje u praksi
• Zaštita korisničkih naloga
• Zaštita 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 korisničkih
naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo
poglavlje počinjemo opisom načina na koji MySQL server primenjuje prava koja
dodelite korisnicima.
Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL
utvrđuje da Ji je korisniku uopšte dozvoljeno da uspostavlja veze sa servera m. Tome
služi tabela user u bazi podataka mysql. MySQL traži u toj tabeli red koji sadrži kori-
sničko ime i lozinku koje ste zadali te ime računara s kojeg pokušavate da se povežete
sa serverom. Ako ne nađe odgovarajući red, neće vam dozvoliti da uspostavite vezu.
Budući da kolona host tabele user prihvata i džokerske znake, kombinacija kori-
sničko ime/ime računara može se nalaziti u više redova te tabele. MySQL određuje
koji je red najvažniji za utvrđivanje identiteta tako što prvo ispituje redove koji sadrže
konkretna imena računara. Na primer, ako tabela sadrži red za korisnika test koji se
prijavljuje s računara localhost i red za korisnika test koji u koloni host sadrži % (što
znači bilo koji računar), MySQL uzima u obzir red koji sadrži ime računara localhost.
202 Poglavlje 15 Zaštita MySQL servera Zaštita instaliranih datoteka

Imajte u vidu da dva reda mogu sadržati različite lozinke. To može biti uzrok velike redove u tabeli user. Tamo će naći kombinacije laura®% i (anonymous) ®localhost.
zabune. (Primer takve situacije pogledaćemo u odeljku "Brisanje anonimnih naloga", Budući da MySQL daje prvenstvo redovima koji sadrže konkretna imena računara,

u nastavku ovog poglavlja.) uzima red (anonymous) ®localhost. Kao što vidite, iako je laura navela svoje kori-
Drugi korak se odvija kada pokušate da izvršite određene upite ili komande. Pre sničko ime, u ovom slučaju ono ne služi ničemu! Za anonimne naloge nije potrebno

izvršenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno zadati korisničko ime. Anonimni nalog verovatno ima drugačiju lozinku od naloga
izvršavanje upita koji ste poslali. korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako
Ako je za upit koji pokušavate da izvršite potrebno globalno pravo - npr. kao za prijavljuje ne mora da zada lozinku).To znači da će laura, kada pokuša da se pod svo-
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr- jim korisničkim imenom i lozinkom prijavi s računara localhost, dobiti poruku
Šavanju upita u određenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik Access Denied (pristup nije dozvoljen) bez očiglednog razloga.
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to Najbolji način da izbegnete tu vrstu problema jeste da izbrišete anonimne naloge
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju i zaboravite da oni uopšte postoje.
se utvrđuje da li možda ima pravo pristupanja određenim tabelama i kolonama.
Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, što je opisano u poglavlju ll.
Zaštita korisničkih naloga Morate vrlo pažljivo razmotriti kome ćete dodeliti neka od tih prava. Budite veoma
Postoji nekoliko opštih bezbednosnih principa koji važe i za upravljanje korisničkim oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
nalozima na MySQL serveru. Razmotrićemo ih u narednom odeljku. Pravo FILE omogućava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda može se zloupotrebi ti za menjanje sadržaja datoteka na serveru (kao što je
Zadavanje lozinke za korisnički nalog Root datoteka za lozinke, /etc/passwd) ili čak za menjanje datoteka baza podataka, čime se
Kada završite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte zaobilazi sistem prava pristupa.
lozinku za tog korisnika pre nego što počnete da koristite MySQL za bilo šta drugo Pravo PROCESS omogućava korisnicima da izdaju komandu SHOW PROCESSLIST.
osim isključivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako Tako u svakom trenutku mogu videti koji se sve upiti izvršavaju, što im omogućava da
se može prijaviti na vaš server i raditi s vašim podacima šta god požcli.To gotovo nikad dođu do poverljivih podataka o drugim korisnicima.
nije prihvatljiva situacija. Ako još niste zadali lozinku, učinite to odmah. Pravo WITH GRANT OPTION omogućava korisnicima da svoja prava dodeljuju dru-
gim korisnicima. Ako znate kakve mogu biti posledice tog prava, možete ga oprezno
Brisanje anonimnih naloga dodeljivati drugima.
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 Šifrovanje lozinki
anonimna, odnosno predstavljaju nalog koji vam se dodeljuje kada ne zadate svoje MySQL čuva lozinke korisnika u šifrovano m obliku. Pre verzije 4.1, mogli ste pri pri-
korisničko ime. Ime jednog naloga je localhost a drugo je %(predstavlja bilo koji javljivanju na server da zadate i šifrovani oblik lozinke.To je sada ispravljeno i ugrađena
računar, što omogućava uspostavljanje veza sa udaljenih računara). Ti nalozi stan- je jača zaštita lozinki i mehanizma prijavljivanja.
dardno nemaju lozinke. Ako pišete aplikaciju koja skladišti imena i lozinke svojih korisnika (ne korisnika
Verovatno ste već shvatili zbog čega, ali ipak izričito preporučujemo da izbrišete te MySQL-a), nemojte ih šifrovati pomoću funkcije PASSWORD ().Umesto nje, prepo-
naloge. To možete uraditi na sledeći način: ručujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objašnjene u pogla-

delete from user where User=''; vlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT".
delete from db where User='';
Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispra-
Zaštita instaliranih datoteka
znili tabele prava. Osim zaštite MySQL-ovih korisničkih naloga, morate kontrolisati i pristup MySQL-
Drugi razlog za brisanje tih naloga jeste to što mogu izazvati zbrku kada regularan
-ovim binarnim datotekama, skriptovima i datotekama s podacima. Navešćemo neko
korisnik pokuša da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili
liko preporuka koje možete primeniti na svoj sistem.
nalog čije je ime laura i koji sme da se prijavljuje s bilo kojeg računara(%); kada
1 ura pokuša da se prijavi s računara localhost, MySQL server traži odgovarajuće
Drugi savet l :ICI
Poglavlje 15 Zaštita MySQL servera

Nemojte pokretati mysqld pod nalogom Root . . Drugi saveti


Ovo se preporučuje na Linuxu i drugim operativnim sistemima srodrum sa Umxo~1. Razmotrili smo sistem prava pristupa, obradili korisničke naloge, opisali datoteke u
Nemojte pasti u iskušenje da pokrenete MySQL server (program mysqld) pod .kon_- sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zaštita
sničkim nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce vaše mreže (što bi verovatno trebalo da vas brine čim imate bilo kakvu vezu sa spolj-
raditi samo MySQL server. Tako ćete ograničiti prava pristupa koja će MySQL server nim svetom), MySQL omogućava da se prenošenje podataka zaštiti pomoću protokola
imati u sistemu datoteka. SSL. Trebalo bi da razmotrite i fizičku zaštitu uređaja.

Pristup datotekama i prava upotrebe u operativnom sistemu Upotreba SSL veza


Nema svrhe da trošite vreme na pravilno podešavanje prava korisničkih naloga za pristup Ako želite da sprečite da neko zlonameran "njuška" pakete podataka koje razmenjuju
MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu. N~ophodno MySQL server i klijenti, podesite MySQL za uspostavljanje zaštićenih veza pomoću
je da korisnicima ograničite p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a protokola SSL (Secure Sockets Layer).
naročito direktorij umu data. Cest bezbednosni propust je da se nekom konsruku dozvoh Da biste mogli da koristite SSL, treba da instalirate biblioteku OpenSSL (na raspo-
pristup računaru na kojem radi MySQL server, ali ne i, na primer, bazama podat~a dr.u- laganju je na www. openssl. org), pokrenete server sa opcijama --with-vio i --with-
gih korisnika. Ako taj korisnik ima pristup u direktorijum data, može da naprav1 koplje ssl i obavite određena podešavanja na komandnoj liniji. Dobar primer skripta koji
datoteka s podacima i da ih otvori na nekom drugom MySQL serveru. obavlja potrebne operacije nalazi se u MySQL-ovoj dokumentaciji; ovde ga nismo
Trebalo bi da uvek preduzimate sledeće opšte bezbednosne mere: reprodukovali.
• Samo ovlašćeni i pouzdani korisnici treba da imaju pravo da pokreću mysqld. To Pošto obavite neophodna podešavanja, pomoću komande GRANT zahtevajte da se
pravo možete dodeliti jedino korisničkom nalogu koji ste napravili isključivo za korisnici prijavljuju putem SSL veza ili da imaju odgovarajuće sertifikate. Evo jedno-
stavnog primera upotrebe komande GRANT:
mysqld .
• Samo ovlašćeni i pouzdani korisnici treba da imaju pristup MySQL-ovim pridru- grant all on employee.*
ženim programima i skriptovima, kao što su, na primer, mysqladmin, mysqldump to testuser identified by 'password'
require ssl;
i mysqlhotcopy. Najbolje je da o tome odlučujete od programa do programa.
Ova komanda pravi (ili menja) korisnički nalog testuser, čija je lozinka pass-
• Samo ovlašćeni i pouzdani korisnici treba da imaju pristup u MySQL-ov direk-
word. Taj korisnik može da se prijavljuje na server samo putem SSL veza. Možete
torijum data. Ako server radi pod korisničkim nalogom mysql, tom nalogu je
zahtevati da se na taj način prijavljuju svi korisnici servera ili možda samo korisnici
neophodan pristup u direktorijum data. Pošto nijednom drugom konsmku to
koji se prijavljuju sa udaljenih računara.
nije neophodno, najbolje da im zabranite pristup tamo.

Fizička zaštita instalacije


Filtriranje podataka koje korisnici šalju · . Opšta preporuka glasi: ako ste se već potrudili da pažljivo podesite korisničke naloge u
Pre nego što MySQL-u prosledite bilo koji podatak k?ji je kor~snik une.o: treb.al.o b1 MySQL-u i u operativnom sistemu, pa čak i zahtevate da se korisnici prijavljuju
dn klijentska aplikacija izvrši određene provere. Kako cete to tacno obav1t1, zav1s1 od . putem SSL veza, najbolje je i da fizički zaštitite instalaciju. Ako postoji mogućnost da
razvojne platforme s kojom radite, ali pogledajmo primer koji objašnjava zbog čega b1 neko obori server zato što se sapleo o njegov kabi za napajanje, ili ako neko može da
ttd)nlo da proveravate ulazne podatke. v . v . ukrade podatke tako što odnese ceo računar, imate ozbiljan problem. Fizička zaštita se
Problem se može pojaviti čak i pri nečemu tako jednostavnom kao sto je unosenje često zaboravlja, naročito u malim i srednjim kompanijama.

1w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vašu aplikaciju. ~o te po?atke


Možda manje iznenađuje kada je u pitanju Windows, ali čak i inače bezbedni Unix/
pmslcdite direktno MySQL-u, problem će nastati zbog apostrofa u prez1menu O Leary. Linux sistemi postaju ranjivi kada se zanemari fizička zaštita. Na primer, na Linuxu je
u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokušavaju da unesu postupak izmene lozinke korisničkog naloga root trivijalno jednostavan kada imate
MySQL-ove komande putem korisničkog interfejsa vaše aplikacije ili Web obrazaca. fizički pristup računaru. Naravno, kada neko podacima može da pristupa kao korisnik
Postupak kojim ćete proveriti prihvatljivost ulaznih podataka zavisi od programskog root, može da menja koje god hoće podatke u MySQL-ovim bazama podataka .
.JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji ćete naći nekoliko opštih
pn:poruka za veliki broj programskih jezika.
~OG Poglavlje 15 Zaštita MySQL servera

2. Koja se tabela prva pretražuje kada se utvrđuje da li je korisniku dozvoljeno d,1


Sažetak izvrši određeni upit?
Sistem prava pristupa a) user
• Korak 1: Provera da li korisnik®računar ima pravo pristupa s lozinkom koju je b) host
zadao. e) db
• Korak 2: Provera svakog upita da bi se utvrdilo da li korisnik ® računar ima d) tables_priv
odgovarajuće pravo. Najpre se pretražuju tabele user i host, zatim db, a onda 3. Ako MySQL pronađe u tabeli user više redova koji sadrže isto ime korisnika,
tables_priv i columns _pri v. koji red uzima za proveru identiteta korisnika?
• MySQL daje prednost redovima u tabeli User koji sadrže konkretna imena a) Red koji sadrži najodređenijeime računara .
računara. b) Red koji sadrži najneodređenije ime računara.
e) Svaki red koji sadrži tačnu lozinku.
Bezbednosne preporuke
d) Nijedno od prethodnog.
• Obavezno zadajte lozinku za MySQL-ov nalog root.
4. Koja od sledećih prava verovatno ne bi trebalo da dodeljujete korisnicima?
• Izbrišite anonimne naloge; oni omogućavaju pristup neovlašćenim korisnicima
a) FILE
i mogu da spreče pristup regularnim korisnicima.
b) PROCESS
• Veoma pažljivo razmotrite kome ćete dodeliti prava FILE, PROCESS i WITH
GRANT OPTION.
e) WITH GRANT OPTION
• Lozinke koje se koriste samo za pristup aplikacijama šifrujte pomoću funkcija d) Sva prethodna
MOS () ili CRYPT () a ne pomOĆU funkcije PASSWORD () . S. Koji je korisnički nalog pogodan za mysqld?
• Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban a) Nalog s vrlo ograničenim pravima
korisnički nalog s vrlo ograničenim pravima koji ćete upotrebljavati samo za b) Root
mysqld. e) a) ili b)
• Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s ograniče­ d) Ni a) ni b)
nim pravima.
• Korisnicima ograničite pristup programima i skriptovima prema potrebama.
Držite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome
Vežbe
Pomoću primera podešavanja opisanog u MySQL-ovoj dokumentaciji, instalirajte
što im zaista treba!
OpenSSL za upotrebu na svom MySQL serveru.
• Dozvolite pristup direktorijumu data samo MySQL-ovom korisniku .
• Nikad ne prihvatajte podatke direktno od korisnika. Uvek ih prethodno filtri-
rajte u aplikaciji u kojoj se unose . Odgovori
• Uključite upotrebu SSL veza ako su potrebne šifrovane veze.
• N e zanemarujte fizičku zaštitu MySQL servera! Pitanja
l. d
Pitanja 2. a
l . Koj a se tabela u bazi podataka mysql pretražuje kada se utvrđuje da lije korisniku 3. a
dozvoljeno da uspostavi vezu sa serverom? 4. d
a) tables_priv S. a
b) db
e) co lumns_priv
d) li Sl' r
Poglavlje 15 Zaštita MySQLservera

U sledeće m poglavlju
U poglavlju16",Replikovanje baze podataka", saznaćete kako se dva servera ba~a .
podataka mogu podesiti da rade sa istim podacima. Time se raspoređuje opterecenJe,
povećava robusnost sistema i olakšava izrada rezervnih kopija podataka.
16
Replikovanj e baze podataka

J EDNA OD VEOMA KORISNIH MOGUĆNOSTI KOJE PRUŽA MYSQL jeste replika-


vanje. Između ostalog, replikovanje omogućava da iste podatke čuvate na više servera .
• To možete raditi iz više razloga,_npr. da biste postigli bolje performanse, povećali
pouzdanost sistema ili da biste lakše pravili rezervne kopije baze podataka. Osim toga,
možete se opredeliti za replikovanje kao rešenje kada želite da raspodelite opterećenje
baze podataka na više servera koje već imate, umesto da nabavite jedan (nov) jači server.
Replikovanje baze podataka može obezbediti otpornost sistema na greške (engl.
Ja~lt tolerance). Ako se glavni server pokvari,jedan od zavisnih servera možete tretirati
kao njegovu kopiju i odmah ga proglasiti za glavni server.
U sistemima gde se većina operacija svodi na čitanje podataka, a ne na pisanje, tepli-
kovanje može da poboljša performanse jer se izvršavanje upita raspodeljuje na više raču­
nara. Ukupno opterećenje sistema možete pokušati da smanjite tako što izvršavanje
upita rasporedi te na veći broj manje optere ćenih računara, a druga mogućnost je da
pokušate da smanjite saobraćaj u mreži tako što svaki upit usmerite na geografSki naj-
bliži server. Ako su upiti koji se izvršavaju u vašoj bazi podataka uglavnom prilično jed-
nostavni, čak i jednostavan algoritam koji ciklična raspoređuje opterećenje može biti
efikasno rešenje. Ako neki upiti zahtevaju složenu obradu, verovatno ćete morati da
osmislite složenije algoritme koji će raspoređivati opterećenje 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 može da potraje prilično dugo. Kada
koristite replikovanje, možete spustiti zavisni server i napraviti kopiju njegovih poda-
taka bez ometanja korisnika glavnog servera.

Principi replikovanja
Replikovanje se može odvijati u više oblika. U MySQL se koristi usmerena veza glavni-
-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili više servera tretiraju sc
kao zavisni (engl. slaves) od određenog glavnog servera. Glavni server određuje koji sc
podaci čuvaju u sistemu, dok zavisni serveri pokušavaju da preslikaju njegov sadrž,j.
IV

Postupak replikovanja oslanja se na sadržaj dnevnika izmena na glavnom serveru. Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na sJede ć oj
U tom dnevniku čuvaju se podaci o svakom upitu koji je bio izvršen na serveru od adresi naći ćete dokumentaciju s matricom verzija glavnih i zavisnih servera koje
po četka beleženja u dnevnik. Zavisnim serverima se šalju upiti iz dnevnika izmena mogu raditi zajedno:
glavnog servera a oni ih primenjuju na svoje podatke. www.mysql.com/doc/en/Replication_Implementation.html
Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru,
dok se operacije čitanja raspodeljuju između zavisnih servera, ili čak između glavnog
i zavisnih servera. To se postiže najčešće ugradnjom odgovarajuće logike u aplikacije.
Podešavanje sistema za replikovanje
Važno je imati u vidu da kada počnete da replikujete bazu podataka koja već sadrži U većini sistema u kojima se primenjuje replikovanje koristi se više računara pove-
podatke, dnevnik izmena možda neće biti potpun. Budući da beleženje izmena u dnev- zanih u jednu internu mrežu. Ako imate račun are povezane putem javnog Interneta,
nik standardno nije uključeno, podaci koje ste uneli u sistem možda nisu zabeleženi u pažljivo razmotrite bezbednosne mere. Za početak, obavezno proverite da li je TCP
dnevniku izmena. Kada započnete replikovanje, svi zavisni serveri moraju sadržati pot- priključak koji ste odredili za MySQL dostupan kroz zaštitni zid svim računarima koji

puno iste podatke kao glavni server na početku beleženja u dnevnik izmena.Ovu temu treba da komuniciraju sa serverom (podrazumevani broj TCP priključka za MySQL
ra zmotrićemo detaljnije u nastavku poglavlja.
server je 3306) .
Pošto zavisne servere napunite usklađenim podacima i pokrenete ih, oni usposta- Pod pretpostavkom da na svojim računarima imate noviju verziju MySQL-a i
vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeležene u jednu ili više baza podataka koje želite da replikujete, naredni koraci su obavezni da
dnevniku izmena glavnog servera. Jedna nit izvršenja na zavisnom serveru uspostavlja • biste napravili sistem s jednim glavnim serverom i jednim ili više zavisnih servera.
vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smeštaju u
prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvršenja na zavisnom Napravite korisnički nalog koji ćete upotrebljavati samo pri replikovanju
serveru čita izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka. Umesto da za sve što radite koristite nalog root, preporučujemo da za poslove repE-
Budući da glavni i zavisni serveri mogu biti dostupni u različita vremena (npr. zato
kovanja napravite korisničke naloge koji će imati samo prava neophodna za te poslove,
što se u sistem mogu dodati novi serveri baš u trenutku izvršavanja upita, ili zato što je kađ Što smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam

mreža postala zagušena, ili je čak prestala da radi), neophodno je da zavisni serveri beleže je poseban nalog na glavnom serveru, namenjen isključivo poslovima replikovanja.
dokle su stigli sa unošenjem izmena.Važno je da se sve transakcije 'izvrše u celini i da se Ako nameravate da početno stanje zavisnih servera generišete pomoću komandi
LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, korisničkom nalogu za
izmene primenjuju pravilnim redosledom. U većini aplikacija, ako se garantuje da baza
podataka uvek prelazi iz jednog usklađenog stanja u drugo, manje je važna činjenica da replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na
će se ponekad učitati podaci zastareli nekoliko sekundi ili minuta.
glavnom serveru) pravi korisnički nalog s pravima koja su potrebna alatkama za
Ako razmatrate primenu replikovanja, morate shvatiti šta se tačno događa. Ažuriranje uspostavljanje početnih veza između servera:
podataka odvija se asinhrono, a ne u realnom vremenu. Pošto ažurirate podatke u bazi grant replication slave, reload, super, select
na glavnom serveru, upiti poslati različitim zavisnim serverima nakon toga mogu izvesno on logs.*
to replication®"%" identified by 'password';
vreme davati različite rezultate. To se može smatrati nedostatkom, ali prednost je u tome
Što će zavisni server koji radi na prenosivom računaru ili u nepouzdanoj mreži, sasvim (U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgo-
lepo raditi u intervalu između dva ažuriranja s glavnog servera. vara imenu vaše baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)
Pošto završite kopiranje početnih podataka s glavnog servera na zavisni server,
Napomena o verzijama MySOL-a korisničkom nalogu za replikovanje više neće biti potrebna tako velika ovlašćenja. Ako
l ~c plikovanje je prvi put ugrađeno u jednu od novijih verzija MySQL-a (3 .23 .15), što zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlašćenja kori-
z n ači da se ta mogućnost još uvek razvija gotovo sa svakom novom izdatom verzijom. sničkog naloga za replikovanje nakon završetka početnog kopiranja, tom nalogu je
Ako nameravate da koristite replikovanje, dobro je da na svim računarima koji u tome dovoljno samo pravo replikovanja. Naredni upit pravi korisnički nalog čije je ime
u čes tvuju instalirate ažurnu i istu verziju MySQL-a. replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
Mogu će su određene kombinacije verzija MySQL-a između glavnog i zavisnih servera (kao i sa svakog drugog računara):
servera, ali pošto time samo uvodite određen stepen nepouzdanosti, najbolje je da to grant replication slave on logs.* to replication®"%" identifi e d by
izbe gavate ako je ikako moguće. Primera radi, možete naići na problem da se funkcij e, 'password' ;
kao što j e PASSWORD (),razlikuju između dve verzije MySQL- a s kojima pokušavate da
radit e.
rUyli:tVIJC l0 nC~III\UVdiiJC UdLC tJUUdldl'\.đ
Podešavanje sistema za replikovanjr
' l .it

Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika". Za My ISAM tabele, kopiju tekućeg stanja svakog zavisnog servera možete napraviti
Pravo replication slave (zavisni server pri replikovanju) uvedeno je u MySQL 4.0.2 nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u
upravo za tu namenu. U starijim verzijama MySQL-a koristite pravo file. nastavku ovog poglavlja. Međutim, ova metoda nije posebno efikasna, naročito kad
Navedena komanda omogućava samo pristup bazi podataka logs. Ako želite da doz- imate veliku količinu podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM
volite replikovanje svih baza podataka na serveru, u komandi zamenite logs. * sa * . *. MASTER izdata sa svakog zavisnog servera zaključaće podatke na glavnom serveru do
završetka kopiranja. Baze podataka će biti zaključane znatno kraće vreme ako kopiju
Proverite da li je glavni server podešen za replikovanje tekućeg stanja napravite ručno pomoću komandi operativnog sistema. To vam takođe
Na glavnom serveru mora biti uključeno beleženje izmena u dnevnik. Ako ste pročitali omogućava da istom kopijom tekućeg stanja glavnog servera inicijalizujete koliko god
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e već uključili dnevnik . vam zavisnih servera treba, čime skraćuj ete interval u kojem je server zaključan.
izmena jer on služi i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju- Za InnoDB tabele ne možete izdati komandu LOAD DATA FROM MASTER. Kopiju
čeno beleženje izmena u dnevnik, možete izdati komandu SHOW VARIABLES. Dovoljno stanja morate napraviti ručno pomoću komandi operativnog sistema ili nabavite
softver i opremu koji omogućavaju izradu kopije podataka dok se server koristi .
je da zadate
Ako kopiju tekućeg stanja servera pravite ručno, pomoću komandi operativnog
show variables;
sistema, morate se uveriti da su podaci međusobno usklađeni i ažurni, tako što ćete
da biste prikazali vrednosti svih serverskih promenljivih, ali za skraćeni rezultat zadajte izdati sledeću komandu:
sledeće :
• flush tables with read lock;
show variables like "log_bin";
Time ćete zaključati tabel u i sprečiti upisivanje izme na dok je ne oslobodite.
Ako je beleženje izmena u dnevnik isključeno, dodajte opciju log-bin u datoteku Ime tekuće datoteke dnevnika i pomak od njenog početka možete dobiti pomoću
opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija biće my. ini ili my. cnf, sledeće komande:
u zavisnosti od konvencije operativnog sistema koju ste primenili.
show master status;
U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo
bi da vaša datoteka opcija sadrži barem sledeće redove: Trebalo bi da dobijete rezultate nalik na sledeće:

[mysqld] +-------------------+----------+---- - ---------+------------------+


log-bin
l File l Position l Binlog_do_db l Binlog_ignore_db l
server-id=1 +-------------------+----------+--------------+------------------+
l server-bin.000007 l 211 l
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 pro-
Zapišite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone
izvoljno zadali smo 1. . .
(pomak od početka te datoteke). Ako nema podataka, umesto imena datoteke zadajte
Ako izmenite sadržaj datoteke opcija, morate ponovo pokrenut1 server da bl
prazan znakovni niz, a vrednost pomaka treba da bude 4.
izmene počele da važe. Da biste napravili kopiju tekućeg stanja My ISAM tabela, pomoću neke alatke za
arhiviranje datoteka kopirajte sadržaj direktorijuma u kojem se nalaze datoteke tabela.
Napravite kopiju tekućeg stanja glavnog servera Na Unixu, zadajte nešto nalik na sledeće da biste napravili kopiju tekućeg stanja baze
Da biste započeli replikovanje, obezbedite sledeće: podataka logs:
• potpunu i usklađenu kopiju tekućeg stanja baze podataka na glavnom serveru
tar -cvf /tmp/snapshot.tar /path/mysql/data/logs
• ime datoteke dnevnika izmena na glavnom serveru
Na Windowsu, upotrebite WinZip ili neku sličnu alatku da biste napravili kopiju
• pomak od početka dnevnika koji odgovara tekućem stanju servera. sadržaja direktorij uma C: \mysql\data \lo gs.
Tačan postupak kojim ćete obaviti navedene poslove može s.e malo razli~ovati Kada završite kopiranje, možete ponovo dozvoliti upisivanje u bazu podataka ako
u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam izdate sledeću komandu:
.Jl! neprijatna pomisao da ćete za određeno vreme morati da zabranite pristup bazi unlock tables;
podataka.
Složenije topologlj
214 Poglavlje 16 Replikovanje baze podataka

Tabela employee koju koristimo u celoj knjizi (kao i većina tabela koje autori kori- U ovom primeru, reč server je ime računara na kojem radi glavni server. Reč
ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje replicationje korisničko ime naloga koji ste napravili za poslove replikovanja.
InnoDB tabela dok se koriste, onje savršen za ovu namenu. Može se nabaviti od firme Umesto reči password upište lozinku tog naloga. Zadajte i ime datoteke dnevnika
izmena (parametar master_log_file) i pomak (parametar master_log_pos).
Innobase Oy na adresi
Komanda START SLAVE pokreće na zavisnom serveru nit koja obavlja replikovanjc,
www.innodb.com/hotbackup.html usled čega zavisni server pokušava da uspostavi vezu sa glavnim serverom i preuzme
Ako nemate takvu alatku, najbolje rešenje je da ispraznite bafere baze podataka i da 1zmene.
ispraznite njene tabele pomoću narednih komandi. Prvo zadajte komandu Ako ste napravili kopiju tekućeg stanja pomoću komandi operativnog sistema, tre-
flush tables with read lock; balo bi da pokrenete izvršavanje upita koji ispituju razlike između glavnog servera i
a zatim prikažite i zapišite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti 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 .
način kao za MyiSAM tabele):
Ako replikujete relativno male My ISAM tabele, možete ih napraviti i popuniti
show master status; podacima pomoću komande nalik na sledeću:
Bazu podataka isključite iz upotrebe a da je ne oslobodite, a sadržaj direktorij uma
load table logs.logJan2003 from master;
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 želite da kopirate samo jednu tabel u, ili
Kada završite kopiranje, možete ponovo pokrenuti bazu podataka i osloboditi njene load data from master;
tabele. da biste kopirali sve tabele na zavisni server.
Kada postupak replikovanja počne da se normalno odvija, više neće biti zgodno da
Podesite zavisne servere ručno izdajete komande za podešavanje replikovanja, čak ako zbog toga retko ponovo
Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini) pokrećete server. Iste podatke koje biste zadali pomoću tih komandi možete uneti u
dodajte red nalik na sledeći: datoteku opcija, uz malo drugačiju sintaksu.
server-id=2 Datoteka my. ini ili my. cnf na zavisnom serveru može sadržati nešto nalik na sledeći:
Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka, [mysqld]
potpuno je nevažno koje ćete vrednosti izabrati. Ako ćete imati veći broj servera, niz server-id = 2
master-host server
rastućih vrednosti je najverovatnije najbolji način da identifikatori imaju jedinstvene
master-user replication
vrednosti. master-password password
Ukoliko koristite kopije koje ste ručno napravili u sistemu datoteka, morate kopi- replicate-do-db = logs
rati datoteke na odgovarajuća mesta na zavisnom server u. Ako radite s više različitih
operativnih sistema, vodite računa o razlikovanju malih i velikih slova.
Nakon ažuriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server, Složenije topologije
Najčešća pr imena replikovanja jeste raspoređivanje opterećenja (engl. load balancing)
morate ga ponovo pokrenuti.
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
Pokretanje zavisnih servera
Da biste pokrenuli zavisni server podešen kako je opisano u prethodnim odeljcima, glavnog servera i manjeg broja zavisnih servera, ali postoje i slučajevi u kojima je
opravdana upotreba složenijih konfiguracija.
treba da izdate sledeće komande:
Ako predviđate da ćete imati veći broj zavisnih servera ili su vaši računari razmešteni
change master to master_host='server',
master_user='replication', na većem broju različitih geografskih lokacija, može biti pogodno rešenje u obliku
master_password='password', hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za određen broj
master_log_file='server-bin.000007', zavisnih servera. Jedan ili više tih zavisnih servera igraju ulogu glavnog servera za drugu
master_log_pos=211; grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server (računar broj l) koji
start slave; 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
Pitanja

. Uglavnom, replikovanju treba pristupiti sa izvesnom rezervom. Mehanizam radi,


1 to dob:_o,ali početno podešavanje može biti zapetljane zbog razlika između sistema .
Prepon~CUJemo da koristite najsvežije verzije MySQL-a koje možete nabaviti.
Neki od tih problema biće rešeni kada My ISAM dobije alatku za kopiranje podataka
dok .se tabele kon~ te, kao..što postoji za InnoDB tabele. Među mogućnostima koje su
plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s više
glavmh se:v~ra Istovremeno (engl. multimastering) radi rešavanja sukoba, i mogućnost
preklapanJa IZmeđu ~va server~ "n~. vruće" (engl.failover) i raspoređivanje opterećenja.
Zasad se o p~eklapa11Ju na vruce IZmeđu dva servera i raspoređivanju opterećenja
morate starati sami u svojim aplikacijama, ili možete nabaviti odgovarajuću alatku za
Slika 16.1 Replikovanje s hijerarhijski organizovanim glavnim serverima. grupiSal1Je servera, kao Što nudi kompanija Emic Application Cluster na adresi
www.emicnetworks.com .

Raspored kao na slici smanjuje opterećenje glavnog servera na najvišem nivou i U .datoteci opcija P?stoji nekoliko parametara koji se tiču replikovanja ali zasad
smanjuje obim saobraćaja na mrežnim vezama koje vode ka tom računaru. U zavisno- • nemaJumkakvog UtiCaJa. To su opcije za podešavanje SSL veza između glavnog servera
sti od odnosa između broja operacija čitanja i upisivanja podataka u vašoj aplikaciji, I zav1smh se~.era . Ukoliko podatke replikujete putem javne mreže, postupak će tako
tako možete obezbediti dobru skalabilnost bez prevelike složenosti sistema. biti bezbed~IJI. Ako vam tre~aju zaštićene veze, zasad je jedino rešenje da nabavite
Prilično jednostavno možete formirati sistem s proizvoljnim brojem zavisnih ser- odgovaraJUCI proiZvod, kao sto je Stunnel.
vera i možda čak više glavnih servera, pod uslovom da je svaki računar glavni server
u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite Sažetak
računa da će ponekad na određenom serveru nedostajati najnovije izmene, ceo sistem
možete tretirati otprilike kao da je u pitanju samo jedan server baze podataka. • Repl~kovanje nije pogodno za. sve situacije, ali ako imate opterećenu aplikaciju s
Stvari počinju da se komplikuju kada imate cirkularne veze u kojima više servera V~SOkJm vodnosom ,Između broja operacija Čitanja j upisivanja podataka, to može
primaju komande za ažuriranje podataka a izmene se prosleđuju u više smerova. b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Najjednostavnija cirkularna veza sastoji se od dva računara koji se ponašaju i kao glavni • Imajte u vidu da se izmene ne izvršavaju na zavisnim serverima u isto vreme.
i kao zavisni server. Svaka izme na koju načinite na jednom računaru prosleđuje se dru- Svaka kopija tabele mora prelaziti iz jednog usklađenog stanja u drugo, ali učita­
gom. Kada pišete aplikacije za tu vrstu sistema, morate biti veoma oprezni. vanJe podataka sa različitih servera može dati zastarele rezultate dok se zavisni
Budući da se izmene unose asinhrono, može doći do dupliranja vrednosti u poljima serveri ne ažuriraju.
tipa auto increment ili jedinstvenih identifikatora i do neusklađenih podataka. U nekim • Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
aplikacijama to može biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW MAS~ER STA-
podatke i u kojoj imate manji broj jednostavnih veza između tabela, a zahteva se veliki TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.
protok podataka i raspoloživost za upotrebu, možda ćete prihvatiti da tome žrtvujete
usklađenost podataka.
Pitanja
l. Na MySQL serveru replikovanje se može upotrebiti za
B udućnost replikovanja a) punjenje podacima razvojnog servera koji će služiti za bezbedno testiranje
Imajući u vidu sve što je rečeno, moramo napomenuti da su u pitanju relativno nove novih programa na stvarnim podacima
mogućnosti, koje nisu do kraja "izbrušene". Kao što ste videli, postupak inicijalizovanja
b) poboljšavanje performansi
novog zavisnog servera kopijom stanja glavnog servera nije baš najpraktičniji. Nije uskla-
đen ni način na koji se radi s MyiSAM tabelama i InnoDB tabelama. Tekuće mogućnosti
e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike
n:plikovanja u MySQL-u nisu baš najrobusnije. Ugrađene su u standardnu distribuciju d) poboljšavanje stepena raspoloživosti sistema
(za razliku od većine komercijalnih baza podataka) i redovno se upotrebljavaju u okru- e) sve prethodno navedeno
1cnjima gde sc obraduju velike količine podataka.Verovatno ćete čuti da su među kori
Sllltim.l kompanije kao što su Slashdot,Yahoo! i Googlc.
218 Poglavlje 16 Replikovanje baze podataka

2. Datoteka dnevnika
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
VI
3. Operacije čitanja i upisivanja podataka obično se odvijaju
a) čitanje na zavisnim serverima, upisivanje na zavisnim serverima Optimizovanje MySQL-a
b) čita~e na zavisnim serverima, upisivanje na glavnim serverima
e) čitanje na glavnim serverima, upisivanje na zavisnim serverima
d) čitanje na glavnim serverima, upisivanje na glavnim serverima
e) nijedno od prethodnih
17 Optimizovanje MySQL servera
4. Replikovanje MySQL-ovih podataka znači da
a) su podaci uvek ažurni 18 Optimizovanje baze podataka

b) serveri moraju biti povezani preko pouzdane mreže, a ako jedan od servera 19 Optimizovanje upita
postane nedostupan, drugi moraju da čekaju dok se on ponovo priključi
e) izmene podataka su brze, ali je potrebno izvesno vreme dok se one presli-
kaju na sve zavisne servere
d) izmene podataka se mogu unositi na bilo kom serveru i prosleđuju se glav-
nom serveru, a zatim svim ostalim zavisnim serverima

Odgovori
Pitanja
l. e
2. b
3. b
4. e
17
Optimizovanje MySQL servera


u OVOM POGLAVLJU RAZMOTRIĆEMO NEKOLIKO MOGUĆNOSTIubrzavanja
MySQL servera. Podešavanje servera je opsežna tema i ima izvesnih sličnosti sa ezote-
ričnom umetnošću. Naša namera je da vam u ovom poglavlju predstavim o osnove
podešavanja servera. Obradićemo sledeće teme:
• Prevođenje i povezivanje koda radi veće brzine rada
• Podešavanje parametara servera
• Podešavanje drugih činilaca

Najvažnije je imati u vidu činjenicu da za sve izmene koje uvodite na serveru


u cilju njegovog optimizovanja morate primeniti isključivo empirijski pristup. Poku-
šajte jednu po jednu izmenu i meri te performanse pre i posle nje. Jedino tako ćete
utvrditi da li izmena koju ste načinili zaista poboljšava performanse.
Ako želite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da duže
vreme Uedan sat, jedan dan ili neki prosečan period) beležite upite koji se izvršavaju na
serveru i da zatim te iste upite ponovo izvršite na izmenjenoj konfiguraciji servera.

Prevođenje i povezivanje koda radi povećavanja


brzine rada
U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih ver-
zija instalacionih datoteka (pomoću alatke RPM na Unixu). Ako tek učite upotrebu
MySQL-a, to je svakako najjednostavniji način, naročito ako nemate iskustva s pre-
vođenjem softvera koji imate na svom računaru, kao što je slučaj s većinom korisnika
Windowsa.
Performanse svog servera možete poboljšati ako preuzmete izvornu verziju koda i
sami ga prevedete. Ukoliko imate računar s procesorom Pentium koji radi pod opera-
tivnim sistemom Linux, postići ćete primetno poboljšanje performansi ako izvorni
1.22 Poglavlje 17 Optimizovanje MySQL servera t'oaesavanJe parametar.• ~rrv 11

kod MySQL-a prevedete pomoću prevodioca pgcc, koji optimizuje rezultujući kod Datoteka opcija my.cnf sadrži toliko veliki broj opcija da ćete se možda pitati
samo za procesor Pentium. (Tako dobijena izvršna datoteka nije kompatibilna sa odakle da počnete. Uz većinu verzija MySQL-a dobijate i prime re datoteka my. en t ,
AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web koje se obično nalaze u direktorijumu support-files instalacije. U tom direktorijumu
lokacije prevedena pomoću prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser- naći ćete sledeća četiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
ver možete ubrzati od 10% do 30% ako sami prevedete kod pomoću odgovarajućeg my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao početnu datoteku op cijn
prevodioca i pravilno podešenih opcija- više informacija o tome naći ćete u MySQL- za svoj sistem.
-ovoj dokumentaciji. Najvažniji parametri koje treba da podesite jesu oni koji određuju kako MySQL
Drugo poboljšanje u poređenju s MySQL-ovom gotovom izvršnom datotekom troši memoriju. Za svaki server baza podataka važi pravilo "što više memorije, to
jeste da prevedete MySQL s podrškom samo za skup (ili skupove) znakova koji name- bolje", ali je važno i da ta memorija bude na raspolaganju serveru baze podataka i da
ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugrađena je se pravilno raspodeljuje između njegovih procesa.
podrška za sve postojeće skupove znakova. (Više informacija o skupovima znakova MySQL održava grupu internih bafera i ostava. Možete podesiti količinu memorije
naći ćete u poglavlju 12",Podešavanje MySQL-a" .) koja se odvaja za tu namenu. Dva najvažnija parametra koja treba da podesite su
MySQL-ova dokumentacija sadrži predloge o optimizovanju binarnih datoteka key_buffer_size i table_cache. Pošto te bafere dele sve niti koje rade na serveru,
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim njihovo podešavanje ima veoma veliki uticaj na performanse servera.
grupama na Internetu posvećenim MySQL-u možete naći mišljenja i savete u vezi .. U baferu nazvanom bafer za ključeve (engl. key buffer) čuvaju se blokovi MyiSAM
s mnogim problemima specifičnim za određene operativne sisteme i prevodioce koda. indeksa. Kada aplikacija zatraži određeni blok iz datoteke indeksa, on se učitava u taj
Arhive se nalaze na adresi bafer. Kad god se izvršava neki upit, ako se odgovarajuću blok indeksa nalazi u baferu,
http://lists.mysql.com podaci se učitavaju iz njega. U suprotnom, blok indeksa mora da se učita iz datoteke
na disku u bafer za ključeve, što je, razume se, sporije. Za bafer ključeva važi pravilo da
Ukoliko želite da se pridružite diskusijama o prevodiocima, potražite forum na adresi
što je veći, to bolje služi svojoj svrsi.
www.lukelaura.com Kada razmatrate vrednost koju ćete dodeliti parametru key_bu ff er_ s i ze, treba da
uzmete u obzir ukupnu količinu memorije s kojom raspolažete, da li se računar koristi
isključivo kao MySQL server ili služi i za druge poslove, a važna je i veličina datoteka
Podešavanje parametara servera
indeksa (tj. ukupna veličina .MYI datoteka).Jeremy Zawodny, poznati stručnjak koji
Da biste optimizovali svoju konfiguraciju, pokušajte da podesite parametre MySQL
održava servere kompanije Yahoo!, preporučuje da na računaru koji radi isključivo kao
servera.
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu između 20% i
Podsećanja radi, tekuće vrednosti parametara servera prikazaćete na sledeći način:
50% ukupne količine memorije na računaru . Ako je u pitanju deljen računar, jasno je da
show variables;
vrednost tog parametra treba da bude manja. Ukoliko podaci vaših indeksa zauzimaju
Uticaj tekućih vrednosti parametara na konfiguraciju servera videćete pomoću sle- samo 20 MB, bilo bi besmisleno da veličinu bafera za ključeve podesite na 128 MB.
deće komande: Imajte u vidu i to da se bafer za ključeve koristi isključivo za MyiSAM tabele. Za
show status; druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
povećate bafer za ključeve ako, na primer, radite isključivo sa InnoDB tabelama. U
Druga korisna alatka koja omogućava da vidite šta se događa na serveru jeste Perl
skript mytop, čiji je autor Jeremy Zawodny. tom slučaju važniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
čuvaju se i podaci indeksa i podaci tabela. (Više informacija o podešavanju za rad sa
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
~ta nje procesa, trajanje itd. Osim toga, ta alatka omogućava da prikažete detalje
InnoDB tabelama naći ćete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
MySQL-ovog procesa i vidite koji se upit izvršava. Drugi zaista važan parametar je ostava za tabele (engl. table cache) kojom se upravlja
pomoću opcije table_cache.Vrednost te opcije određuje maksimalan broj tabela koje
Skript možete preuzeti sa adrese
mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su
http://jeremy.zawodny.com/mysql/mytop
zasebne datoteke u operativnom sistemu. Budući da je otvaranje i zatvaranje dato tc b
Sve navedene alatke omogućavaju da evidentirate izmene koje ste uneli i učinke spora operacija, te datoteke ostaju otvorene dok ne budu izričito zatvorene, server spu
koj e one imaju na sistem. šten, ili dok ukupan broj otvorenih tabela ne premaši vrednost parametra table_cache.
Poglavlje 17 Optimizovanje MySQL servera

Povećanje vrednosti parametra table_cache korisno je kada na serveru imate veliki • Performanse ćete poboljšati ako sami prevedete izvorni kod MySQI ,, 11 11 1 illi

broj tabela. Budući da vaš operativni sistem ograničava ukupan broj otvorenih datoteka datoteku, naročito ako imate računar koji radi pod Linuxom ili ima JlllH l'''"
u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik može držati otvo- Pentium.
rene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego što izme- • Podesite parametre servera za bolje performanse, naročito one koje sc odnosa·
nite vrednost parametra table_ cache. na potrošnju memorije. Velika količina fizičke memorije na računaru uvek Jt'
Osim tih globalnih memorijskih bafera, pojedinim nitima se takođe dodeljuju korisna, ali je važnije kako se ona raspodeljuje. Evo nekoliko posebno va žn ih
određeni blokovi memorije- kao što su, na primer, bafer za sortiranje (engl. sort buffer) parametara:
i br.ifer za čitanje (engl. read bulfer).Veličina tih b afera je jednaka za svaku nit, ali svaka nit • key_buffer_size: Količina memorije koja će biti odvojena za skladištenje
može koristiti tu količinu memorije za drugu namenu . MyiSAM indeksa.
U bafer za čitanje, čija se veličina određuje parametrom read_buffer_size, sme- • table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme.
štaju se podaci iz tabele kada se njen sadržaj čita sekvencijalnim redosledom (engl. table
• read_buffer_size: Količina memorije koja se koristi pri sekvencijalnom
sca11). Što se više podataka iz tabele može smestiti u bafer, to će biti manji broj opera-
čitanju tabela.
cija čitanja sa diska; međutim, ako je vrednost tog parametra previsoka, grupa bafera
za čitanje koje niti koriste može potrošiti previše memorije. Možda se sećate da se u • sort_buffer: Količina memorije koja se koristi za skladištenje podataka iz
ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a veličinu muje .. tabela kada se pomoću odredbe ORDER BY zahteva sortiranje podataka.
određivao parametar record_buffer. • Poboljšajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo-
Bafer za sortiranje, čiju veličinu određuje parametar sort_buffer, koristi se pri trebom žurnalskog sistema datoteka i brze mreže između klijenata i servera, te
izvršavanju upita koji sadrže odredbu ORDER BY, tj. služi za sortiranje podataka. Ako između glavnih i zavisnih servera.

sorti rate velike količine podataka, povećajte bafer za sortiranje, ali i za njega važi isto
upozorenje kao i za bafer za zapise. Pitanja
l. Parametar koji određuje koliko će memorije biti odvojeno za skladištenje
Podešavanje drugih činilaca indeksa Inn oD B tabela je
Na kraju, još nekoliko saveta koji vam mogu pomoći pri podešavanju fizičke konfigu- a) key_buffer_size
racije sistema. b) innodb_buffer_pool_size
Što se operativnog sistema tiče, MySQL preporučuje Solaris kada želite da izvučete
e) innodb_key_buffer_size
maksimum od računara s više procesora. Iako postoje verzije MySQL-a za razne ope-
d) read_buffer_size
rativne sisteme, razvoj i početno testiranje obavljaju se na Solarisu, zahvaljujući čemu
bi to po logici stvari trebalo da bude najbolje optimizovana platforma. 2. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka
Ukoliko možete da nabavite više diskova, poboljšaćete performanse ako baze poda- Inn oD B tabela je
taka rasporedite na različite fizičke diskove. U tom slučaju možete koristiti i RAID a) key_buffer_size
konfiguracije - RAID O poboljšava performanse pri čitanju i pisanju, a RAID l ili 5 b) innodb_buffer_pool_size
poboljšavaju performanse pri čitanju. Osim toga, SCSI diskovi obezbeđuju bolje per- e) innodb_key_buffer_size
foJillanse od IDE diskova. d) read buffer size
Možete razmotriti i upotrebu žurnalskog sistema datoteka (engl.journalingjile
3. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka
1ystc'111), kao što je Reiserfs ili XFS. Tako možete još više poboljšati performanse.
My ISAM tabela je
Rnume se, značajan boljitak može se postići povezivanjem klijenata i servera preko
bt7C mreže, što takođe važi i za glavne i zavisne servere u replikovanju.
a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
Sažetak d) read_buffer_size
Budući da je tema optimizovanja MySQL-a toliko opsežna da zaslužuje zasebnu
kii_JI~ll, obavcwo nastavite s prikupljanjem informacija i istraživanjem te oblasti.
u Poglavlje 17 Optimizovanje MySOL servera

4. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka


My ISAM indeksa je
a) key_buffer_size
b) table_cache
e) innodb_key_buffer_size
18
d) read_buffer_size
S. Vrednost parametra read_buffer_size ne bi trebalo da bude previsoka jer
Optimizovanje baze podataka
a) ako veći broj niti sekvencijalno pretražuje tabele, imaćete problem
b) uvek se može dodati nov indeks, pa zato MySQL neće nikad morati da
sekvencijalno pretražuje tabele
e) time se rasipa prostor na disku
d) nijedno od prethodnog
U POGLAVLJU 17",0pimizovanje MySQL servera", opisali smo kako se server
.. podešava za optimalne performanse. U ovom poglavlju razmotrićemo kako možete
Vežbe optimizovati tabele baze podataka.
Eksperimentišite pomoću programa za merenje performansi dok parametre navedene Standardna pravila i preporuke za strukture i normalizovanje tabela obično pobolj-
u ovom poglavlju podešavate na različite vrednosti. Možete li pronaći optimalnu šavaju performanse. Postoje i drugi izbori koje možete napraviti kada projektujete
vrednost svakog od tih parametara za svoj sistem? bazu podataka, zbog kojih će konačni proizvod biti brži ili sporiji. U ovom poglavlju
razmotrićemo te izbore.
Obradićemo sledeće teme:
Odgovori • Šta usporava MySQL-ove baze podataka
• Napravite pravilne izbore pri projektovanju
Pitanja
• Upotreba indeksa za optimizovanje performansi tabela
l. b
• Komanda OPTIMIZE TABLE
2. b
3. d
4. a Šta usporava MySQL-ove baze podataka
S. a Pošto ste pročitali prethodno poglavlje o optirnizovanju servera, možete preći na opti-
mizovanje baze podataka. U narednom poglavlju bavićemo se optirnizovanjem upita.
Ako ste optirnizovali server (možda čak po cenu ugradnje dodatnog hardvera), sle-
U sledećem poglavlju deći korak je da razmotrite da li se bilo koja od navedenih tačaka odnosi i na vaš slu čaj :
U sled ećem poglavlju," Optimizovanje baze podataka", razmotrićemo optirnizovanje
• Nemam dovoljno indeksa. Uzrok broj jedan loših performansi jeste upotreba tabela
Šl' ll1 C baze podataka, indeksa i pojedinih tabela.
kojima nije pridružen nijedan indeks ili nema indeksa za kolone koje pretražu-
jete.To ne znači da treba imati što veći broj indeksa jer preterivanje u suprotnom
smeru može biti uzrok sledećeg problema na listi.
• Imam previše indeksa. Da bi se ažurirao veliki broj indeksa, svaki put se u t:~ belu
upiše nov red ili ažurira postojeći, a to potraje. Kada učitavate podatke, indeksi '> ll
veoma korisni. Kada upisujete nove redove, odnosno ažurirate ili briŠt:lc pm111
jeće redove, indeksi postaju problem. Kad god ažurira te neki podatak, 11101 .q11 ~ ~
ažurirati i indeksi, što produžava obradu i povećava optereće nj e si slCill;l
ll Poglavlje 1B Optimizovanje baze podataka

• Dodeljujem prava pojedinačno za tabele i kolone tabela. Ako prava dodeljujete pojedi- lnd~ksiranje u cilju optimizovanja
načno za tabele ili kolone bilo kog resursa, kad god korisnik pošalje upit na izvrša- Uk~hko .ste pratili gr:divo i vežbe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1,1
vanje, MySQL mora da utvrđuje koja su sve prava za tabele i kolone tabela zadata. ~adrz1 pnmarne kljuceve. To znači da imate barem po jedan indeks za svaku tnbdll
~~r MySQL automatski pravi indekse za kolone koje deklarišete kao PRIMARY KEY
• Struktura baze podataka nije optimalna. Postoje načini da se struktura baze podataka
1h UNIQUE. ,
projektuje tako da se upiti brže izvršavaju.
~o pokušavat.e da optimizujete postojeću bazu podataka, korisno je ispitati da Ji ll'
U naredna dva odeljka razmotrićemo strukture baze podataka i indekse koji omo- u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je česta greška pri projekta o

gućavaju ubrzavanje rada s bazom podataka. vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za određenu tabelu.
Pravilni izbori pri projektovanju baze podataka Dakle, šta je indeks i čemu služi?
Indeks je sličan referentnoj tabeli po tome što omogućava da se brzo pronađe odrc-
Postoji više pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,
đe.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaženje tražene vrednosti u
doprinose poboljšanju njenih performansi. To su sledeći:
tOj ..kolo~l zna.tno je brže pomoću indeksa. Indeks pokazuje gde se u tabeli nalazi red
• Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima ćete kOJI sadrz1 tr~ze~u vredn~st, što omogućava da se direktno pređe na taj red.
raditi. Na primer, ako u koloni tabele čuvate samo brojeve od 1 do 10, nemojte
zadati tip INT, već tip TINYINT. Što su kraći redovi i manje tabele, to će se one
.. . Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretražuje jedan po
Jedan red tabele dok ne pronađe redove koje ste zahtevali. Zamislite da morate da
brže pretraživati. Što su podaci manji, više se redova može keširati u memoriju. pronađe:e određe~u ten~u. u ovoj knjizi tako što ćete početi od prve stranice i čitati
• Koristite zapise fiksne dužine gde god je moguće. Ako su svi redovi tabele jed- svaku ree na sv~kOJ stran1e1. ~na tn o je brže da u indeksu knjige potražite temu koja vas
nake dužine, MySQL brže pristupa redovima u sredini tabele. Da bi tabela imala zamma 1 da zat1m pređete direktno na stranicu koja vam treba.
redove fiksne dužine, tipovi podataka u svim kolonama moraju biti fiksne dužine. U MySQL-u se po.daci indeksa čuvaju u obliku b-stabala (binarna stabla); to su
To znači da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB. strukture podataka koje se vrlo brzo pretražuju.
Ako vam je neophodan tip TEXT i BLOB, možda biste mogli da denormalizujete . I~dek~i mogu o?~hvatati je~nu kolonu ili više njih (isto kao ključevi tabela). Pri
šemu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu. IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretražuje jedno od sledećih:
Ukoliko imate isključivo kolone tipa VARCHAR, razmislite o tome da ih zamenite • Kolona kojoj _je pri~ružen jednokolonski indeks- na primer, ako je u tabeli
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju više mesta ~epartments mdekmana kolona departmentiD i treba izvršiti upit sličan slede-
na disku, što je u suprotnosti s prvom preporukom na ovoj listi. cem: SELECT .. . WHERE departmentiD=n.
• Gde god je moguće, deklarišite kolone kao NOT NULL. Ako je priroda vaših • Grupa kolon~ za koju postoji zajednički indeks - na primer, ako za tabelu
podataka takva da su vrednosti NULL sasvim logične i prihvatljive, slobodno ih emplo~ee.ass1gnment postoji indeks za kolone (client ID, employeeiD work-
koristite. Međutim, imajte u vidu da zbog toga gubite malo brzine i prostora, date) 1 treba izvršiti upit sličan sledećem: SELECT .. . WHERE client ID=~ AND
pa zato zadajte odredbu NOT NULL gde god je moguće. employeeiD=y AND workdate=z .
• Birajte tip tabela za svaku tabel u pojedinačno. Tabele koje ne podržavaju transak- • Ko.lon~ ili grupa kolo.na koja je deo višekolonskog indeksa, pod uslovom da je to
cije (na primer, My ISAM) manje opterećuju sistem i zato su brže od tabela koje levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign-
podržavaju transakcije (InnoDB i BDB). MySQL podržava mešanje više tipova ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on će biti
tabela u istoj bazi podataka. Izaberite najbrži tip koji je pogodan za određeni upotrebljen u upitima sledeće vrste: '
posao. (Više informacija o pojedinim tipovima tabela naći ćete u poglavlju 9, SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y
"Tipovi tabela u MySQL-u" .)
• Izaberite odgovarajuće indekse. Ovu temu obradićemo detaljno u narednom Ali ne i u upitima nalik na sledeći:
SELECT ... WHERE employeeiD=y AND workdate=z
odeljku.
• U težim slučajevima, razmislite o denormalizovanju tabela da biste smanjili broj Suština cele .~riče je u sledećem: ako predviđate da će se izvršavati veliki broj upita
spojeva koji se uspostavljaju u uobičajenim upitima. Budući da će zbog toga vaša ~ad kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
baza podataka postati noćna mora za održavanje, to se najčešće ne preporučuje. Izdate komandu CREATE INDEX da biste napravili odgovarajući indeks. Imajte u vidu
- r .. · · ··· - - · - ··.J- ---- 1 ---~-H-

Pitanja

da MySQL može da koristi samo po jedan indeks po tabeli u upitu. Nije moguće
automatsko kombinovanje više indeksa.
Pitanja
Ovo pitanje ćemo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita", 1. Koja je od sledećih tvrdnji o indeksima tačna?
kada budemo došli do komande EXPLAIN. a) Indeksi zauzimaju previše prostora na disku i zato ih ne treba koristiti.
b) Ako tabeli nije pridružen nijedan indeks, upit se može izvršavati sporije.
Komanda ANALYZE TABLE e) Trebalo bi da indeksirate što veći broj kolona.
Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored ključeva u tabeli. d) Nijedna od prethodnih.
MySQL čuva te podatke i koristi ih pri donošenju odluke o tome kako će spojiti 2. Kada birate tipove podataka za kolone tabele
tabele u upitu. Komanda se izdaje na sledeći način a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje
analyze table imetabele; efikasnija
b) trebalo bi da koristite tipove podataka promenljive dužine gde god je
Komanda OPTIMIZE TABLE moguće jer se tako optimizuje upotreba prostora na disku

N a kraju, moramo pomenuti komandu OPTIMIZE TABLE . Njena vrlo jednostavna e) trebalo bi da koristite tipove podataka fiksne dužine gde god je moguće da
sintaksa izgleda ovako: biste ubrzali pristup podacima
OPTIMIZE TABLE imetabele;
d) nijedno od prethodnog
3. Kada birate tip tabela
To je MySQL-ov ekvivalent komande za defragmentiranje Čvrstog diska. Tokom
upotrebe baze podataka, u datotekama u kojima se čuvaju podaci raste broj praznina a) uvek birajte InnoDB ili BDB zato što podržavaju transakcije
između blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su b) uvek birajte MyiSAM zato što su najbrže
zapisi premešteni zato što su nakon ažuriranja postali veći. Te praznine su uzrok slabije e) koristite mešavinu tipova, u zavisnosti od svrhe tabele
efikasnosti. d) nijedno od prethodnog
Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri- 4. Indeks neće biti upotrebljen ako se u upitu
sali veće količine podataka, ili ako ste dodali, izbrisali ili ažurirali veći broj redova pro-
a) koristi levi kraj grupe indeksiranih kolona
menljive dužine. Tako ćete preurediti podatke u datotekama, ponovo sortirati indekse
i ažurirati statističke podatke o tabeli. b) koriste sve kolone indeksa po redosledu različitom od njihovog redosleda
u indeksu
U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele.
e) koriste sve kolone indeksa po redosledu jednakom njihovom redosledu
u indeksu
Sažetak d) koristi desni kraj grupe indeksiranih kolona
• Strukturu baze podataka možete optimizovati tako što ćete odabrati tipove poda- 5. Upotrebite komandu OPTIMIZE TABLE
taka manje veličine i fiksne dužine, definisati odgovarajuće indekse i koristiti
a) čim definišete tabelu, da biste poboljšali njenu strukturu
odgovarajuće tipove tabela.
b) kada koristite InnoDB tabele, da biste smanjili opterećenje sistema
• Indeksi omogućavaju brzo pronalaženje zapisa traženih na osnovu vrednosti u
indeksiranim kolonama. e) nakon izvršavanja većeg broja komandi SELECT nad tabelom
• Indeks će biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona d) nakon izvršavanja većeg broja komandi DELETE nad tabelom
ili kolone, ili levi kraj grupe indeksiranih kolona.
• Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju sličnu defrag-
mentiranju čvrstog diska.
- .~ ... ~~· --·-··,J ----- 1"" __ _ ...........

Vežbe
U kojem će od sledećih upita u bazi podataka employee biti upotrebljeni indeksi?
(Potražite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tačnu strukturu
baze podataka. Ili, ako ste je instalirali na svoj računar, pogledajte pomoću komande
describe koje su sve kolone indeksirane.)
..
19
a)
select *
from employee
Optimizovanje upita
where departmentiD=128;
b)
select employeeiD
from assignment
where clientiD=l;
e)
select skill, count(skill)
M YSQL OMOGUĆAVA DA ANALIZIRATE upit da biste saznali za koje se vreme

from employeeSkills
izvrši i kako se tačno izvršava nad sadržajem baze podataka. Na osnovu tih podataka
group by skill; i poznavanja načina na koji MySQL pokušava da optimizuje upite, ponekad možete
da poboljšate performanse upita. U ovom poglavlju razmotrićemo sledeće teme:
Ako ovi upiti treba da se često izvršavaju, koje biste dodatne indekse napravili?
• Otkrivanje sporih upita
• Merenje performansi upita
Odgovori • Upotreba dnevnika sporih upita
• Upotreba komande EXPLAIN za prikazivanje načina na koji se upiti izvršavaju
Pitanja
• MySQL-ov ugrađeni mehanizam za optimizovanje upita
l. b
2. e • Saveti o optimizovanju upita
3. e
4. b Otkrivanje sporih upita
S. d Da biste optimizovali određenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju
najveći udeo u ukupnom vremenu izvršavanja. To možete obaviti na nekoliko načina:

Vežbe • Posmatranjem: Često zaključujemo daje neophodno optimizovanje zbog toga što
[ndeks se koristi samo u upitu pod tačkom b). se određeni upit izvršava brzinom premorenog puža.
Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill. • Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije
izvršavaju.
U sledećem poglavlju • Uvidom u dnevnik sporih upita: U ovaj dnevnik beleže se spori upiti, kao što biste
U s ledećem (i poslednjem) poglavlju, "Optimizovanje upita", razmotrićemo kako i očekivali na osnovu njegovog imena.
možete utvrditi da li se određeni upit izvršava brzo ili sporo, i zbog čega, kao i to kako Pošto identifikujete spori upit, pomoću komande EXPLAIN možete saznati kako ga
rešiti problem. MySQL tačno izvršava da biste zatim pokušali da ga optimizujete.
Najčešće nije potrebno da ubrzate baš sve upite koji se koriste u aplikaciji . Obično
samo manji deo koda oduzima najveći deo ukupnog vremena izvršavanja. Ukoliko
vaš sistem nije izuzetno opterećen, besmisleno je da gubite vreme pokušavajući da
ubrzate delove aplikacije čiji je udeo u ukupnom vremenu relativno mali.
upotreoa komande EXPLAIN za prikazivanje načina na koji sc upili l1vr .!Valu

Beleženje sporih upita u dnevnik možete uključiti pomoću opcije --log- slow
Merenje performansi upita -queries=imedatoteke, koju zadate kada pokrećete MySQL, ili u datoteci opcija.
Merenje performansi (engl. benchmarking) korisno je za rešavanje svih vrsta problen:a
Ako uključite i opciju --log-long-format, biće evidentirani i svi upiti pri čijem sc
optimizovanja. Merenje performansi u ovom slučaju znači merenje vremena za koje
izvršavanju ne koristi nijedan indeks. To vam može pomoći da lakše utvrdite čemu
se upit izvrši. Najbolje je da upit izvršite više puta i da zatim izračunate prosečno
treba da f>osvetite najviše pažnje pri optimizovanju.
vreme njegovog izvršavanja. Budući da trajanje jednog izvršavanja upita zavisi od
Zadavanjem vrednosti promenljivoj long_query_time određujete šta je za vas
ukupnog opterećenja sistema, samo jedno merenje može dati neočekivane rezultate.
spor upit. Možete je zadati u konfiguracionoj datoteci ili pomoću komande SET.
Otkrićete i to da bi upit trebalo da se brže izvrši kada ga pokrenete drugi put jer je
Vrednost te promenljive izražava se u sekundama.
smešten u ostavu (keš).
Dnevnik sporih upita možete čitati neposredno jer je to obična tekstualna datoteka.
Razume se, možete koristiti spoljne skriptove ili programe posebno napisane tako
Možda ćete smatrati korisnijim sažet spisak upita koji se sporo izvršavaju. Takav spisak
da isti upit izvršavaju više puta. Ako vas zanima primer takvog programa, preuzmite
možete prikazati pomoću skripta mysqldumpslow (u direktorijumu scripts instalacije
distribuciju MySQL-a sa izvornim kodom i potražite programe za merenje perfor-
MySQL-a). Pošto je to skript napisan na jeziku Perl, ako koristite Windows, morate
mansi u direktorijumu sql-bench.
prethodno instalirati Perl ukoliko gaj oš nemate. (Preuzmite ga sa adrese www. active-
U MySQL-u možete meriti brzinu izračunavanja vrednosti bilo kojeg izraza
state. com.)
(uključujući i upita) pomoću ugrađene funkcije BENCHMARK(). Na primer:
Jedno od tekućih ograničenja MySQL-ajeste to da ne beleži spore upite čije
select benchmark(lOOOOOO, 6*9); izvršavanje traje manje od sekunde. Na sistemima koji obrađuju relativno veliki broj
Ova komanda daje rezultate nalik na sledeće: jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator će
+-------------------------+ možda želeti da zna kojim je upitima potrebno više od desetinke ili nekog drugog dela
l benchmark (1000000, 6*9) l sekunde. To će biti obezbeđeno u jednoj od budućih verzija MySQL-a.
+-------- -----------------+
o l
+-------------------------+ Upotreba komande EXPLAIN za prikazivanje načina
row in set sec)
1 (0.25
na koji se upiti izvršavaju
Funkcija prihvata dva parametra: koliko puta treba izračunati vrednost izraza Komanda EXPLAIN nalaže MySQL-u da "objasni" kako namerava da izvrši upit. Kao
(u ovom primeru, milion puta) i izraz koji se izračunava (u ovom primeru, šest puta jednostavan primer, možete zadati sledeće:
deve0. .. explain
Budući da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa
select e.name, d.name
BENCHMARK () uvek vraća rezultat nula. Pri merenju nas zaista zanima za koje vreme se from employee e, department d
upit izvršio. Iz navedenog primera rezultata vidi se daje izračunavanje proizvoda 6 x 9 where e.departmentiD = d .departmentiD;
milion puta na mom računaru trajalo četvrtinu sekunde. Kao što vidite, ispred jednog sasvim običnog upita samo smo dodali re č EXPLAIN.
Funkciji BENCHMARK () možete proslediti i tekst upita, na primer: Zbog toga se upit neće izvršiti,jedino će se prikazati podaci o tome kako MySQL pla-
selec t benchmark(lOOOOOOO, nira da izvrši upit. Trebalo bi da se prikažu rezultati nalik na sledeće:
'select employee.name, department.name ... --- +·------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+
from employee, department 1 id 1 select_type 1 table l type l possible_keys l key l key_len l ref l rows l Extra l
where employee.departmentiD=department.departmentiD'); +---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+
l l l SIMPLE l e l ALL l NULL l NULL l NULL l NULL l 5 l l
l 1 l SIMPLE l d l eq_ref l PRI MARY l PRIMARY l 4 l e. department ID l l l l
+--- -+------ ------ -·------ -+--- ---- -+-------------- -+-------- -+--------- +--------------- -+----- -+------ -+
2 rows in set (O. OO sec)
Upotreba dnevnika sporih upita . v • •
Šta sve ovo tačno znači? Uočljivo je da se u skupu rezultata pojavljuje po jedan red
Pomoću dnevnika sporih upita možete utvrditi koji se upiti presporo IzvrsavaJU. S~nu za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim će tabele biti spo
ddinišete šta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU jene u upitu.
vrednost.
•••y-'u'--uv uyraaen1 mehamzam optimizovanja upita

Tabela rezultata ima sledeće kolone: Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:
• id Redni broj. Ako jedan upit sadrži više komand1 !.J EI .EC" I' - 11,1 JliiiiH:I, bd.1 • ref Iz tabele će biti učitani svi redovi koji sadrže vrednosti jednake vredno-
je u upit ugrađen podupit- svaka komanda SELECT dobtj.l SV<~J rL·dni broj . stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
• select type Vrsta komande SELECT koja se izvršava. U ve ć ini s lu čajeva, ova radite s ključevima čije vrednosti nisu jedinstvene .
kolona ~adržaće reč SIMPLE, kao u prethodnom primeru, što zna či daje u pitanju • range Ovaj tip spoja je slabiji od tipa eq_ref , pa ča k i od ref, a znači da će iz
sasvim običan upit SELECT. Ako imate podupite, spoljni upit će biti označen tabele biti učitani svi redovi iz odredenog opsega.
rečju PRIMARY a unutrašnji upiti biće označeni rečima SUBSELECT ili DEPENDENT • index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo-
SUBSELECT u slučaju koreliranih upita. jeva. Kada se prikaže tip index, to znači da će biti pretražen ceo indeks. To je
• table Ime tabele na koju se red odnosi. bolje od pretraživanja cele tabele, ali daleko je od savršenog.
• type Ovo je najvažnija kolona pri optimizovanju i prikazuje na koji će način Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department
tabela biti spojena s drugim tabelama u upitu. prikazana je opcija PRI MARY i ime kolone primarnog ključa, što je kolona ključa koja
• possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u će biti upotrebljena. Red tabele employee sadrži vrednost NULL u obe navedene
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se reč kolone, što znači da nema ključa koji se može upotrebiti i zato neće biti upotrebljen
NULL. nijedan. To je još jedna prilično jasna naznaka da tabeli treba dodati nov indeks!
• key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nije- Na osnovu tih podataka i pod pretpostavkom da će taj upit biti relativno često
dan, u koloni se prikazuje reč NULL. izvršavan, pa bismo zbog toga želeli da bude brži, napravićemo sledeći indeks:
• key len Dužina indeksa koji je MySQL odlučio da upotrebi. create index ename_did on employee(name, departmentiD);
• ref Vrednost s kojom se poredi sadržaj kolone ključa pri odlučivanju koji se Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako:
redovi izdvajaju u skup rezultata upita. +--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- -·-------- ---- -·
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
• rows Pro cena broja redova koje će MySQL morati da pročita iz jedne tabele da +--- -·--- ---------- +----- --+-- -- --- -·----- --------- -+-- -------- -+-------- - +------- ------- --+----- -+----- ------- -+
l l l SIMPLE l e l index l NULL l ename_did l 85 1 NULL 1 S l Using index l
bi se dobio rezultat upita. Množenjem vrednosti broja redova možete utvrditi l l l SIMPLE l d l eq_ref l PRIMARY l PRIMARY l 4 l e.departmentiD l l l l
+---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+
koliko će redova biti učitano. Time dobijate red veličine brzine izvršavanja upita. 2 rows in set (0. OO sec)

• Extra Ova kolona može sadržati dodatne podatke. Na primer, komentar Promene su očigledne. U redu tabele employee sada stoji daje tip spoja index jer
using index zači da MySQL može u potpunosti učitati rezultate upita iz jednog postoji indeks koji se može upotrebiti. Novi indeks je naveden kao moguć ključ , ali
neće biti upotrebljen. U koloni Extra stoji da će za tu tabelu biti upotrebljen indeks
od indeksa i nema potrebe da učitava podatke iz tabele.
umesto same tabele, zahvaljujući čemu bi trebalo da upit bude nešto brži.
Dakle, šta nam rezultati govore u ovom primeru? Najčešća upotreba komande EXPLAIN jeste za utvrđivanje da li biste pomoću bolje
Tip spoja ALL za tabelu employee znači da će biti pretraženi svi redovi te tabele. osmišljenih indeksa mogli da ubrzate upite, ali otkrićete da se to može postići i na
Razume se, to će biti spora operacija ako tabela sadrži veliku količinu podataka. U druge načine.
stvari, spoj tipa ALL je najgori mogući rezultat. Njega ćete dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. Očigledna optimizac4ija u tom slu-
čaju jeste da dodate odgovarajući indeks. To je objašnjeno u nastavku ovog poglavlja. MySOL-ov ugrađeni mehanizam optimizovanja upita
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, što znači da MySQL prim.enjuje na upite više pravila optimizovanja.
će se iz tabele department učitati po jedan red za svaki red iz tabele employee. To je Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL
jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i utvrđuje koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro-
cons t, što znači da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da cena pogrešna, odredbom STRAIGHT JOIN izričito zadajte redosled spajanja tabela.
sc zato ta tabela može tretirati u upitu kao konstanta. Tekući tip spoja u upitu prilično Merenjem performansi upita pre i posle te izmene, utvrdićete da li time stvari pobolj
nam odgovara. šavate ili pogoršavate.
Kada bira indeks, MySQL traži odgovarajući indeks koji obuhvata manje od 30"/u
redova tabele. Ako ne uspe da pronađe indeks koji ispunjava te uslove, sekvenCIJalno
pretražuje 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 način sličan onome na koji mnogi pre- Pitanja
vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvišne
1. funkcija BENCHMARK () vraća
zagrade. To je jedan od razloga zbog kojih možete slobodno dodavati zagrade u tekst
upita da bi postao lakše razumljiv. a) rezultat izraza čije izvršav;liiJL' llll'JII• ·
Ako se potpun rezultat upita može dobiti iz podataka sadržanih u indeksima, iz b) vreme potrebno za izvršavanJL' lllollol ~"JI 1111 JilL
tabela se neće u čitati nijedan red. Rezultat funkcije COUNT ( *} takođe se dobija bez e) nulu, bez obzira na ulazne JW .IIIH'IIl'
čitanja i prebrojavanja redova tabele jer su podaci potrebni za tu namenu smešteni d) nijedno od prethodnog
odvojeno od tabele (u indeksu).
2. Izda·li· ste k?mandu EXPLAIN za odredeni up1t 1 11 ~ 11 10111 1 YI' 1, ,j 11 , 1 1 d orl
Budući da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija dob1h ste t1p spoja ALL. To znači
111 1

koje MySQL obavlja, ovde ga nismo ponovili. Ali čak i taj spisak nije potpun. Ako vas
a) da će iz tabele biti učitan samo jedan IL'd
zanima kako radi optirnizator upita, možete čitati njegov izvorni kod.
b) d~ će ~z tabele biti učitani svi redovi koji sadrže vredu osti JL'd. 111 kt· VH·dnn
st1ma mdeksa
Preporuke za optimizovanje upita e) da će biti sekvencijalno pretražen ceo indeks
Postoje tri najvažnije stvari koje možete uraditi da biste optimizovali svoje upite: d) da će biti sekvencijalno pretražena cela tabela
• Dodajte odgovarajuće indekse. Ako imate upit nad neindeksiranom kolo- 3. Izd~i ste k?man~u EXPLAIN za određeni upit i u koloni type jedne od tabela
nom koji se često izvršava, dodajte indeks za tu kolonu. Više informacija o tome dob1h ste t1p spoja eq ref. To znači
kako MySQL koristi indekse naći ćete u poglavlju 18, "Optimizovanje baze a) da će iz tabele biti u čitan samo jedan red
podataka". Međutim, ne zaboravite sledeće: iako odgovarajući indeks može
ubrzati postupak pronalaženja podataka u tabeli, održavanje indeksa u ažurnom b) d~ Će ~z tabele biti u čitani svi redovi koji sadrže vrednosti jedanke vredno-
stlma mdeksa
stanju produžuje upisivanje podataka. Nemojte dodavati indekse koji se neće
koristiti. e) da će biti sekvencijalno pretražen ceo indeks
• Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana d) da Će biti sekvencijalno pretražena cela tabela
u poglavlju 18.) Time ažurirate podatke o raspodeli vrednosti ključeva koje 4. Izda.li ste k?mandu EXPLAIN za određeni upit i u koloni type jedne od tabela
MySQL čuva. Na osnovu tih podataka, MySQL određuje redosled spajanja dob1h ste t1p spoja index. To znači
tabela u upitu. Ako vam se čini da MySQL spaja tabele čudnim redosledom, a) da će iz tabele biti učitan samo jedan red
pokušajte s komandom ANALYZE TABLE. b) da će ~z tabele biti učitani svi redovi koji sadrže vrednosti jedanke vredno-
• Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u Stlma mdeksa
poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i ažuri- e) da će biti sekvencijalno pretražen ceo indeks
rate statističke podatke o tabeli koje koristi optimizator upita. d) da će biti sekvencijalno pretražena cela tabela
S. ~ezultati komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimal-
Sažetak mm redosledom. Zbog toga bi trebalo da
• Otkrijte spore upite pomoću funkcije BENCHMARK (} ili dnevnika sporih upita. a) izdate komandu ANALYZE TABLE za obe tabele
• Pomoću komande EXPLAIN utvrdite kako se upiti izvršavaju b) izričito zadate redosled spajanja pomoću odredbe STRAIGHT JOIN

• Ubrzajte izvršavanje upita dodavanjem indeksa a zatim ih ponovo ispitajte e) ili a) ili b)
pomoću komande EXPLAIN. d) ni a) ni b)
• Komande ANALYZE TABLE i OPTIMIZE TABLE pomoći Će MySQL-ovom optimi-
zatoru upita da dobro obavi svoj posao.
240 Poglavlje 19 Optimizovanje upita

Spisak termina korišćenih u knjizi


Vežbe
Pogledajte sledeći upit:
alijas alias nedelji vost atomicity
select department.name atribut, obeležje attribrtle niti izvršavanja thread s
from client, assignment, employee, department
b-stablo b-tree obeležje, atribut attribute
where client.name='Telco Inc'
and client.clientiD = assignment.clientiD bafer za čitanje read bt!!Jer ostava za tabele table cache
and assignment.employeeiD = employee.employeeiD bafer za ključeve key br"!!fer otpornost sistema fau/t tolerance
and employee.departmentiD = department.departmentiD; bafer za sortiranje sort br!ffer na greške
Pomoću funkcije BENCHMARK više puta izmerite vreme izvršavanja ovog upita bafer za zapise record br!lfer podu pit subquery
i pomoću komande EXPLAIN utvrdite kako se on izvršava. Proverite da li možete blokiranje sledećeg next key /ocking polje field
povećati brzinu izvršavanja dodavanjem novog indeksa i ponovnim merenjem. ključa poništiti roll back
čitanje sadržaja tabele table scan potvrditi commit
sekvencijalnim preklapanje između fa ilo ver
Odgovori redosledom dva servera
datoteka slike sta~a dumpfile "na vruće"
Pitanja Dekartov proizvod Cartesian product prenosni dnevnik re/ay log
1. e dnevnik grešaka error log pretraživa~e stemming
2. d dnevnik izmena binary log od korena
dnevnik sporih upita slow query log pun spoj, full join
3. a
dnevnik upita query log unakrsni spoj
4. e
fantomski podaci phantom reads rad sa više glavnih multimastering
5. e funkcionalna functional servera istovremeno
zavisnost dependency raspoređivanje load balancing
glavni server master opterećenja
jednakovredni spoj equijoin red row
jezik za definisanje Data Diftnition sistem za upravljanje Relational Database
podataka Language, DDL relacionim bazama Management
jezik za rad Data Manipulation podataka System, RDBMS
s podacima Language, DML slog, zapis record
kandidati za ključeve candidate keys spoJ join
ključ key spoljni ključ foreign key
koeficijent poveza- relevance value superključ superkey
nosti s traženim Šema baze podataka database schema
poJmOm tabela table
kolona column ugnežđen upit nested query
korelira n correlated unakrsni spoj, full join
mašina za skladištenje storage engine pun spoJ
merenje performansi benchmarking zapis, slog record
n-torkc tup/es zavisni server slave
nebitne reči stop words
SVEUCIIlŠNA l<Nl\ŽN\0\
Rl J KA
Indeks

Simboli anonimni nalozi, brisanje, 17,


202-203
izrada rezervnih kopU.1 i
restauriranje podatak:l
ansi, opcija, podešavanje komauda BACKUI'TilBL/i,
l (deljenje), operator, 110 MySQL-a, 172
= (jednako), operator, 111 194
ANY, rezervisana re č, 102 komauda RESTORE TABLI'
A (karet), znak, 116 aplikacije, provera ulaznih 194 .•
<(manje od), operator, 111 podataka, 204
\ (obrnuta kosa crta), 67 mogubwsti, 187-188
aritrnetički operatori, 110
-(oduzimanje), operator, 110 pomo{u duevuika iz meua,
atributi, tabele baze podataka, 31
+ (sabiranje), operator, 110 194-195
AUTO INCREMENT, rezervisana
; (tačka i zarez), 46 mči1o, 19 3-194
reč, 49-51
>(veće od), operator, 111
autocornmit, režim rada skript mysqldump, 188-192
$(znak za dolar),116 transakcija, 147 skript mysqlhotcopy, 192- 193
* (zvezdica), 110, 116 AVG ROW LENGTH, opcija, tabele, proveravmlje i popravljmljc,
optirnizovanje tabela, 51 195-198
testirmlje rezervtle kopije, 195
Brojevi avg(), funkcija, 122
ažuriranje redova tabela, 72-73 zaklju{avatlje tabela, 18 8
izrada, komanda CREATE
1NF (prva normalna forma), DATABASE, 43
34-36 B komanda ANALYZE TABLE
2NF (druga normalna forma), 230 •
36-37 BACKUP TABLE, komanda, 194
3NF (treća normalna forma), optimizovanje
bafer za čitanje, 224 iudeksi, 229-230
37-38 bafer za ključeve, definicija, 223 izbori pri projektovarlju, 228
bafer za sortiranje, 224 komat~da OPTIMIZETABLE
A baferi, 223 230 •
basedir, opcija, podešavanje
preporuke, 227-228
MySQL-a, 172
abs(), funkcija, 118 principi projektovanja
baze podataka
ACID usklađenost, transakcije, auomalije, 33-34
adtninistriranje
149-150 twrmalizovatlje, 3 4-3 8
activestate.com, Web lokacija, 235 datoteke duevuika, 183
NULL vreduosti, 34
adddate(),funkcija, 119 MySQL server, pokretmlje
i spuftmlje, 177-17 8 reduudmlttwst i gubljetlje
administriranje baze podataka podataka, 33
datoteke dnevnika, 183 pra:bljetlje ostava, 182-183
važua pitmy·a, 32
MySQL server, pokretanje prikazivmlje podataka o bazi,
relacije
i spuštanje, 177-178 178-180
d~f/uiciia, 29
pražnjenje ostava, 182-183 prikazivmlje podataka o
tipa ,Jeda tl prema jedau", 2 9
prikazivanje podataka o bazi, dodeljeuim pravima, 181
prikazivmlje podataka o procesima tipa .,jeda tl prema viJe", 2 9
178-180 tipa" više prema vi!e 11, 2 9
prikazivanje podataka 181 '
rep likovanje
o dodeljenim pravima, 181 prikazivanje podataka o tabelama,
181-182 beziJedtlostle mere, 211
prikazivanje podataka budt.tbwst, 216
o procesima, 181 prikazivatlje statusa servera
d11evuik izmwa, 21 O
prikazivanje podataka o tabelama, i vreduosti serverskih
promeuljivih, 180 dodeljivatlje prava za, 211
181-182 kopije teku{eg stmy·a, pravljery·e,
prikazivanje statusa servera servers ke promeuljive, pode!avatlje,
182 212-214
i vrednosti serverskih otpomost Ila gre!ke, 209
promenljivih, 180 skript mysqladmiu, lista opcija,
184 preklapatlje servera 11a vm{e, 217
skript mysqladmin,lista opcija, pri11cipi, 209-21 O
184 utli!tavarlje uiti, 182
biranje, 43 provera glavtwg servera, 2 12
uništavanje niti, 182 raspoređivatlje opterdetlja, 2 15
alijasi, komanda SELECT, 82-83 brisanje, 56
upotrebljive verz;;e MySQL·tt,
ALL, pravo, 160 entiteti, definicija, 29
identifikatori 210
ALL, rezervisana reč, 102
dozvoljeu broj zuakova, 43 vifestn1ki glav11i serveri, 2 17
ALTER TABLE, komanda, 56-57
zavistti serveri, pode!mm1~je
ANALYZE TABLE, komanda, 230, rwvoduici, 43
238 i pokretmlje, 2 14
rezervismJe reli, 43
AND, operator, 112 sistem za upravUanjc rci.Ki<lllllll
indeksi
anomalije brismlje, 56 bazama podat.1k.1
pri ažuriranju podataka, 34 izrada, 55-56 (RDBMS),11
pri brisanju podataka, 34 šema, dcfink•J-•, l~
pri dodavanju podataka, 33
4 Indeks

tabele indeksa, 56 datumski tipovi podataka, 54 E lower(), 114 grupnt• luni. t ll•, l J l l
ALTER TABLE, 56 redova iz tabela, 7Q-72 dayname(), funkcija, 119 MATCH,115 grupno ttOHINtlt pn1l11ltt~n,
atribwi, 31 tabele, 56 db, tabela, prava pristupa, 163 max(),122 gubljenjo• (llHiucul.,, l
Ernie Application Cluster, alatka, redunduutuw•t.sunJ• ktn ~~~J
BerkeleyDB (BDB), 50, 135 brisanje redova, komanda DDL (Data Definition Language), md5(),121
42 217 baza pothohol.u, l l
brisanje, 5 6 TRUNCATE, 72 min(), 122
Decimal, tip podataka, 52 encrypt(), funkcija, 121
fimkcioualne zavisnosti, 32 brojevi s pokretnim zarezom, 48 entiteti,definicija,29 mod(),118
gmptw r111ofenje podataka, 73-75 b-stabla, 135 DEFAULT, odredba, komanda
INSERT,69 ENUM, tip podataka, 54 now(),119
numeričke, 117-118
H
HEAP, 50, 138 EXECUTE, pravo, 159
DEFAULT, rezervisana reč, 49
indeksi, 229-230
lmwDB, 50, 134-135
e defragmentiranje MyiSAM tabele, EXISTS, rezervisana reč, 102
EXPLAIN, rezervisana reč, podaci
operatori
aritmetitki, 11 O
Hafmanovo kodirnnjt•,
komprimovanjt.• litlwl1t, l' l
130
ISAM, 50, 128-129 o izvršavanju upita, 235-237 logitki, 112 HAVING, odredba, konmnolu
CASE, funkcija, 113 DELAY KEY WRITE opcija,
ključevi, 31 extra, vrednost, komanda za poredetife vred11osti, 11 Q-112 SELECT, 87
cast, funkcija, 120 optimizovanje tabela, 51
ko/otre, 31, 52-55, 80 ceiling(), funkcija, 118 DELAYED, odredba, komanda EXPLAIN, 236 password(), 121 HEAP, tip tabela, 50, 138
komanda CREATETABLE, INSERT, 68 extract(), funkcija, 119 power(), 118 host, tabela, prava pristupa
celo brojni tipovi podataka, 52
48-52 CHAR, tip podataka, 53 DELETE, komanda, 7Q-72 quote(), 114 kolone za opseg vidljivmu, l (1 ,\
MERCE, 136-137 rand(), 118 kolone za prava, 163
merge, 50
CHECK TABLE, komanda, 196 DELETE, pravo, 159 F replace(), 114
CHECKSUM, opcija, deljenje (/),operator, 110
MylSAM, 50, 129-134 optimizovanje tabela, 51 describe, komanda, 48 RLIKE,115-117
uovi redovi, umeta11je, 65-69 ciklična promena datoteka desni spoj, 98-99
fantomski podaci, nivo round(),118 I
izolovanosti transakcija, 151
n-torke, 31 dnevnika, 183 dinamičke MyiSAM tabele,
FIELDS, odredba, komanda
soundex(), 114
podrfka za tramakcije, 127-128 column_priv, kolona 129-130 sqrt(), 118 id, opcija, komanda EXPLAIN,
LOAD DATA INFILE, 74 236
pod11piti čiji Je rezultat Jedna tabela columns_priv, 164 DISTINCT, odredba, komanda
FILE, pravo, 160,203 std(), 122
vrednost, tao-t 01 tabela tables_priv, 164 SELECT, 84-86 STRCMP,115,117 IDENTIFIED BY, odredba,
filtriranje ulaznih podataka, komanda GRANT, 158
podupiti za izraze logitkog tipa, colum.ns_priv, tabela, prava DML (Data Manipulation bezbednosne preporuke, 204 subdate(), 119
101-103 pristupa, 164 Language), 42, 65 substring(), 114 identifikatori
FLOAT, tip podataka, 53 maksimalan broj znakova, 43
podupiti za izvedme tabele, 1OO COMMENT, komanda dnevnici sum(), 122
float, tip podataka, 48 navodnici, 42
pra"", 161-164 optimizovanje tabela, 51 aktiviranje, 183 floor(), funkcija, 118 timestamp, 119
conv(), funkcija, 114 dnevnik grešaka, 183 razlikovanje malih i velikih slov:1,
prav!ietife, 44-52 FLUSH, komanda, pražnjenje trim(),114
preimeiiOIJ(Itife, 57 convert(), funkcija, 120 log-bin, opcija, podešavanje ugrađene, 109
42
ostava, 182-183
count(), funkcija, 122 MySQL-a, 172 rezervisane reči, 43
redovi, 31 FLUSH PRIVILEGES, komanda, upper(), 114
CREATE, pravo, 159 log-error, opcija, podešavanje 202-203 z.'l rad s datumima i vremen itna,
IF, funkcija, 113
redovi, azurirmife, 72-73
CREATE DATABASE, SQL-ova MySQL-a, 172 IF NOT EXISTS, odredba, 49
redovi, brismife, 7Q-72 FLUSHTABLES, komanda, 137, 119-120
komanda, 43 log-slow-queries, opcija, IGNORE, odredba
redovi, brismife pomoću koma11de 193 za rad sa znakovnim vrednostima
CREATE TABLE, SQL-ova podešavanje MySQL-a, 172 FOREIGN KEY, rezervisana reč, komanda INSERT, 69
TRUNCATE, 72 obrada zuakovuih vreduosti, 114 komanda LOAD DATA IN FILE,
komanda, 44, 48-52 opcije za dnevnike izmena, 50
redovi, drtpliralli, 84-86 CREATE TEMPORARY TABLES,
poredenje ztrakovuih vred11osti,
podešavanje MySQL-a, 173 found rows(), funkcija, 121 74
redovi, učita""tife, 83-84 pravo, 159 115-117 komanda UPDATE, 72
redovi, zameua, 70 prenosni, 21 O fragmentacija, My ISAM tabele, za upravljanje tokom izvrlavanja,
CSV format, 75 sporih upita, 183, 234-235 130 IN, rezervisana reč, 101
redovi rezulltZta upittr,gmpismy·e, curdate(), funkcija, 119 113 indeksi
86-87 u Linuxu, 183 FROM, odredba funkcije za rad s datumima
curtime() funkcija, 119 podupiti, za izvedene tabele, 100 brisanje, 56
spa)m!je, 95-99 upita, 183 i vremenima, 119-120
dnevnik izmena spojevi, 94 izrada, 55-56
stnrktura, metifmife, 56-57 funkcije za upravljanje tokom
jednokolonski, 229
zada""•ife imena u kommrdi D opis, 183 FULLTEXT rezervisana reč, 50 izvršavanja, 113
levi kraj grupe, 229
rep! ikovanje, 21 O funkcije funkcionalne zavisnosti, koncepti
SELECT, 81-82 optimizovanje baze podataka, 227,
data, direktorij um, 20 restauriranje baze podataka, abs(),118 i terminologija, 32
zapisi, 31 229-230
Data Definition Language (DDL), 194-195 addda te(), 119
zadavanje apsolutnih in1ena., optimizovanje upita, 238
42 does, direktorij um, 20 avg(), 122
81-82 G višekolonski, 229
DATA DIRECTORY, opcija, dodeljivanje prava, 157 benchmark(), 121 , 234
BCNF (Boyce-Coddova normalna INDEX, rezervisana reč, 50
forma), 38 optimizovanje tabela, 51 globalna prava, 160 CASE, 113
Data Manipulation Language prava za administratore, 159 cast, 120 glavni serveri, replikovanje, INDEX, pravo, 159
DDB (Berkeley), tip tabela, 50, 135 index, vrednost, komanda
(DML), 42, 65 prava za obične korisnike, 159 ceiling(), 118 podešavanje, 209-212, 215
benchmark(), funkcija, 121, 234 EXPLAIN, 237
datadir, opcija, podešavanje tabele prava, 161 concat(), 114 globalna prava
llcrkeleyDB (BDB), tip tabela, 50, INDEX DIRECTORY, opcija,
135 MySQL-a, 172 za pojedinačne baze podataka, 160 convert(), 114,120 dodeljivanje, 160
zaštita servera, 202 optimizovanje tabela, 51
IIIGINT, celobrojni tip podataka, DATETIME, tip podataka, 55 za pojedinačne kolone, 161 counc(), 122
Google, Web lokacija, 135 InnoDB, konfiguracione opcije,
53 datoteke za replikovanje, 211 curdate(), 119
GRANT, komanda podešavanje MySQL-a,
hin, dlrektorijum, 20 dnevnika, 183 dolar($), znak, 116 curtime(), 119
odredba IDENTIFIED BY, 158 172-173
IIINARY, rezervisana reč, 111 slike stanja, 188 DOUBLE, tip podataka, 53 dayname(), 119 lnnoDB, tip tabela, 50
hir<~ nje datoteke opcija, podešavanje drop database, komanda, 45, 56 encrypc(), 121 odredba ON,158
odredba REQUIRE, 159 dosledno učitavanje bez
b.t7C podataka, komanda use, 43 MySQL-a, 169-171 DROP INDEX, komanda, 56 extract, 11 9 zaključavanja pod1caka, 134
u č itavanje podataka iz redova internacionalizovanje, 174 DROP TABLE, komanda, 56, 191, floor(), 118 odredba TO, 158
odredba WITH, 159 transakcije, 143-146
tn bela, 83-84 konfiguracione opcije za više 194 found rows(), 121
odredba WITH GRANT ACID uskladeuost, 149-/50
DLOB, tip podataka, 54 inst.:llacija na istom računaru, DROP, pravo, 160 grupne, 121-122
173-174 druga normalna forma (2NF), OPTION,159 izolo""11ost tmn<akcij11, 150- 152
Doyce-Coddova normalna forma IF, 113
36-37 grantor, kolona, tabela tables_priv, reZi lli đlltOCOrtllllit, J47- /49
(DCNF),38 mysqld, podešavanje opcija za, last insert id(), 121
hrh<~njc dupli rani redovi, 84-86 164 uslovi licence, 135
171-172 length(), 114
.11tnn11nr11h naloga, 17, 202-203 GROUP BY, odredba, komanda Web lokacij.t, 135
opcije za InnoDB, 172-173 LIKE,115
SELECT, 86-87 zaključavanje pud.t1.t~.1 11,1 IIIVnll
h.".1 p<><b t,,ka, 56 load file, 114
grupisanje redova rezultata upita, rcd.t, 13-1
locate(), 114
86-87
Indeks hill ~

INSERT, komanda pomoću dnevnika izmena, kolone za pravo, 162 L min(), funkcija, 122 opcija --cxtcnd•·d ""'"" • l 'J l
listing, 6S-66 194-19S kolatze za uspostavlj"anje zaftićene množenje (*),operator, 110 opcija --lock- tabl,.,, l 1!2
odredbe, 68-69 razlozi, 1 87 veze, 162 mod(), funkcija, 118 opcija --no- dara, IIJ2
last insert id(), funkcija, 121
opšti oblik, 68 ručno, 193-194 učitavanje podataka iz odredenih My ISAM, tip tabela, SO opcija --opt, 188
length(), funkcija, 114
primer rezultata, 67 skript mysqldump kolona, 80 dinamičke, 129-130 opcija --quick, 191
levi spoj, 98-99
INSERT, pravo, 1S9 nedostaci, 192 znakovni i tekstualni tipovi LIKE, funkcija, 11S komprimovanje, 131 prednosti, 192
INSERT METHOD, opcija, opcija --add-drop-table, 191 podataka LIKE, odredba, 49 poboljšanja u odnosu na ISAM primer rezultata, '188 l 'J l
optirnizovanje tabela, S1 opcija --add-locks, 191 BLOB, 54 LIMIT, odredba tabele, 129 mysqlhotcopy, skript, 192· l 9.1
instaliranje MySQL-a opcija --all-databases, 192 CI-JAR, 53 komanda DELETE, 72 popravljanje, 130 mysqlshow, program, 20
anonimni nalozi, brisanje, 17 opcija --allow-keywords, 192 ENUM, 54 komanda SELECT, 88-89 pregled, 129
lozinka korisnika root, zadavanje, opcija --d, 192 SET, 54 komanda UPDATE, 72 statičke, 129-130
17 opcija --databases, 192 TEXT, 54 LINES, odredba, komanda LOAD tekstualno pretraživanje, 131-134 N
na Linux, 12 opcija --extmded-imert, 191 VARCHAR,54 DATA INFILE, 74 myisamchk, ala tka za komandnu
naOSX,14 opcija --lock-tables, 192 kolone za ograničavanje upotrebe Linux, instaliranje MySQL-a na, 12 liniju, 130 naredbe. Videti i komande
naWindows,12-14 opcija --no-data, 192 resursa, tabela user, 162 listinzi myisamchk, program, 20, 196-197 ALTER TABLE, S6
nalozi, pravljenje za uobič~ene opcija --opt, 18 8 kolone za uspostavljanje zaštićene baza podataka, formiranje tabela, MySQL DROP TABLE, 191
poslove, 17-18 opcija --quick, 191 veze, tabela user, 162 44-4S instaliranje, 9, 11 FL USH PRIVILEGES, 202· ·20.1
podešavanje sistema, 14-16 predtwsti, 192 komande. Videti i naredbe instaliranje MySQL-a, auonimtzi tuzlozi, brisanje, 17 GRANT,1S8-1S9
provera da li sistem radi, 16-17 primer rezultata, 188-191 ALTER TABLE, S7 konfiguracione opcije, lozi11ka korimika root, zadava11je, LOAD DATA INF! LE, 73-7S
instalirane datoteke, zaštita skript mysqlhotcopy, 192-193 ANALYZE TABLE, 230,238 14-16 17 LOCK TABLES, 191
filtriranje podataka, 204 tabele, proveravanje i popravljanje CHECKTABLE,196 izrada rezervnih kopija i Ila U11ux, 12 ON, komanda GRANT, 1S8
ftzička zaštita, 20S komanda CHECKTABLE, 196 COMMIT, transakcije, 147 restauriranje podataka, na OS X, 14 R.EVOK.E, ukidanje prava
preporuke, 203 kommzda REPAIR TABLE, 196 drop database, 4S, S6 skript mysqldump, 188-191 11a Windows, 12-14 pristupa, 161
pristup i prava upotrebe, 204 mogućnosti, 195 DROP INDEX, S6 MERCE tabele, 136-137 nalozi, pravlj"e11je za uobi{ajene SELECT, izraela tabela, S2
provera ulaznih podataka program myisamchk, 196-198 DROPTABLE,S6,194 podešavanje MySQL-a, rešenje s poslove, 17-18 SET, podešavanje promenljivih,
u aplikaciji, 204 program mysqlcheck, 197 EXPLAIN, 23S-237 datotekom opcija, 169-171 podefavo1zje sistema, 14-16 182
SSL (Secure Sockets Layer), 20S zaključavanje tabela, 188 FLUSHTABLES,137, 193 primer komande INSERT, 6S-66 provera da li sistem radi, 16-17 show processlist, niti, 181
internacionalizovanje, podešavanje testiranje kopije, 19S FLUSH, pražnjenje ostava, LOAD DATA INFILE, komanda, izvršive datoteke, 20--21 show variables, 180
MySQL-a,174 izvršive datoteke, MySQL-ove, 182-183 73-7S korisnički interfejsi SQL-ove
ISAM tabele, SO 20-21 LOCKTABLES,148-149,193 load file(), funkcija, 114 MySQL Control Ce11ter, 21 CREATE DATABASE, 43
ograničenja, 129 OPTIMIZE TABLE, 130, 230, locate(), funkcija, 114 MySQL mo11itor, 21-23 CREATETABLE, 44, 48-52
pregled, 128 238 LOCK TABLES, komanda, phpMyAdmi11, 21 DELETE, 7{}-72
izbori pri projektovanju,
optimizovanje baze
J REPAIR TABLE, 130,196 148-149,191,193
LOCK TABLES, pravo, 1S9
podešavanje
I111zoDB, 172-173
INSERT, 68-69
R.ESET, pražnjenje ostava, REPLACE, 70
podataka, 228 jednako (=), operator, 111 182-183 logički operatori, 112 itttemacioualizovanje1 17 4 SELECT, 8{}-89
izolovanost, nivoi (transakcije), jednakovredni spojevi, 97 SET logičko tekstualno pretraživanje, kot!figuraciol!e opcije za vife TRUNCATE, 72
1SO jednokolonski indeksi, 229 aktiviranje datoteka dnev11ika, 133-134 instalacija tUJ istom raluuant UPDATE, 72-73
1
fantomski podaci, 1S1 183 long_query_time, promenljiva 173-174 UNLOCK,191
prljavi podaci, 1S2 režim autocommit, isklj'u{ivmije, (dnevnik sporih upita), 23S mysqld, podefavo1zje opcija za, use, biranje baze podataka, 43
read committed, 1S1 K LOW PRIORITY, odredba 171-172 navodnici, identifikatori, 43
147
read uncommitted, 1S2 komanda DELETE, 72 refetzje s datotekom opcija, nebitne reči, tekstualno
kandidati za ključeve, 31 SHOW,23,180
repeatable read, 1 SO komanda INSERT, 68 169-171 pretraživanje, 132
karet (A), znak, 116 START TRANSACTION, 147
serializable, 1SO komanda LOAD DATA INFlLE, server niti, uništavanje, 182
key, vrednost, komanda UNLOCKTABLES, 148-149
izrada komprimovanje 74 pokretarzje i spuftmzje, 177-17 8 normalizovanje
baze podataka, komanda EXPLAIN, 236 komanda UPDATE, 72
concatQ, funkcija, 114 prikazivanje podataka o procesima Uoyce-Coddova normalna forma
CREATE DATABASE, 43 key_len, vrednost, komanda lower(), funkcija, 114 1

MyiSAM tabele, 131 181 (BCNF),38


HEAP tabela, 138 EXPLAIN, 236 lozinke
ključevi, kandidati za ključeve kopije tekućeg stanja, pravljenje, server, optimizovanje definicija, 34
indeksa, SS-S6 212-214 šifrovanje, 203 druga normalna forma (2NF),
i superključevi, 31 parametri servera, 222-224
kopije tekućeg stanja, korisnički interfejsi
za nalog root, 17, 202 36-37
kolone tabela RAm diskovi,prepomka, 224
replikovanje, 212-214 MySQL Control Center, 21 Solaris, preporuka, 224 prva normalna forma (1 NF),
datumski i vremenski tipovi
naloga, za uobičajene poslove, 34-36
17-18
podataka, S4 MySQL monitor, 21-23 M struktura direktoriju ma, 19-20
treća normalna forma (3NF),
ključevi, superključevi, 31 phpMyAdmin, 21 MySQL Control Center, 21
tabele korisnički nalozi. Videti i prava MySQL monitor, 21-23 37-38
numerički tipovi podataka, S2-S3 maksimalan broj znakova,
komanda CREATE TABLE, anonin1ni nalozi, brisanje, mysqladmin, program (skript), 20, NOT NULL vrednost, izrada
opcija unique, SO identifikatori, 43
44, 48-52 tabela baze podataka, 31 202-203 184 tabela, 49
manje od (<),111
opcije za optimizovanje, 51 anonimni, brisanje, 17 mysqlbinlog, program, 20 NOT, operator, 112
tabela columns_priv, 164 MATCH, funkcija, 11S
primer baze podataka employee, bezbednost mysqlcheck, program, 197 now(), funkcija, 119
tabela db, 163 max(), funkcija, 122
44-48 auouinwi Halozi, brismije, 17 mysqld, podešavanje opcija za, n-torke, koncepti i tertninologijn,
tabela host mdS(), funkcija, 121
izrada rezervnih kopija i pravljenje za uobič~ene poslove, 171-172 31
kolone za opseg vidlj"ivosti, 163 MEDlUMINT, celobrojni tip
restauriranje podataka instaliranje MySQL-a, mysqldump, skript, 20 NULL, vrednost
kolone za prava, 163 podataka, S3
komanda BACKUPTABLE,194 17-18 mcrenje performansi, upiti, 234 nedostaci, 192 izrada tabela, 49
tabela tables_priv, 164 operatori za porcdcnjc vttdlln,t<.
komanda FL USH TABLES, 193 zaštita MERGE, tip tabela, 136-137 opcija --add-drop-table, 191
komanda LOCKTABLES,193 tabela user opcija --all-databases, 192 110--111
kolone za ograni{avonje upotrebe attmzinwi ualozi, brisanje, merge, tip tabela, SO
komanda R.ESTOR.ETABLE, 202-203 MIN ROWS, opcija, opcija --allow-keywords, 192 projektovanjc """' pod.u.tk.t, H
resursa, 162 opcija --databases, 192 numeričke funkclJ•, 117 liH
194 lozi11kd z a tzalo_q root, 202 optimizovanje tabela, S1
mogu ć nosti, 187-188
kolone za opse.(! vidlj"ivosti, 162 nutncri~ki tipovi putlut1'""' 1\ 1
'\ \
opmm1 JlhH.~tr, 20.1
.(i(t·oiW/JI' lo i11k•l, ?OJ
8 Indeks

o OpenSSL, biblioteka, Web lokacija,


205
pod upiti
čiji je rezultat jedna vrednost,
normalizovanje
Boyce-Coddova twrmal11a forma
tabela baze pod.u,tka, konn·pu rczervi•a11e reči, kun lch•ntlllklltnrl
i terminolo~-:ija, 31 43 l
operatori 100-101 (BCNF), 38
obrnute kose crte (\), 67 učitavanje, H3- H4 RLIKE, lunkdjn, 11 ~ 117
aritmetički, 11 O vrste, 99 dn<ga llormalllajorma (2NF),
odredbe umetanje u t.tbdu, !.S ()\1 ROLLBACK, rezt'rvhmrm t4~l', l.ff 1
logički, 112 za izraze logičkog tipa,101-103 36-37
DEFAULT, komanda INSERT zamenjivanje, 70 root, nalog, lozinkn :ru, 17, lfP
69 • ugrađeni, 109 za izvedene tabele, l OO prva twrmalt~ajorma (1 NF), redundantnost i gubljenje round(), funkcija, II H
DELAY ED, komanda INSERT, za poredenje vrednosti, 110-112 pokretanje 34--36 podataka, projektovanje baza ROW FORMAT, opcija,
OPTIMIZE TABLE, komanda, MySQL servera, 177-178 treća 11ormalllajorma (3NF}, podataka, 33 optimizovanje ta be In,~ l
68
130, 230, 238 zavisnih servera, 214 37-38 ref, vrednost, komanda EXPLAIN, rows, vrednost, kon1nndn
DISTINCT, komanda SELECT optirnizovanje
84-86 • popravljanje i proveravanje tabela redundantnost i gubljenje 236 EXPLAIN, 236
baze podataka komanda CHECK TABLE, 196 podataka, 33 REFERENCES, pravo, 160 RPM datoteke, instaliranje
FIELDS, komanda LOAD DATA
i11deksi, 229-230 komanda REPAIR TABLE 196 važna pitanja, 32 relacije MySQL-a iz, 12
IN FILE, 74
FROM
izbod pn" projektova11ju, 22 8 mogućnosti, 19S ' pristup datotekama, definicija, 29 ručna izrada rezervnih kopija
korna11da OPT/M/ZE TABLE, program myisamchk, 196-197 ograničavanje, 204 tipa ,j ceb n prema jedan", 29-30 i obnavljanje podataka,
spojevi, 94 230 program mysqlcheck, 197 prljavi podaci, nivo izolovanosti tipa ,jedan prema više", 29-30 193-194
11 podupitima za izvedme tabele,
prepon1ke, 227-228 popravljanje My!SAM tabele, 130 transakcija, 152 ttpa "više prema više", 29-30
100
izrada tabela, Sl
GROUJ> BY, komanda SELECT,
86-87
MySQL servera
poređenje s džokerskim znacima,
funkcija UKE, 115
PROCESS, pravo, 160, 203
promenljive, podešavanje
RELOAD, pravo, 160
RENAME, odredba, 57 s
parametri servera, 222-224 poredenje s regularnim izrazima, serverskih, 182 REPAm TABLE, komanda, 130,
HAVING, komanda SELECT, 87 prostor na disku, My!SAM tabele, 196 sabiranje(+), operator, 110
RAID diskovi, prepomka, 2 2 4 funkcija RLIKE, 115-117
IDENTIFIED BY, komanda 130 sarnospojevi, 96
Solaris, 224 poređenjc sa opsegom vrednosti, repeatable read, nivo izolovanosti
GRANT,158 operatori za poređenje, 112 provera (testiranje) transakcija, 150 scripts, direktorijum, 20
r;brzavanje, prevodet!ie i
IF NOT EXISTS, 49 possible_keys, vrednost, komanda instalacije MySQL-a, 16-17 replace(), funkcija, 114 Secure Sockets Layer (SSL), 205
povezivatife, 221-222
IGNORE upiti EXPLAIN, 236 rezervnih kopija, 19S REPLACE, komanda, 70 SELECT, komanda
koma11da INSERT, 69 power(), funkcija, 118 provera ulaznih podataka REPLICATION CLIENT, pravo, alija.1i, 82-83
d11ev11ik sporih upila, 234--235
koma11da LOAD DATA prava u aplikacijama, 204 160 kolone, 80
dodmxuife i11deksa, 238
INFILE, 74 doddjivanje, IS7 proveravanje i popravljanje tabela REPLICATION SLAVE, pravo, izrada tabela, S2
koma11da ANALYZE TABLE,
komanda UPDATE, 72 global11a prava, 160 komanda CHECK TABLE 196 160 odredba DISTINCT, 84-86
238
LIKE,49 prava za admi11istmtore, 159 komanda REPAIR TABLE, 196 replikovanje baze podataka odredba GROUP BY, 86-87
koma11da EXPLAIN, 235-237
LIMIT prava za obil'11e korist~ike, 159 mogućnosti, 19S bezbednosne mere, 211 odredba HAVING, 87
koma11da OPTIMJZETABLE,
komanda DELETE, 72 za pojedi11a1'11e baze podataka, program myisamchk,196-197 budućnost, 216 odredba LIMIT, 88-89
238
koma11da SELECT, 88-89 160 program mysqlcheck, 197 dnevnik izme na, 21 O odredba ORDER BY 87
meretife peiformaiiSi, 234
koma11da UPDATE, 72 spori upiti, otkrivatife, 233 za pojedit1111'11e kolo11e, 161 prva normalna forma (1NF), dodeljivanje prava za, 211 odredba WHERE, 83..:_84
LINES, komanda LOAD DATA za pojedi11abte tabele, 161 34-36 hijerarhijski organizovani glavni opšti oblik, 80
ugrađe11 meha11izam
INFILE, 74 FILE, 203 puni spojevi, 97 serveri, 21S primer jednostavnog upita, 80
optimizovatifa upita, 237-238
LOW PRIORITY OR, operator, 112 prikazivanje podataka o, 181 kopije tekućeg stanja, pravljenje, tabele, 81-82
koma11da DELETE, 72 PRO CESS, 203 212-214 zadavanje baze podataka, 81-82
komanda INSERT, 68
OS X, instaliranje MySQL-a na, 14
ostave, pražnjenje, 182-183 tabele, 160,161 Q otpornost na greške, 209 SELECT, pravo, 159
koma11da LOAD DATA otpornost na greške, replikovanje, tabela colunms_priv, 164 podešavanje zavisnih servera, 214 select_type, opcija, komanda
INF/LE, 74 QUICK, odredba, komanda preklapat~e servera na vruće, 21 7 EXPLAIN, 236
209 tabela db, 163 DELETE, 72
koma11da UPDATE, 72 ovlašćenja, za replikovanje, 211 tabela host, 163 principi, 209-210 serializable, nivo izolovanosti
quote(), funkcija, 114 transakcija, 150
ON, komanda GRANT, 158 tabela tables_priv, 164 provera glavnog servera, 212
ON DUPLICATE KEY složenije topologije, 21S serveri
p tabela user, 162
glavni, u replikovanju, 209-212,
UPDATE, komanda ukidanje, 161 R upotrebljive verzije MySQL-a,
21S
INSERT,69 ~ITH GRANT OPTION, 203 210
ORDER BY PACK KEYS, opcija, višestruki glavni serveri, 217 MySQL
zasuta RAID diskovi, preporuka, MySQL
komanda DELETE, 72 optirnizovanje tabela, 51 zavisni serveri, pokretanje, 214 pokretary·e i spt<ftatife, 177-178
global11a prava, 202 server, tehnike
koma11da SELECT, 87 parametri servera, tehnike
koma11da FLUSH optimizovanja, 224 REQUIRE, odredba, komanda prikazivatife podataka o procesimtl,
komanda UPDATE, 72 optirnizovanja, 222-224 RAID TYPE, opcija, GRANT,159 181
PR/V/LEGES, 202-203
redovi tabele, 57 password(), funkcija, 121 optimizovanje tabela, 51 RESET, komanda, pražnjenje pdkazivatife statusa, 180
PASSWORD, opcija, opast1a prava, 203
QUICK, komanda DELETE, 72 veze sa serverom, 201 rand(), funkcija, 118 ostava, 182-183 tehuike oplimizovatifa, 221-224
optirnizovanje tabela, 51 range, vrednost, komanda RESTORE TABLE, komanda, 194 zavisni
RENAME, tabele, 57 prava, za replikovanje, 211
phpMyAdrnin, korisnički interfejs, EXPLAIN, 237 REVOKE, komanda, 161 pokretmife, 214
REQUIRE, komanda GRANT, 21 preimenovanje tabele, 57
raspoređivanje opterećenja, rezervisane reči u replikovatifu, 209-21 O, 214
159 pid-file, opcija, podešavanje preklapanje na vruće, replikovanje,
'f'O, komanda GR.ANT, 158 217 replikovanje, 215 ALL,102 Services, prozor (Windows
MySQL-a, 173 razlikovanje malih i velikih slova, ANY,I02 Administrative tools), 179
WIIERE podaci, grupno unošenje, 73-75 prenosivost, My ISAM tabele, 129
pre nosni dnevnik, 21 O identifikatori, 43 AUTO INCREMENT, 49 SET, komanda
km11a11da SELECT, 83-84 podešavanje MySQL-a
pretraživanje RDBMS (relational database BINARY,III datoteke dnevnika, aktiviranje,
koma11da UPDATE, 72 instaliranje, 14-16
MyiSAM tabele,131-134 management system), 31 EXISTS, 102 183
.<fll>jevi, 94--95 internacionalizovanje, 174
tekstualno pretraživanje, 131-134 read uncommitted, nivo FOREIGN KEY, SO režim autocommit, isklju č ivanje:,
WITII, komanda GRANT, 1S9 konfiguracione opcije za više
PRIMARY KEY, rezervisana reč, 49 izolovanosti transakcija, 152 FULLTEXT, SO 147
oduzimanje (-),operator, 110 instalacija na iston1 računaru, redovi
ON DUPLICATE KEY UPDATE, principi projektovanja, baze IN,IOI serverske promenUivc,
173-174 ažuriranje, 72-73 podešavanje, l !!2
odredba, komanda INSERT, podataka !NDEX,50
mysqld, podešavanje opcija za, anomalije brisanje, 70-72 PRI MARY KEY, 49 SET, tip podataka, 54
69 171-172
opcija MAX ROWS, NULL vred11osti, 34 brisanje, komanda TRUN CATE ROLLBACK, 146 shared-mcmory-ban-nn••w,
opcije za lnnoDB, 172-173 72 • opcija, podcJnvnllJt•
optitnizovanjc tabela, St pri ažuriraty'u podataka, 34 SOME, 102
rešenje s datotekom opctja, pri hrisanju podataka, J 4 duplikati, 84-86 TEMPORARY, 49 MySQL-n, 173
169 171 grupisanje, 86-87 SHOW, konmntln, ll, l Hil
fiti dm/m;wju p<>rlataka, JJ UNIQUE, SO
UNSIGNED, 52 SHOW DAT/\111\SI , l"'"'''• l \1
1\1 IIIUI:II.)

tabela host, 163 tekstualno pretraživanje podupiti Windows 1\<loululolt•ll 1


show processlist, komanda, 181
show variables, komanda, 180
T tabela tables_priv, 164 logičko,
133-134 čiji je rezultat jed t ta vredttost, prozor St~rvlt, •· l IM
SHUTDOWN, pravo, 160 tabela user, 162 MylSAM tabele, 131-134 100-101 Windows, lm! olhoonf• 1\h 1
sistemi za upravljanje relacionim tabele TEMPORARY, rezervisana reč 49 vrste, 99 na,12-14
BerkeleyDB (BDB), 50,135 preimenovanje, 57
bazama podataka (RDBMS), TEXT, tip podataka, 54 • za izraze logičkog tipa, 101-103 WITH, odredbu, kmmu11l•t
prikazivanje sistemskih podataka
31 grupno unošenje podataka, 73-75 threads_connected, serverska za izvedeue tabele, 1OO GRANT, 159
o, 181-182
skupovi znakova, podešavanje HEAP,50,138 promenljiva, 180 spojevi tabela WITH GRANT 1''1'11 IN,
proveravanje i popravljanje odredba, komandu l .ll i\ N 1
MySQL-a, indeksi ~m estamp(), funkcija, 119 deSili spojevi, 98-99
komanda CHECKTABLE, 196 159
internacionalizovanje, 174 jedrwkolonski, 229 ttmestamp, kolona, tabela jedtwkovredr~i, 97
l
koma11da REPAIR TABLE, 196 WITH GRANT OP1'10N, l"" .,,
Slashdot, Web lokacija, 135 levi kraj grupe, 229 columns_priv, 164
levi spojevi, 98-99
optimizovm~·e, 229-230
mogubwsti, 195 TIMESTAMP, tip podataka, 55 160,203
Sleepycat, Web lokacija, 135 ptmi spojevi, 97
program myisamchk, 196-197 TINYINT, celo brojni tip
slow_queries, serverska vifekolomki, 229 samospojevi, 96
promenljiva, 180 lnnoDB,50 program mysqlcheck, 197 podataka, 52
SMALLINT, celobrojni tip dosledno učitavanje bez redovi tipovi podataka, float, 48 spajanje vife tabela, 95-96 X
ažuriranje, 72-7 3 TO, odredba, komanda GRAN~ unakrSIIi spojevi, 97
podataka, 52 zak(iu{avanja podataka, 13 4
brisatije: 70-72 158 • uppercase(), funkcija, 114 XOR, operator, 112
socket, opcija, podešavanje tramakcije, 14 3-146
brismije pomoću komande trajnost podataka, transakcije, 150 uptime, serverska promenljiva, 180
MySQL-a, 173 uslovi licence, 13 5 USAGE, pravo, 159
Solaris, preporuka, MySQL server, Web lokacija, 13 5 TRUNCATE, 72 transakcije
use, komanda, biranje baze y
tehnike optirnizovanja, 224 zak(iu{avanje podataka na 11ivou duplikati, 84-86 definicija, 143-146
grupisarije, 86-87 podataka, 43
SOME, rezervisana reč, 102 reda, 134 START TRANSACTION
user, opcija, podešavanje Yahoo!, Web lokacija, 135
soundex(), funkcija, 114 ISAM,50 u{itavarije, 83-84 komanda, 147 '
MySQL-a, 172 YEAR, tip podataka, 55
spojevi tabela umetatije, 65-69 u lnnoDB tabelama, 143-146
ogrmli{enja, 128-129 user, tabela, prava pristupa
desni spojevi, 98-99 zamma, 70 ACID uskladerwst, 149-150
pregled, 128 kolone za ograničavanje upotrebe
dve tabele, spajanje, 93-95
jednakovredni, 97
izrada
spajanje izolova11ost tramakcija, 150-152 resursa, 162 z
komanda CREATE TABLE deSili spojevi, 98-99 režim autocommit, 147-149 kolone za opseg vidljivosti, 162
levi spojevi, 98-99 44, 48-52 ' dve tabele, 93-95 treća normalna forma (3NF), zaključavanje podataka na nivou
kolone za prava, 162
puni spojevi, 97 jedt~akovred11i spoj, 97 37-38 reda, lnnoDB tabele, 134
opcije za optimizovanje, 51 kolone za uspostavljanje za.ltićene
samospojevi, 96 levi spojevi, 98-99 trim(), funkcija, 114 zaključavanje podataka na nivou
primer baze podataka employee, TRUN CATE, komanda, 72 veze, 162
unakrsni spojevi, 97 ptmi spojevi, 97 usklađenost podataka, transakcije, stranice, BerkeleyDB (BDB)
44-48 type, vrednost, komanda
više tabela, spajanje, 95-96 samospojevi, 96 150 tabele, 135
spuštanje MySQL servera, 177-178
kolone EXPLAIN, 236
UllakrSIIi spojevi, 97 uslovi licence, InnoDB tabele, 135 zaključavanje tabela, 188
sql-bench, direktorij um, 20
datumski i vrememki tipovi
vife tabela, 95-96 uspostavljanje veze s bazom zamena redova, 70
podataka, 5 4
SQL-ove komande
CREATE DATABASE 43 numerički tipovi podataka, 52-53
tabele baze podataka, 31
tip merge, SO
u podataka
MySQL, testiranje, 16-17
zapisi, tabele baze podataka,
•. koncepti i terminologija, 31
CREATE TABLE, 44,48-52 opcija unique, 50 zastlta
učitavanje podataka iz, 81-82 SSL (Secure Sockets Layer), 205
učitavanje podataka iz odredenih ubrzavanje MySQL servera, instalirane datoteke
DELETE, 70-72 upiti čiji je rezultat jedna vrednost, zaštita servera, 201
kolo11a, 80 221-222 jiltrirmije podataka, 204
INSERT, 65---<i9 100-101
znakovni i tekstualni tipovi ugrađen mehanizam
REPLACE, 70 zaključavanje, 188 fizička zaftita, 205
SELECT, 80-89 podataka, 53-5 4
komanda ALTER TABLE 56
tabele, podrška za transakcije
optirnizovanja upita, 237-238
ugrađene funkcije/operatori, 109
v preporuke, 203
TRUNCATE, 72 BerkeleyDB (BDB), 135 pristup i prava upotrebe, 204
komanda BACKUP TABLE 194 ukidanje prava pristupa, 161
UPDATE, 72-73 lnnoDB umetanje novih redova u tabelu V~CHAR, tip podataka, 54 provera ulaz11ih podataka u
sqrt(), funkcija, 118 komanda DROPTABLE 194 vece od(>), 111 aplikaciji, 204
dosled11o u{itavanje bez 65-<i9 •
SSL (Secure Sockets Layer), 205 komanda FLUSH TABLES, 193 višekolonski indeksi, 229 SSL (Secure Sockets Layer), 205
zakiju{avarija podataka, 13 4 unakrsni spojevi, 97
START TRANSACTION, komanda LOCKTABLES, 193 višestruki glavni serveri, korisnički nalozi
uslovi licettce, 13 5 UNION, opcija, optirnizovanje
komanda, 147 komanda RESTORE TABLE replikovanje, 217 mwuinmi nalozi, brisanje,
194 • l#b lokacija, 13 5 tabela, 51
statičke MyiSAM tabele, 129-130 zak(iu{avmije podataka 11a 11il.<lu UNIQUE, rezervisana reč, SO vremena, funkcije za rad s 202-203
std(), funkcija, 122 menjanje strukture, 56-57 UNLOCK TABLES komanda, datumima i vremenima lozi11ka za 11alog root, 202
reda, 134
STRCMP, funkcija, 115,117 MERGE, 136-137 148-149 119-120 • opas11a prava, 203
tipovi tabela, 127-128
struktura direktorijuma, MERGE, komanda FLUSH tabele prava, kolone UNLOCK TABLES, komanda, 191 vremenski tipovi podataka za !ifrovatije lozi11ki, 203
MySQL-ova, 19-20 TABLES,137 UNSIGNED, rezervisana reč, 52 kolone, 55 sistem prava pristupa
tabela db, 163
subdate(), funkcija, 119 MylSAM,SO UPDATE, komanda, 72-73 veze sa serverom, 201
tabela host, 163
substring(), funkcija, 114
tum (), funkcija, 122
dinamičke, 129-130
komprimovane, 131
tabele user, 162
table, vrednost, komanda
UPDATE, pravo, 159
upiti
w sistema pri replikovanju, 211
zavisni serveri
SUPER, pravo, 160 pobo(ifanja u odnosu rw ISAM dnevnik, 183
EXPLAIN, 236 Web lokacije pokretanje, 214
•upcrključevi, 31 tabele, 129 table_cache, parametar, 223 komanda SELECT, 80 u replikovanju, 209-210,214
poprav(imije, 13 O activestate.com, 235
tables_priY, tabela, prava pristupa, optimizovanje zlonamerni korisnici, zaštita, 205
Google,135
š pregled, 129
statičke, 129-130
164
tačka i zarez (;),znak, 46
drtev11ik sporih upita, 234-235
dodava1ije i11deksa, 238
lnnoDB,135
znakovni i tekstualni tipovi
podataka, 53-54
tekstualtw pretraživarije, OpenSSL, 205
lemn, definicija, 32 tekstualni i znakovni tipovi kommtdaANALYZE, 238 LIKE, funkcija, 115
131-134 podataka za kolone Slashdot, 135
t.1bcla columns_priv, 164 koma11da EXPLAIN, 235-237 MATCH,funkcija,115
podrška za transakcije, 127-128 BLOB,54 komm1da OPTIMIZETABLE Sleepycat, 135 obrada znakovnih vrednosti, 11 4
tabela tables_priv, 164 Yahoo!, 135
podupiti za izraze logičkog tipa, CHAR,53 238 • RUKE, funkcija, 115
tabele db, 163 WHERE, odredba
tabele host, 163 101-103 ENUM,S4 meretije peiformami, 234 STRCM P, funkcija, 115, 117
podupiti za izvedene tabele, 1OO SET,S4 komanda SELECT, 83--84
tabele user, 162 spori upiti, otkrivatije, 233 zvezdica (*),znak, 116
prava, 160,161 TEXT,54 komanda UPDATE, 72
Jifrovanje lozinki, 203 "~~mden 111eluwizam
tabela cohmuiS_priv, 164 VARCIIAJ1..,54 spojevi, 94-95
optimizovmija upita, 237-238
tabela db, 163

You might also like