You are on page 1of 131

Pregledan uvod u korienje 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 lakoi
upotrebe, MySQL se pokazao kao naroito pogodan i za poetnike
i L.a iskusne programere jer omoguava izradu sofisticiranih Web lokacija
i ap likacija koje rade sa bazama podataka.
Prirunik za MySQL daje jasan i saet uvod u osnovne koncepte i tehnike
upotrebe MySOL-a,. itaocu koji j e poetnik u MySOL-u omoguava da
pravi i administrirasloene baze podataka koje moe koristiti kod kue,
na poslu ili na Webu.
Bez obzira na to da li ste poetnik u oblasti baza podataka ili iskusan
profesionalac koji eli da sazna vie o tome kako radi MySQL, Prirunik
za MySOL e vam efikasno pruiti sve informacije koje su vam potrebne
da biste zapoeli i brzo savladali MySQL.

Luke Well ing i Laura Thomson, autori popu larne knjige PHP i MySOL:
razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje
Web aplikacija, softverske inenjerstvo i elektronsko trgovanje, na RMIT
univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji
Tangl ed Web Design, koja je osvojila vie nagrada za svoje projekte dina-
miki h Web lokacija na kojima se koriste PHP i MySQL. esto uestvuju
i predaju na konferencijama o softveru otvorenog koda, kao to su MySQL
U er Conference, PHPCon, LinuxTag i O'Reilly Open Source Convention.

<{

Prirunik
(.)
z
>N
....,
z
za MySQ
~<
Izdanja Mikro knjige
donose informacije,
<{~
z-, Pregledan uvod u korienje MySQL a
S~ -sistema za rad sa bazama podata ko
prenose proverena iskustva
i pruaju potrebna znanja.
My
Press w
Obl.t\ 1: l\o11r pndoliolkol ~
Prirunik ~a MySQL
O autorima
Rc.ccn1enL Dragan Tanaskoski
Urednik Olga Milanka l ul Vlling (Luke Wclling) predaje u koli za raunarske nauke i informacione tehno-
ltrd.lktori Aleksandra Stojanovi i Stela Spa.i
Tehniki 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 reenja to
Realizacija korica Vladimir Konarevi "' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, obja-
l'rclom tc Ima i obrada slika Sanja Tasi
Milica Deanski IIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima
1 11111 llJ .lCIIlla drao je predavanja iz raznih oblasti, ali ua specijalnost mu je Internet.
Izdava Mikro knjiga, Beograd
Direktor Dragan Tanaskoski
l '"''Tomson (Laura Thomson) predaje u koli za raunarske nauke i informacione
tampa YG{)~O "J. ( ~u~kum, Beograd r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je vie predmeta iz
Ako imate pitanja ili komentare, ili ako elite da dobijete besplatan katalog, piite nam ili se javite: ,,,,J.,~tt Weba i Jnterneta, a priprema doktorat na temu pretraivanja Weba. Uestvuje 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 ,!\diiti 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 inenjering raunarskih sistema i raunar
o
tel: t l /3540-544 tel: 051/220-960 tel: 01/2344-023
pismamikroknjiga . co.yu pismamikroknjiga.ba pismamikroknjiga . hr l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menaeriju kunih ljubi-
Autorizovan prevod sa engleskog jezika knjige MySQLTurorial. ilt.ll 1, .1 ponekad pria s Lukom i o stvarima sasvim izvan sveta tehnike.
Copyright 2005 Mikro knjiga. Sva prava zadrana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan
di rm i tovan na bilo koji nain, elektronski ili mehaniki, ukljuujui fotokopiranje, snimanje ili bilo koji drugi sistem
~.l bdccnje, bez prethodne pismene dozvole izdavaa.

Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING, Od istih autora
LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright 2004.
Meu knjigama o izradi Web aplikacija korienjem 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 praktini projekti. U udbenicima pro-
CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH
IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11
l gramiranja za Web, primeri su obino previe jednostavni
za praktinu primenu - ova knjiga sadri i jednostavne pri-
004.655.3(035)
004.652.4(035) mere na kojima se objanjavaju svojstva jezika, ali i nekoliko
BEJ111Hr, nyK gotovih kompletnih aplikacija koje prikazuju kako se prave
Prirunik 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" - Prirunici 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 draj

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

Osnove MYSQL-a . 9

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

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

ll Projektovanje i izrada baza podataka u MySQL-u. 27


Ubrzani kurs projektovanja baza podataka. . . . . . 29
Koncepti i terminologija baza podataka ............................. 29
!>rincipi projektovanja baza podataka ............................... 32
Normalizovanje ............................. ... .. ... . ....... . 34
Saetak ............ . . . ...... . . . . . .... . .... ... .............. 38

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


Razlikova~ e malih i velikih slova ........ .. ....................... 42
Jdentifikatori u MySQL-u ................................. . .... 42
Prav ljenje baze podataka ........................................ 43
Oiranje baze podataka .......................................... 43
Pravljenje tabela .................................. . ........... 44
Tipovi podataka u kolonama .... . ............. . . .. .. . ... ........ 52
l'r,1v~jenje indeksa .......................... , , , 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 postojee tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % !>tuge funkcije . . . . . . . . . . . . .. .......... . ...... . ............. 121
Saetak ............................................... .... . 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 auriranje 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 unoenje podataka pomou komande LOAD DATA INFILE ...... 73 MER.GE tabele .............................. ... ............ 136
Saetak ...... .. .. . ... . . .................................... 75 l l EAP tabele .. ........... .................................. 138
S;tetak ........... . ... .... ........... . . .. ................. 138
6 Korienje upita u MySQL-u . . . . . . . . . . . . . . . . . . . . . 79
Opti oblik komande SELECT . . ... . . ............................ 80 l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143
Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80 Staje transakcija? ... . ..................... ..... ...... .. ...... 143
Uitavanje podataka iz odreenih kolona .... .. .. . .... . .. .. ...... . .. 80 Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146
Apsolutna imena baza podataka i tabela ............................. 81 Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149
Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82 Saetak ............. .... . . .... .. .......................... 152
Upotreba odredbe WHERE za uitavanje samo odreenih redova ...... . .. 83
Uklanjanje dupliranih vrednosti pomou opcije DISTINCT .. . .......... 84 V Administriranje MySQL-a ... 155
Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86
Izdvajanje odreenih grupa podataka pomou opcije HAVING ... ... .. ... 87 ll Upravljanje pravima korisnika 157
Sortiranje uitanih rezultata pomou odredbe ORDER BY . . .. . . . ....... 87 l'ravljenje korisnikih naloga pomou komandi GRANT i REVOKE ... .. 157
Ograniavanje broj a redova rezultata pomou odredbe LIMIT ........ .. .. 88 Nivoi prava ................................................ 159
Utvrivanje ukupnih prava . .. ......... ... .... . ... .... .......... 160
Saetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89
Upotreba komande REVOKE .......... .......... . ............. 161
7 Sloeniji upiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161
Upotreba spojeva u upitima koji obuhvataju vie tabela . ... ............. 93 Saetak ........... ... . ........... .... . ........ ......... .. . 165
Vrste spojeva izmeu tabela ...... . .. ............... ... ...... . .. . 97
Podupiti ........... ...... .......... . . . ..... . ............... 99 12 Podeavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169
Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103 Podeavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169
Saetak ........... . .. . ....... . ... . ... . .. .. .... . . , ......... 104 Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172
Konfiguraciane opcije za vie instalacija na istom raunaru ....... . .... .. 173
8 Upotreba MySQL-ovih ugraenih funkcija Internacionalizovanje ......................................... 174
u komandi SELECT . . . . . . . . . . . . . . . . . . . . . . . . 109 Saetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4
Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O
13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177
Funkcije za upravljanje tokom izvravanja komandi ....... ..... .. .. . .. 113
Pokretanj e i sputanje MySQL servera ............................. 177
Funkcije za rad sa znakovnim vrednostima ........................ . 114
Numerike funkcije ... ........... . .. ...................... .. . 117
Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178
Podeavanje serverskih promenljivih ......... . .................. . . 182
Unitavanje niti .................................. .. , , . , ... .. 182 19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Pranjenje ostava ............................................ 182 Otkrivanje sporih upita ..................... . ..... .... ........ 233
Datoteke dnevnika ........................................... 183 Merenje performansi upita ............................ . ........ 234
Saetak ................................... . ............... 184 Upotreba dnevnika sporih upita ...................... ... ........ 234
Upotreba komande EXPLAIN za prikazivanje naina na koji se
14 Izrada rezervnih kopija i obnavljanje podataka . . . . . . . . 187 upiti izvravaju .. ............. . ....... . ............ . ...... 235
Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187 MySQL-ov ugraeni mehanizam optimizovanja upita ................. 237
Testiranje rezervne kopije ... ...... ..... ....................... 195 Preporuke za optimizovanje upita ................................ 238
Proveravanje i popravljanje tabela .. ... ... ........................ 195 Saetak . . .... . .......................... .. ................ 238
Saetak ............. . .............................. .... ... 198
Spisak termina korienih u knjizi . 241
15 Zatita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201
Kako sistem prava korisnika deluje u praksi ......................... 201 Indeks . . . . . . . . . . . . . . . . . . . . 243
Zatita korisnikih naloga ...................................... 202
Zatita instaliranih datoteka ..................................... 203
Filtriranje podataka koje korisnici alju ............................ 204
Drugi saveti ........................................... ..... 205
Saetak . . . . . . . . . . ......... . ...... .. ....................... 206

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


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

VI Optimizovanje MySQL-a . . . . . 219


17 Optimizovanje MySQL servera. 221
Prevoenje i povezivanje koda radi poveavanja brzine rada ............. 221
Podeavanje parametara servera .. . ....... . ........... . ........... 222
Podeavanje drugih inilaca .................................... 224
Saetak ......... ... .. ............................ .... ..... 224

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


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

D~ lill O DOLI U PRIRUNIK


ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da
1111 omoguida brzo uhvatite korak s MySQL-om. MySQL emo objasniti tako da
1 ptlhliimo i krajnjem korisniku i administratoru sistema.

l J ovom uvodnom delu razmotriemo sledee:


~bog ega biste se opredelili za MySQL
/.ato ba MySQL a ne neka druga baza podataka
!'lt a je drugaije u MySQL-u 4.0 i 4.1
Koje nove mogunosti tek treba da se pojave u buduim verzijama
Kome je ova knjiga namenjena
l<.1ko treba koristiti ovu knjigu
N<lpomena u vezi s nainom licenciranja MySQL-a.

Zbog ega biste se opredelili za MySOL


1) "'<)L je odlian proizvod iz oblasti baza podataka. Postoji vie razloga zbog kojih
l11 lt' \l! opredelili da MySQL bude va server baza podataka.
MySQL je brz i stabilan. To je kljuni razlog njegove popularnosti. Februara 2002.
!ullltL', asopis eUiek (www. eweek. com) napravio je uporednu studiju nekoliko
tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov
1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najvie ukupne

H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je jo bri.
M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL
1111 tZt' st: nabaviti pod uslovima GNU opte javne licence (General Pu blic License,
l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, moete je kupiti.
MySQL prua veliku veinu mogunosti koje se smatraju vanim u oblasti baza
('ul.ti.lka, a to su transakcije, zakljuavanje na nivou pojedinanih redova, spoljni klju-
' l 1, podupiti i tekstualno pretraivanje.Verzija 5.0 e na ovaj spisak dodati i uskladi-
l Ill' procedure.
MySQL omoguava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao to
11 Y.dlOo! Finance, Slashdot i US. Census Bureau.

MySQL je odlina opta alatka za uenje baza podataka jer se lako instalira i koristi,
1 Z.lutima malo prostora na disku i troi skromnu koliinu memorije.

Ukupno gledano, MySQL je odlian izbor za aplikacije baza podataka.


Zato ba MySQL a ne neka druga baza podataka knjige), to zavisi od toga da li koristite tabele tipa InnoDB. Drugim reima, za
Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim MySQL postoje dva sistema licenciranja, gde je besplatna upotreba odreena GPL
detaljima, ali MySQL nudi kombinaciju performansi, cene i mogunosti koju bi drugi uslovima, a nain komercijalne upotrebe odreen je standardnim sporazumima EULA
sistemi teko nadmaili. (End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM
(Original Equipment Manufacturer- izvorni proizvoa opreme). Pravilo kompanije
Performanse MySQL AB je sledee: "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 takoe".
najbre baze podataka na svetu, to, u zavisnosti od vaeg stepena lakovernosti, samo Najvaniji konkurenti nude iskljuivo komercijalne licence, uz sloene sisteme
dokazuje jednu od sledee dve tvrdnje: programi za testiranje mogu se napisati tako da t ena, koje zavise od nameravanog naina upotrebe, broja procesora po serveru i broja

rezultati dokazuju ta god naruilac programa zahteva, ili da se razliiti proizvodi Istovremenih korisnika koji e uspostavljati veze s bazom podataka. Trokovi za Ora-
pokazuju kao savreni u razliitim uslovima upotrebe. t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu dostii

Na MySQL-ovj zvaninoj Web lokaciji moete pogledati rezultate poreenja per- desetine hiljada dolara u okruenju sa umerenim optereenjem, pa ak i stotine hiljada
formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom dolara za server s vie procesora na koji se povezuje vei broj klijenata.
primctno nadmauje svoje takmace. Iako u naelu rezultate bilo kojeg testiranja treba MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao to su
prihvata ti "sa zrnom soli", to naroito vai za rezultate testova koje je izvrio proizvo- l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je
a baze podataka, svi dokazi na raspolaganju, ukljuujui i nezavisne testove, poka- MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.-
zuju da je MySQL jedan od najbrih proizvoda na raspolaganju. ,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1
Rezultate testiranja moete videti na Web lokaciji: odtetu u sluaju 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 okruenju, a ciljna trina grupa
a ti podaci su priloeni i uz datoteke izvornog koda koje preuzim.ate, to vam omogu-
su im kuni korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro.
ava da ih uporedite s rezultatima koje dobijete u svom radnom okruenju.
Mada se grafiki korisniki interfejs programa iz ove kategorije esto jednostavno
Rezultati testiranja koje je izveo asopis eWeek 2002. godine pokazali su da je
upotrebljava, njima uglavnom nedostaje vana 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 kljune vanosti za firmu.
aplikacije napisane na jeziku Java koje rade na Windows raunaru s etiri procesora.
Navedena dva proizvoda su nadmaila IBM-ov DB2, Microsoftov SQL Server i Syba-
Stabil nost
seov ASE. U nastavku ovog teksta bie vie rei o ce nama, ali vredi napomenuti da je
Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog znaaja .
od svih proizvoda obuhvaenih tim testovima, jedan od najboljih bio besplatan, dok su
Sve verzije MySQL-a izdate u binarnom obliku - ak i alfa izdanja - moraju proi
cene drugih bile reda veliine 160.000 dolara (40.000 dolara po procesoru).Vie detalja
MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih
o tome nai ete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.
osobina, kao i ispitivanje rezultata operacija pri kojima su u prolosti otkrivene i ispra-
Brzina je oduvek bila kljuna odlika o kojoj projektanti MySQL-a vode rauna.
vljene greke, ime se obezbeuje da se nikad ponovo ne uvede ve ispravljena greka.
U MySQL se ugrauju nove mogunosti samo ako nisu na tetu performansi. Zbog
Ispravljanju greaka projektanti moraju da daju vii prioritet od drugih poslova.
toga se ponekad nove mogunosti dodaju sporije nego to to korisnici ele, ali se time
U sutini, projektant prekida tekui posao sve dok se ne otkloni greka koja spada
obezbeuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ete se i u njegovu oblast strunosti. Pravilo nalae da svako izdanje MySQL-a mora biti oi
sami sloiti na osnovu svog iskustva ili testova koje sami izvedete.
eno od dotad poznatih greaka koje se mogu reprodukovati u poznatim uslovima.

Cena R.azume se, odreeni problemi ne mogu se reiti a da pri tom ne pro uzrokuju druge
probleme na drugom mestu. To naroito vai za produkcione verzije u koje ne bi tre-
Cena je stavka koja se moda najlake poredi. Za mnoge uslove upotrebe, MySQL je
balo ugraivati sutinske izmene koje bi mogle da utiu na stabilnost verzije. U takvim
besplatna aplikacija. Uslovi licence tipa GPL omoguavaju da neogranieno koristite
sluajevima, 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 obezbeuju MySQL-ovi klijenti i zajednica korisnika.
takoe pod GPL uslovima. U odreenim situacijama, npr. kada elite da distribuirate Preko etiri miliona korisnika irom sveta rade u veoma razliitim okruenjima, to
MySQL kao sastavni deo komercijalnog proizvoda, moraete da kupite komercijalnu
prua jedinstvenu priliku za otkrivanje greaka ve u poetnim fazama razvoja. Budui
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 greaka javan, svaki korisnik
ima uvid u sve to su drugi korisnici otkrili i moe da dodaje svoje napomene.
Lakoa upotrebe ta je drugaije u My -u 4.0 i 4.1
Druga kljuna odlika MySQL-a jeste lakoa 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
podeavanja da biste poeli 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 utroak prostora na
Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uoiete sledee znaajnije izmene:
disku i memorije. Razume se, da bi se postigle optimalne performanse odreenih
funkcija koje su vane u produkcionom okrue~ u. kao to je npr. prijavljiva~e kori- U standardnu binarnu verziju ugrad ena je maina baze podataka Inn oD B, koja je
ve bila ugraena u neke kasnije verzije 3.23. Maina baze podataka InnoDB
snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti
radnih parametara MySQL-a. Pri tome vam mogu pomoi primeri konfiguracionih podrava pravila ACID, to znai da podrava transakcije, spoljne kljueve i
datoteka koje dobijate uz MySQL. zakljuavanje na nivou redova tabele.

MySQL sada koristi ostavu (ke) za upite, u koju smeta rezultate upita za kasniju
Mogunosti ponovnu upotrebu, ime znatno poboljava performanse uobiajenih upita.
Poree~e mogunosti softvera umnogome zavisi od toga koje mogunosti smatrate Tekstualno pretraivanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj-
vanim. MySQL prua odreene mogunosti, kao to su tekstualno pretraivanje, ani su dodava~em opcije Boolean.
replikovanje i podrka za veoma obimne tabele, kojih u drugim jeftinim proizvodima Tabele tipa MERGE sada podravaju komande INSERT i polja AUTO_INCREMENT.
uopte nema ili ne rade najbolje. Meutim, MySQL-u nedostaju neke mogunosti Skupovi rezultata dobijeni pomou upita SELECT sada se mogu spajati pomou
kao to su uskladitene procedure i pogledi, koje su standardne u najskupljim proizvo- opcije UNION .
dima, a postoje ak i u nekim jeftinim proizvodima. Neke od tih nedostajuih mogu
Sada moete da br i ete redove iz vie tabela istovremeno pomou jedne komande
nosti (kao to su uskladitene procedure), planirane su za naredne verzije, dok e za
DELETE.
druge (kao to su pogledi) biti potrebno vie vremena. Neke MySQL-ove mogunosti
(na primer, zakljuavanje na nivou reda) ne postoje ak ni u najskupljim sistemima. Poboljano je upravlja~ e pravima korisnika. Doda to je vie novih vrsta prava, to
omoguava finije podeavanje, a odsad moete da ograniite i resurse kojima
Na Web lokaciji posveenoj MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/
information/features. html, na kojoj ete nai uporedni pregled mogunosti
korisnik ima pristup.
MySQL-a i dvadesetak konkurenata, da biste videli ta se sve nudi. U nastavku dajemo Odsad moete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.
kratak spisak mogunosti koje ne podravaju svi MySQL-ovi konkurenti i spisak Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo-
mogunosti kojih nema u MySQL-u a postoje u drugim proizvodima. guava da ugraujete MySQL u svoje programe.
MySQL 4.1 nudi sledee: Replikovanje, koje postoji jo od verzije 3.23.15, poboljano je na vie naina,
transakcije u skladu s grupom pravila ACID uglavnom otklanjanjem greaka. Na primer, sada moete da podesite bazu ka~
podrku za razliite platforme prijemnik podataka pomou opcije LOAD DATA FROM MASTER, umesto pomocu
replikovanje komande mysqldump ili alatke mysqlsnapshot.

podrku za obimne tabele i baze podataka Napravljeno je i puno drugih manjih izmena i poboljanja. . .
Verzija 4.1 donosi jo neka dodatna poboljanja. Najvanija izmena Je dodavanJe
tekstualno pretraivanje
pod upita i izvedenih tabela. Odsad imate i podrku za Unicode, po~.~ku za fo_:m~t
podupite
OpenGIS za skladitenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.
podrku za veinu sintakse po standardu SQL 92.
MySQL zasad jo ne nudi sledee:
Koje nove mogunosti tek treba da se pojave
poglede
uskladitene procedure
u buduim verzijama
Verzija 5.0 je zasad u predalfa fazi, ali moete preuzeti izvorni kod da biste s njim
okidae
ckspcrimentisali. Najznaajnija izmena koju donosi verzija 5.0 jeste do.datak u~kla
ditenih procedura, to je ve ugraeno u predalfa verziju. Planirane su 1 druge 1zm~ne
medu kojima su podrka za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1
druga manja znaajna poboljanja.
Trebalo bi da verzija 5.1 omogui definisanje spoljnih kljueva Ll sv lill Vl st.llll.l N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktinih vebi u vezi s gradivom
tabela (meu mnogobrojnim drugim novim mogunostima). Pogledi e biti podra ni poglavlja, da biste mogli da provebate ono to ste nauili u poglavlju.
u jednoj od buduih 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 saetih poglavlja, a svako je MySQL-ovog koda i dokumentacije.
u sredsreene na odreenu temu i prevashodno opisuje kako se rade odreeni poslovi. Veina delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU
Svako poglavlje zavrava se pitanjima i vebama koje se odnose na gradivo poglavlja, tlptcjavne licence (General Public License, GPL).To znai da moete slobodno kori-
to vam omoguava da ispitate da li ste dobro razumeli koncepte izloene u poglavlju. \111 1, kopirati, distribuirati i menjati izvorni kod MySQL-a. Ako kop irate ili distribui-
Ukratko, naa namera je da knjiga bude kratak prirunik za pametne ljude. Ova l,lll' kod (ili ako kod izmenite pa ga zatim kopirate ili distribuirate), to takoe morate
knjiga nije referentni prirunik. Ako vam to treba, pogledajte odlian prirunik o 1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati

MySQL-u na zvaninoj Web lokaciji. Zaista nema potrebe da ponovo pronalazimo , 11vorni kod.
rupu na saksiji. Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a moete proitati
Usredsrediemo se na sledeih pet kljunih oblasti: instalisanje i konfigurisanje 11 lkktronskom obliku u MySQL-ovom referentnom priruniku, 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):
Opisaemo sva sutinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a. hl Lp://www.gnu.org/licenses/
Ovu knjigu moete koristiti kad god vam zatreba da uradite odreeni posao koji
Vie detalja o GNU uslovima nai ete na:
se ti e upotrebe MySQL-a u novom projektu, ili ste preli 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 pomae da uradite odreeni posao. Ako to ne odgovara vaim 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 moete kupiti i ako elite da pomognete razvoj MySQL-a.
Ova knjiga je podeljena na pet delova: Vano je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL
U prvom delu", Osnove MySQL-a", nauiete kako da instalirate i podesite MySQL uslovima, ali se moe slobodno tampati za linu upotrebu.
na svom sistemu, i upoznaete MySQL na osnovu kratkog opisa.
Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz
postupak projektovanja i izrade baze podataka. itaocima koji imaju iskustva u pro-
jektovanju baza podataka bie dovoljno da samo povrno pogledaju ovaj deo, ali ako
ste poetnik u oblasti baza podataka, savetujemo da ga detaljno prouite .
U treem delu",Upotreba MySQL-a", nauiete kako da koristite podatke iz
MySQL-a u svakodnevnim poslovima.
etvrti deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u
koriste pojedine vrste maina baza podataka, sa posebnim osvrtom na mainu InnoDB
i njenu upotrebu za transakcionu obradu podataka.
Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da oba-
vlja administrator MySQL-ove baze podataka, kao to su upravljarUe korisnicima,
podeavanje, odravarUe baze podataka, izrada rezervnih kopija i restauriranje baze
podataka, zatita baze podataka od neovlaenog pristupa i replikovanje podataka.
esti deo",Optimizovanje MySQL-a", pomoi e vam da dobijete maksimum od
MySQL-ove baze podataka tako to optimizujete podeavarUa servera, baze podataka
i upite u svojim uslovima.
I
Osnove MYSQL-a

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

t >VOM POGLAVLJU SAZNAETE kako se instalira i podeava MySQL za uobiajen


111 upotrebe. Obradiemo sledee teme:
l11staliranje na Linux
l11staliranje na Windows
l11staliranje na OS X
Podeavanje sistema
z~davanje lozinke za nalog root
llrisanje anoninmih naloga.
l'nu~ emo od instaliranja MySQL-a na sistem. Ako ve imate instaliran primerak
<)L- a 4.1 ili neku stariju verziju, moete preskoiti tekst do odeljka "Zadavanje
Ito. lli~ l! za nalog root".
l'rl'balo bi da najpre preuzmete sa Web lokacije verziju MySQL-a koja je najpogod-
lllj.r 1.1 va sistem. Za veinu sistema postoje verzije MySQL-a koje se distribuiraju u
1!111,11110111 obliku ili kao izvorni kod. Ako tek uite kako se koristi MySQL, prepomu-
1 11111 vam da preuzmete binarnu verziju jer se znatno lake instalira. Dodatna prednost
11 1 lo to je binarna verzija MySQL-a podeena za optimalne i stabilne perfom1anse.
l .. t svaku platformu, MySQL postoji u tri varijante: Standard, Max i Debug. Za
(llllllt'IC iz ove knjige, potrebna vam je varijanta Max, u koju su ukljuene razne kori-

lli IIIOgunosti, kao to su InnoDB tabele koje omoguavaju upotrebu transakcija,

Int' remo vrlo esto koristiti.


MySQL je na raspolaganju istovremeno u vie verzija: tekua verzija, najnovija ver-
~ 'l' 1 11ekoliko razvojnih verzija iz vie faza razvoja. Ova knjiga je napisana za verziju 4.1.
MySQL moete preuzeti s Web lokacije:
www mysql.com/downloads/index.html
U 11<\Stavku ovog poglavlja opisujemo kako se instaliraju binarne verzije MySQL-a
l'od l inuxom, Windowsom i OS X-om. Postoji MySQL i za nmoge dmge operativne
~ 1\lt'lllL', ali detalje o nainu instaliranja morate potraiti u MySQL-ovoj dokumentaciji.
l\\ n/L' bttt polrtbno 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 svea, vrlo je verovatno Al o vit.: volite da radite s grafikim alatkama, servis moete da uklonite i pomou
da vec Jmate neku verZljU MySQL-a instaliranu na svom raunaru, ali je takoe 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 moe biti prilino sloen i moe
ZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM t.tllikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta-
datoteku koju vam je isporuio proizvoa vae distribucije Linuxa, naroito ako tek l~t ,tll 11~ svojoj verziji Windowsa. Zaponite instaliranje raspakivanjem .zip datoteke
po~i~~ete uenje .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji auriraju
lt tp 1 ste preuzeli sa We b lokacije.
se cesc: n~go . u b1lo kojoj v distribuciji Linuxa, to znai da su u njih ugraena najnovija lJ zavisnosti od trenutka kada ovo budete itali, sadraj te datoteke moe biti druga-
poboljsanja J 1spravke gresaka . Osm1 toga, struktura direktorijuma na vaem raunaru
ql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe.
bie podeena kako je opisano u MySQL-ovoj dokumentaciji, to e vam za poetak
~ \ d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala-
svakako olakati traenje informacija.
' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL ete
_Jedna distribucija se sastoji od vie 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 bie zamenjena odgovarajuim brojem verzije.)
111\t.llirati u podrazumevani direktorijum.
Server i klijent moete instalirati ako u komandnom okruenju otkucate sledeu
Poto instalirate MySQL, treba da napravite datoteku s parametrima koji odreuju
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. Vie detalja o podeavanju sistema nai ete u odeljku "Podeavanje
. Time.ete pokrenuti i mysqld, MySQL server, i formirati odgovarajuu strukturu !'lema", u nastavku ovog poglavlja.
dJ:ektonjuma u /etc/ini t. d/ da bi se server automatski pokretao kada pokrenete Poto podesite parametre sistema, korisno je da server prvi put pokrenete s
racunar. ~ omandne linije. (U nastavku ovog poglavlja objasniemo kako se MySQL instalira
Ako elite da instalirate MySQL na neki drugi nain- tj. ne iz RPM datoteka ~ .10 Windowsov servis, ali pogledajmo prvo da li uopte radi.)
-potraite detaljnija uputstva u MySQL-ovoj dokumentaciji. Otvorite prozor komandne linije i preite u direktorijum u koji ste instalirali
Ivmajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i da se MySQL. Ako imate standardnu instalaciju, to e biti c:\mysql\bin.
moze. razb~ovat1 o~ onog koji moda poznajete iz verzija MySQL-a koje ste ranije Otkucajte sledee:
mstabrah, 1h od vase verzije Linuxa. mysqld-max --standalone
Trebalo bi da se nakon toga prikae grupa poetnih poruka. Ako je dosad sve
Instaliranje na Windows u redu, moete instalirati MySQL kao Windowsov servis.
~a biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prija- Otkucajte ime izvrive 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 pomou sledee komande: U ovoj knjizi preporuujemo izvrivu datoteku mysqld-max.
mysqladmin -u root -p shutdown Da bi vaa instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da
. Ako imate M~SQL ins~~iran kao Windowsov servis, moraete najpre da uklonite obavite jo jedan, poslednji posao. Poto su neki od programa pridruenih MySQL-u
taj serv1s. To mozete urad1t1 u komandnom okruenju pomou sledee komande: zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl maina 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 preporuujemo da izmenite sledee opcije :
tako to dvaput pritisnete ime te datoteke. Moete prihvatiti sve vrednosti parametara ll udui da emo koristiti InnoDB tabele, morate obaviti osnovno podeavanje za
koje vam instalacioni program ponudi za upotrebu s MySQL-om. upotrebu tog tipa tabela.
l'n:poruujcmo da ukljuite beleenje izmena u dnevnik (engl. binary log) u svim
Instaliranje na OS X situacijama . To je veoma korisno u sluaju oporavljanja od katastrofalnih greaka.
MySQL moete instalirati na OS X iz odgovarajueg paketa, pod uslovom da imate l 1 reporuujemo da ukljuite beleenje sporih upita u dnevnik, to e vam pomoi
OS X 10.2 ili noviji. da optimizujete svoje aplikacije.
Ako ve imate neku verziju MySQL servera koja je aktivna na vaem raunaru, MySQL smeta vrednosti konfiguracionih parametara u datoteku opcija. Ako kori-
morate je zaustaviti pre nego to zaponete instaliranje nove verzije. To moete ura- lit t Windows, globalnu datoteku opcija moete smesti ti u Windowsov sistemski
diti tako to na komandnoj liniji otkucate sledeu komandu: oi ill ktor uum i nazvati je my.ini, ili u e: \my.cnf. Preporuujemo 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 obino je
Da biste mogli da pokrenete server, potreban vam je korisniki nalog ije je ime
.llii'tena u direktorijum /etc/my.cnf. Ako elite da na istom raunaru radi vie
mysql. Ako imate OS X 10.2 ili noviji, taj nalog ve postoji.
r-- lySQL servera, podatke za svaki server moete 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, moete dozvoliti korisni-
diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.
Pojavie se sadraj datoteke slike diska. Pronaite PKG datoteku i dvaput je priti-
' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smetene u
snite. Za potrebe ove knjige moete prihvatiti sve vrednosti opcija koje vam instala- ol1tntcci -/.my.cnf(obratite panju na taku ispred imena datoteke).
U zavisnosti od vae instalacije, moda u poetku neete ni imati datoteku opcija.
cioni program ponudi.
t ltvorite tu datoteku u svom uobiajenom editoru za tekst- Notepad e sasvim lepo
MySQL moete podesiti tako da se automatski pokree pri podizanju sistema, tako
to dodate Startupitem. To moete uraditi ako dvaput pritisnete datoteku MySQL- nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.
Predlaemo vam datoteku opcija sa sledeim poetnim opcijama (listing 1.1):
Startupltem.pkg koja bi trebalo da se nalazi u vaoj .dmg datoteci.
Poto izvrite postupak opisan u odeljku "Podeavanje sistema", moete pokrenuti
l h ting 1.1 Predloena datoteka opcija
MySQL server tako to otkucate sledeu 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 moete pokrenuti pomou sledeeg niza log-slow-queries
komandi:
Podeavanje za InnoDB tabele
cd /usr/local/mysql ll Ovo je osnovna datoteka opcija predloena u dokumentaciji
sudo ./bin/mysqld_safe ll Datoteke za podatke treba da omogue
Pritisnite Ctrl+Z. I najzad, otkucajte sledeu 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 pokreete innodb_dat a_file_path = ibdatal:lOM:autoextend
ll Podesi te veliinu rezerve za bafere na
svoj sistem i elite da koristite MySQL. ll 50-80% koliine mermorije
Imajte u vidu da postupak instaliranja MySQL-a moe biti prilino sloen i moe ll na rau naru
se razlikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta- rwL-variable = innodb_buffer_pool_size=70M
lirali, ili moe biti drugaiji na vaoj verziji OS X-a. nPL-variable = innodb_additional_mem_pool_size=lOM
ll Podes ite veliinu dnevnika na priblino
ll 25% veliine rezerve za bafere
Podeavanje sistema set-variable innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=BM
Poetna konfiguracija MySQL-a radie ve takva kakvu ste je instalirali; meutim,
neke korisne mogunosti su standardno iskljuene a instalacija nije ' dovoljno zatiena.
# Podesite .. flush_log_at_trx_commit Da biste se odjavili iz MySQL monitora, otkucajte sledee:
# na O ako moete da prihvatite gubljenje
\q
# nekoliko poslednjih transakcija
innodb_flush_log_at_trx_commit=1 (Obrnuta kosa crta, slovo q i pritisak na taster Enter.) .. .. .
Meutim, nemojte se jo odjavljivati. (Ako ste to uradth, ponovo se pnjaVJte.) .
Vei deo sadraja 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 predloena u MySQL-ovoj doku- da koristite svoju instalaciju MySQL-a. Budui daje to vano, preporucujemo vam da
mentaciji. Ako imate postojeu instalaciju u kojoj se koriste InnoDB tabele i dodate n~stavite itanje ovog poglavlja.
joj ovu datoteku opcija, moda ete morati da pretvorite u komentar sledei red:
set-variable = innodb_log_file_size=20M Zadavanje lozinke za nalog root .
tako to ete
na poetku reda upisati znak#. (Ako ve imate datoteku dnevnika druge Kao to ste verovatno uoili ako ste se upravo prijavili na server, moral1 ste da. zadate
veliine, to e moda zbuniti MySQL.) une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku
Ostala podeavanja opisana su u poglavlju 12, "Podeavanje MySQL-a". n:tlog root nema lozinku. Iz oiglednih bezbednosnih razloga, veoma je vano da tom
ualogu dodelite lozinku. U MySQL monitoru otkucajte sledee:

Provera da li sistem radi aet password for rootlocalhost=password('lozinka');


Poto instalirate MySQL, podesite ga tako da se automatski pokree pri podizanju Razume se re lozinka zameniete lozinkom koju ste izabrali za nalog root.
raunara. Ako je tano podeen, trebalo bi da bude mogue uspostavljanje veza sa Odjavite se' (\q) a zatim se ponovo prijavite. Ovog puta ete morati da se prijavite
MySQL serverom. slcdeom komandom:
To moete proveriti pomou sledee komande: mysql -u root -p
mysql -u root MySQL e zatraiti da zadate svoju lozinku. Parametar -u znai ime korisnika,
Moe biti potrebno da zadate punu putanju izvrive datoteke mysql (na primer, na ;1 parametar -p znai da se prijavljujete s lozinkom.
Windowsu, to je obino e: \mysql \bin\mysql -u root) ili da izmenite vrednost
sistemske promenljive PATH.
Trebalo bi da se na ovaj nain uspeno prijavite kao korisnik root (administrator)
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 vaem
potrebno zadavanje imena korisnika prilikom prijavljivanja.' Pr~poruujemo vam da te
ekranu trebalo bi da se pojavi sledea uvodna poruka:
naloge izbriete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .
Welcome to the MySQL monitor. Commands end with ; or \g. "Zatita 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 pomou sledeeg niza komandi:
Type 'help; ' or '\h' for help. Type '\e' to clear the buffer. use mysql;
mysql> delete from user where User='';
Na vaem sistemu e verovatno biti razliit 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 sledeu:
ERROR 2003: Can't connect to MySQL server on 'localhost' (10061) Pravljenje na loga za uobiajene poslove .. . .
Jz bezbednosnih razloga, korisno je da umesto naloga root, za uobJcajene l svakod-
to znai da MySQL server ne radi. Pokuajte ponovo da pokrenete sistem da bi se ser-
nevne poslove koristite neki drugi nalog. . . . .
ver automatski pokrenuo zajedno s njim, ili runo pokrenite server pomou komande:
V

Ovde je samo ukratko opisano kako se prav1 nov konsmckt ,n~log. Vtse deta.lja
mysqld --standalone tome kako se upravlja korisnikim nalozima u MySQL-u naCl cete u poglavlju 11,
0
na komandnoj liniji. (To ete najlake uraditi u jednom prozoru, a zatim otvorite "Upravljanje pravima korisnika" .
drugi prozor iz kojeg ete se prijaviti na server.)
Pomou sledee komande napravite nov nalog koji ete koristiti za svakodnevne
poslove:
grant create, create temporary tables, delete, execute, index,
insert,
lock tables, select, show databases, update
on*.*
2
to imekorisnika identified by 'lozinka ' ;

Razume se, umesto rei imekorisnika i lozinka, u tekst komande treba da upiete
svoje korisniko ime i odgovarajuu 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 zavrnih poglavlja ove knjige mora-
ete da koristite nalog root da biste obavili odreene poslove, ali poto korisniki

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-
d1uene. Poveemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u
Saetak MySQL-u i koji su najei klijentski interfejsi. Razmotriemo sledece teme:
U ovoj f.ni trebalo bi da vaa instalacija MySQL-a bude upotrebljiva a vi spremni da
Strukturu MySQL-ovih direktorijuma
sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili sledee:
Pregled izvrnih datoteka
Preuzeli najnoviju binarnu verziju MySQL-a za va operativni sistem s Web loka-
Pregled korisnikih interfejsa
cije mysql.com.
Kratak uvod u MySQL monitor.
Instalirali je- pomou instalacionog programa (na Windowsu ili OS X-u) ili
pomou alatke RPM.

Podesili server tako da se automatski pokree pri podizanju sistema, ako je to u truktu ra MySQL- ovih direktorijuma ..
vaem sluaju prihvatljivo. l J ovom poglavlju pretpostaviemo 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 bie ista, ali e kerenski direktorijum biti drugaiji.
Zadali lozinku za nalog root. Ukoliko vam je proizvoa isporuio sistem sa ve instaliranim MySQL~om:.
11uktura direktorij uma e se moda razlikovati. Na primer, ako Imate dJstn~uCIJU v .
Izbrisali anonimne naloge.
l~l'd Hat 9, otkriete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1
Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove. ,1,tcm skladitenja datoteka. Ako ste MySQL instalirali iz RPM d~toteka. koje potJCu
.1 MySQL-ove Web lokacije, trebalo bi da datoteke budu na mestima koje navodimo
Vebe 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 preporueno u poglavlju 1, u odeljku "InstaliranJe
U sledeem poglavlju MySQL-a". . . . ..
U poglavlju 2",Kratak obilazak", pogledaemo komponente vae instalacije MySQL-a, Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .
ponovo emo pogledati korisnike interfejse i osnovni nain upotrebe MySQL-a. MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski
ducktorijumje C:\mysql.
/U rUylctVIJt: L 1'\.ldldl\. UVIIOLO" Pregled korisnikih interfejsa 21

U tom direktorijumu nai ete, izmeu ostalog, sledee poddirektorijume (pod Kroz celu ovu knjigu koristiemo 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 vie Pogledajte sadraj direktorijuma scripts. Programi koji se u njemu nalaze su skrip-
drugih korisnih programa u prevedenom obliku. Sadraj tog direktorijuma opi- tovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu
h111. Upotrebu nekih meu njima opisaemo kada vam budu zatrebali u ovoj knjizi.
san je u narednom odeljku ovog poglavlja.
scripts: Ovaj direktorij um sadri grupu skri p tova napisanih na jeziku Perl koji Najvaniji od onih koje emo koristiti u ovoj knjizi jeste mysqlhotcopy, koji slui za
obavljaju korisne poslove. Objasniemo 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 vai podaci.
does (Linux) ili Does (Windows): U ovom direktorijumu nai ete dokumenta- Pregled korisnikih interfejsa
ciju o MySQL-u, u HTML formatu. MySQL-u moete pristupati pomou vie korisnikih interfejsa, ili klijentskih pro-
sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se pro- gl.l!na.Tri najpopularnija korisnika interfejsa su: mysql (u obliku komandne linije),
poznat i kao MySQL monitor, MySQL Control Center (ili, skraeno, MySQLCC)
grami za testiranje MySQL-a.
1 phpMyAdmin.
Postoji jo nekoliko drugih direktorij uma u koje e prosean korisnik retko zala-
MySQL monitor je ukljuen u osnovnu instalaciju MySQL-a, a komande se
ziti. To su: include (sadri datoteke zaglavlja), lib (biblioteke funkcija koje MySQL
:.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se
koristi), share (sadri tekst poruka o grekama koje MySQL alje) i example (postoji
l o listi i radi na svim platformama.
samo na Windowsu, sadri primere upotrebe datoteke libmysql.DLL). Ako instalirate
MySQL Control Center (MySQLCC) jeste grafiki korisniki interfejs. Napisan je
drugi softver (kao to je PHP) koji se povezuje s MySQL-om, moe vam zatrebati da
pomou skupa alatki za izradu prozora Qt, koji omoguava izradu verzija za razliite
znate gde se ti direktorijumi nalaze ali malo je verovatno da ete neto 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 korisniki interfejs za upotrebu MySQL-a. Veoma je popu-
Pregled izvrnih datoteka 111 an meu dobavljaima Internet usluga koji svojim korisnicima stavljaju na raspola-
MySQL-ove izvrne 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 zvanini
U njemu ete nai izvrnu 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 111nda ete morati da ga posebno preuzmete sa adrese:
poglavlju 1 podesili tako da se automatski pokree zajedno sa operativnim sistemom. www.mysql.com/downloads/mysqlcc.html
Tu ete nai i mysql, MySQL monitor. To je osnovni klijentski program sa mter- MySQLCC se izuzetno lako instalira, a uputstva o tome nai ete na adresi:
fejsom u obliku komandne linije. . www.mysql.com/products/mysqlcc/install.html
Osim ova dva najvanija programa, nai ete i vie drugih. Upotrebu mnogih od
njih opisaemo u pojedinim poglavljima ove knjige. Ovde emo navesti samo neke phpMyAdmin moete preuzeti sa adrese:
meu najkorisnijim: www.phpmyadmin.net/

mysqladmin: Slui za obavljanje administrativnih funkcija. Ako elite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser-
myisamchk: Slui za proveru i popravljanje oteenih MyiSAM tabela. nl 1 instaliran PHP.
Za potrebe ove knjige, nevano je koji ete korisniki interfejs odabrati. Svi nude
mysqldump: Omoguava izradu rezervnih kopija baze podataka.
Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika-
mysqlbinlog: Omoguava itanje dnevnika izmena, to je kljuno za opora-
:tiJll takoe u obliku teksta, bez obzira na korisniki interfejs koji upotrebite.
vljanje baze u sluaju katastrofalne greke. i>rimeri koje dajemo u ovoj knjizi testirani su pomou MySQL monitora, ali vi
mysqlshow: Slui za prikazivanje podataka o bazama podataka i njihovim 1110ete koristiti ta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god
tabelama. 111u~i klijentski program naete na Internetu. Za neke poslove bie potrebno da izaete
it kn ns n ikog interfejsa i upotrebite koma n dno okruenje operativnog sistema.
22 Poglavlje 2 Kratak obilazak
Saetak

Kratak uvod u MySQL monitor tHireenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka
Sada emo ukratko opisati osnovni nain upotrebe MySQL monitora. Prijavljivanje za p.1 pokuajte ponovo.)
rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni- Poto izaberete bazu podataka, moete videti koje se sve tabele nalaze u njoj, ako
tor prijavljujete se pomou sledee 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 odreenoj tabeli moete dobiti pomou komande:
vljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom raunaru, til ncri be tablename;
moete upotrebiti opciju -h da biste zadali ime tog raunara; na primer: Iz MySQL monitora moete se odjaviti tako to otkucate:
mysql -h imeraunara -u imekorisnika -p \q
U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postiete i
bratite panju na to da se ova komanda ne zavrava znakom taka i zarez. Postoji
pomou opcije --safe -update s. Na primer:
l', illpa komandi koje poinju znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr-
mysql --i-am-a-dummy -u root -p ,, va se znakom taka i zarez. Spisak tih komandi moete dobiti ako otkucate:
Ova opcija ograniava tetu koju biste mogli da nainite pomou zadate komande. \h
To je naroito korisna opcija (na raspolaganju samo u alatki u kojoj se komande (Slovo h potie od rei help.)
zadaju na komandnoj liniji) kada se kao poetnik malo pribojavate rada u MySQL-u.
MySQL-ove i SQL-ove komande moete upisivati direktno ll MySQL monitor.
Moda bi bilo dobro daje koristite dok itate ovu knjigu. (Konkretno, ova opcija vas
Ml'tlutim, te komande moete takoe uneti u datoteku koju zatim izvrite jednom
spreava da aurirate ili izbriete redove u tabelama ako ne zadate vrednost primarnog
~ o111andom, kao skript. To ete raditi u nastavku ove knjige, npr. kada u poglavlju 4,
kljua tih redova. Ako jo ne znate ta to tano znai, nemojte brinuti. Sve e postati
,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.
jasno u treem delu knjige, "Upotreba MySQL-a".)
Ako ste prijavljeni u MySQL monitor, datoteku koja sadri komande moete izvr-
Poto se prijavite u MySQL, moete 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 moete
Kod veine italaca, u ovoj fazi rezultat ove komande bie kratak spisak baza poda- rr.vriti preusmeravanjem rezultata te datoteke; na primer:
taka. Trebalo bi da se na vaem spisku pojavi baza podataka mysql. To je sistemska
my oql -u imekorisnika -p e imedatoteke
baza podataka u kojoj se uvaju podaci o korisnikim nalozima i njihovim pravima.
Vie rei o tome bie u nastavku ove knjige. Ovim ste stekli osnove o nainu upotrebe klijentskog programa mysql.
Obratite panju na to da se komanda zavrava znakom taka i zarez. Veinu
komandi koje otkucate u MySQL monitoru morate zavriti tim znakom ina e ih aetak
MySQL nee izvriti. Otkucajte:
Najvaniji direktorijumi u instalaciji MySQL-ajesu bin (izvrni programi), data
show databases
(podaci iz baze podataka) i does (dokumentacija).
i zatim pritisnite Enter. MySQL e samo mirno ekati. Ako potom otkucate znak taka
Dva programa koja ete n;Uee koristiti jesu mysqld (MySQL server) i mysql,
i zarez i pritisnete taster Enter, komanda e biti izvrena. To omoguava da sloene klijentski program u kojem se komande zadaju preko komandne linije.
komande raspodelite u vie redova da bi bile itljivije. Umesto znaka taka i zarez,
Moete birati izmeu vie korisnikih interfejsa, odnosno klijentskih programa.
moete upisati \g (obrnuta kosa crta i slovo g), ali veina koristi taku i zarez.
Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafiki
Moete izabrati neku bazu podataka sa liste i otkucati sledeu komandu:
interfejs) i phpMyAdmin (Web interfejs).
use imebaze; Program mysql ima vie korisnih opcija koje moete zadati na njegovoj komand-
(Upiite tano 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 odreenom baz<?m podataka. Izabe- s lozinkom), -h (kojom se zad;Ue ime udaljenog raunara) i --i-am-a-dummy
rite jednu sa spiska i otkucaj te ovu komandu. (Moda neete imati prava da pristupite (za ograni:lvanjc mogue tete).
24 Poglavlje 2 Kratak obilazak
U sledeem poglavlju

Poto se prijavite na server, moete izdati komande SHOW DATABASES ili SHOW Vebe
TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta-
l'r tuznute i instaliraj te neki grafiki ili Web korisniki interfejs, kao to je MySQLCC.
bele da biste dobili podatke o odreenoj tabeli.
Vtzbajte prijavljivanje i prikazivanje spiska postojeih baza podataka pomou klijent-
Iz MySQL servera moete se odjaviti pomou komande \q. lo~ programa koji ste izabrali .
Komande moete zavravati znakom ; ili znakovima \g da biste ih poslali servem
na izvrenje .
Datoteku koja sadri komande moete izvriti iz klijentskog programa pomou
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 sledeem poglavlju
l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri emo opte kon-
2. Dokumentacija o MySQL-u nalazi se u
' qllt:u vezi s bazama podataka, terminologiju i principe projektovanja, ukljuujui i
a) direktorijumu does ili Does
rrnrrnalizaciju.Ako niste poetnik u oblasti baza podataka, ali ste poetnik u MySQL-u,
b) direktorijumu lib '" rrtorate detaljno proitati 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 zavravaju znakom taka i zarez
b) komande treba da se zavravaju znacima \g
e) moe a) ili b)
d) nita od prethodnog nije tano
5. Opcija --i-am-a-dummy zadata u programu mysql
a) znai tano to to pie
b) spreava me da napravim previe tete dok uim SQL
e) spreava me da uradim bilo ta osim prijavljivanja i odjavljivanja
d) nita od prethodnog nije tano
II
Projektovanje i izrada
baza podataka u MySQL-u

\ Ubrzani kurs projektovanja baza podataka


l Pravljenje baza podataka, tabela i indeksa
3
Ubrzani kurs projektovanja
baza podataka

U OVOM POGLAVLJU RAZMOTRIEMO 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 znai da e na
'riJ hrt i to manji utroak prostora na disku uz ouvanje svih veza koje postoje izmeu
1'HI.1taka.
R.1zmotriemo sledee teme:

Koncepti i terminologija baza podataka


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

Koncepti i terminologija baza podataka


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

l ntiteti i relacij e
l hnovni elementi koje emo pokuati da model ujemo jesu entiteti i relacije. Entiteti su
'' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog ivota o kojima uvamo podatke
11 h.1:n podataka. Na primer, moemo se opredeliti da evidentiramo podatke o zaposle-

111111.1 i slubama u kojima rade. U tom sluaju bi zaposleni bio jedan entitet, a sluba
11 ~nJoj radi- drugi. Relacije su veze koje postoje izmeu entiteta. Na primer, zaposleni
t,tdi ll slubi. "Radi u" je relacija (veza) izmeu entiteta zaposleni i sluba.
ltdacije mogu biti razliitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan
ptt'tlla vie" (ili "vie prema jedan", u zavisnosti od toga s koje strane relacije posma-
lt,tlt') 1., vie prema vie". 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 pisaim 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
ee je tipa "vie prema jedan", tj. vie zaposlenih radi u datoj slubi .Tc dve vrste rela- \ ltiiWgement System, RDBMS), to znai da podrava 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 proraune, 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),
Istraivanje i razvoj imena (name), poslovi kojima se bave Gob) i slube u kojima rade (departmentiD).

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

Kolone ili atributi


l J tabelama baze podataka, svaka kolona ili atribut opisuje odreeni podatak koji se
Candy
-Jr________.____", 11.d.tzi u svakom redu tabele. Rei kolona (engl. column) i atribut (obeleje, engl. attri-

~~'
Nora
/111/r) koriste se kao sinonimi, ali tanije je rei da je kolona deo tabele, dok se atribut
1 ul11osi na entitet iz stvarnog sveta koji tabela modeluje. Na slici 3.2 vidljivo je da svaki

.1posleni ima atribute employee ID, name, j ob i department ID. To su kolone tabele
r lltployee, koje se ponekad nazivaju i atributi ili polja (engl.fields) tabele.

~-------'----"'
: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. Moda ete uti izraze redovi (engl. rows), slogovi ili zapisi (engl. records)
Ajay 11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadri podatke iz svih kolona tabele.

Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan". Kljuevi
Relacija "radi u" jeste tipa "vie prema jedan". ..,. IIJII'rkiju (engl. superkey) je kolona (ili grupa kolona) koja jednoznano identifikuje red
t.tbele. Klju (engl. key) je minimalni superklju. Pogledajte tabel u employee. Da bismo
)l'dnoznano identifikovali svakog zaposlenog, moemo upotrebiti kombinaciju kolona
Imajte u vidu da entiteti, relacije i vrste relacija meu njima zavise od okruenja i
t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job,
poslovnih pravila koje pokuavate da modelujete. Na primer, u nekim firmama jedan
tkpartmentiD). Obe kombinacije su superkljuevi.
zaposleni moe raditi u vie slubi. U tom sluaju bi relacija "radi u" bila tipa "vie
Meutim, da bismo jednoznano identifikovali svaki red tabele, nisu nam potrebne
prema vie". Ako vie 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 pomou koje nedvosmisleno identifikujemo svaki red. Prema
Kada projektujete bazu podataka, morate uzeti u obzir pravila koja vae u sistemu
tome, klju je kolona employeeiD.
koji modelujete. Ne postoje dva potpuno jednaka sistema.
Pogledajte ponovo tabelu employee. Jednog zaposlenog moemo identifikovati po
1111enu (name) ili po ifri zaposlenog (employeeiD). Obc kolone su kljuevi. Tc klju
(l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogui bndid~ti
1.( t'UYilVIJC:: J UUfLlnl KUf~ prUJC::KlUVlnJl UlLl pUUlllKl nmc1p1 prUJC::KlUVlnJl UlLl pUUtlliiKil

meu kojima emo izabrati primarni (engl. pri mary) klju. Primarni klju je kolona ili H dundantnost i gubljenje podataka
grupa kolona pomou koje emo jednoznano identifikovati pojedine redove tabele. l Hla projektujemo emu baze podataka, to moramo uraditi tako da redundantnost
U ovom sluaju, za tu namenu koristiemo 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 dogaa da dve osobe imaju isto ime i prezime. 111 llphodan. Redundantni podatak u ovom kontekstu znai da se isti podatak ponavlja
Spoijni kljuevi (engi.Joreign keys) predstavljaju veze izmeu tabela. Na slici 3.2 vidite 11 1azliitim redovima iste tabele ili u razliitim tabelama baze podataka.
da kolona departmentiD sadri brojeve koji predstavljaju ifre slubi u kojima rade Zamislite da umesto dve tabele, employee (zaposleni) i department (slube), imamo
zaposleni. To je spoljni klju; skup svih podataka o odreenoj slubi uva se u drugoj 11110 jednu tabelu koja se zove employeeDepartment. To moemo izvesti ako tabeli
tabeli, u kojoj je primarni klju kolona departmentiD. IIIJlloyee dodamo kolonu departmentName tako da ema tabele postaje sledea:
cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)
Funkcionalne zavisnosti Za svakog zaposlenog koji radi u slubi iji je ifra 128, Research and Development
Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ree nego drugi koje (htt.1ivanje i razvoj), moramo da ponovimo podatak "Research and Development"
smo naveli, ali treba da shvatite njegovo znaenje da biste razumeli postupak normali- ( Irb 3.3). Isto vai i za sve ostale slube kompanije.
zavanja o kojem e biti rei u nastavku ovog poglavlja.
Ako u datoj tabeli postoji funkcionalna zavisnost izmeu kolone A i kolone B, koja
employeeDepartment
se moe napisati kao A -7 B, vrednost u koloni A odreuje 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 odreuje 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 slube.
Izraz ema ili ema baze podataka (engl. database schema) oznaava strukturu ili dizajn
baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke. Ovu emu moemo da izmenimo na sledei nain:
Da bi vam bilo jasnije, ema je "nacrt strukture" podataka koji se uvaju u bazi. tmployee(employeeiD, name, job, ~-~P.~r_t_l?}!'!.~-~l:Q)
emu jedne tabele u bazi podataka piemo na sledei nain: dcpartment(departmentiD, name)
employee (employeeiD, name, j ob, ~-~P.~r_t_I?!!'!.~_nR)
U ovom sluaju se naziv slube uva na samo jednom mestu, pa se minirnizuje
U ovoj knjizi draemo se pravila da se atributi koji predstavljaju primarne kljueve 1111 oak prostora na disku i izbe gavaju odreeni problemi.
podvlae punom linijom, a atributi koji predstavljaju spoljne kljueve - takastom. Pri-
Obratite panju na to da smo morali da ostavimo kolonu departmentiD u tabeli
marni kljuevi koji su istovremeno i spoljni, podvlae se i punom i takastom linijom. 111ployee; bez nje bismo izgubili informaciju iz eme, odnosno u ovom sluaju bismo
1/~llbili vezu izmeu zaposlenog i slube u kojoj radi. Kada poboljavamo emu baze

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

Koje sve podatke treba uvati, odnosno o kojim sve stvarima ili entitetima Anomalije
moramo da uvamo podatke? /\11omalije su neto sloeniji koncept. To su problemi koji se pojavljuju meu poda-
Koju emo vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se ' 1111.1 zbog loe osmiljene strukture baze podataka. Mogu se pojaviti tri vrste anoma-
upiti.) lq.t, koje emo opisati na primeru loe osmiljene eme sa slike 3.3.
Kada traimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila
organizacije koju pokuavamo da modelujemo, o emu sve moramo da uvamo Anomalije pri dodavanju podataka
Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loe osmiljenom struktu-
podatke i koje su veze izmeu tih podataka.
llllll pokuate 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 iskljuuje strukturne probleme kao to su redundantnost (dupli-
1111csemo i ifi-u i naziv slube u kojoj radi. ta se dogaa ako unesemo podatke koji se
ranje) podataka i anomalije podataka.
1,wlrkujr1 od postojeih u tabeli, npr. ako upiemo da novi zaposleni radi u slubi ija
Jl' sili .1 42, J evl'lopment? Nakon toga vie nee biti jasno koji redovi tn bele sadre
1\jli.IVIIl' pod.1tkt 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOl'IIJll pod;~(;1k;l.
ll t'll91ilVIJe 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 briu iz tabele s loe osmilje- Nora Edwards Programmer
1~
~~ Ben Smith OBA
1 ~~en. Java

nom strukturom. Zamislite da svi zaposleni iz slube ija je ifra 128 daju otkaz (moda 6651
9006
,AJay Palal
Candy Burnett
Programmer
Systems Administrator
128
128
VB, Java
NT, Linu)(
zato to im je sve dojadilo). Poto izbriemo sve zapise o tim zaposlenima, vie nemamo
nijedan zapis u kojem se pominje sluba sa ifrom 128, niti njeno ime. To je primer Slika 3.4 Ova ema nije u prvoj normalnoj formi zato to kolona
skills sadri grupu vrednosti.
anomalije pri brisanju.

Anomalije pri auriranju podataka Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto
Anomalije pri auriranju podataka nastaju kada se auriraju podaci u tabeli s loe osmi- d.1sadri prostu vrednost kao to je Java, kolona sadri listu vrednosti, kao to je e,
ljenom strukturom. Zamislite da je rukovodstvo donelo odluku da sluba ija je ifra l ' t l , Java. Time je prekrena pravilo prve normalne forme.
128 promeni ime u EmergingTechnologies. U tom sluaju moramo izmeniti podatke Da bismo ovu emu doveli u prvu normalnu formu, moramo razdvojiti vrednosti
pojedinano za svakog zaposlenog koji radi u toj slubi. Lako se moe dogoditi da nekog 11 koloni skills na proste elemente. To se moe obaviti na vie naina. Prvi i moda naj-
izostavimo.Ako se to desi, imaemo anomaliju pri auriranju. ' n tglcdniji nain prikazan je na slici 3.5.

Null vrednosti emclovee


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

koje dozvoljavaju vei 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 vie 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 sadrala 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 sluaju napravili smo jedan red po strunoj kvalifikaciji. Ova ema je sada
Normalizovanje 11 prvoj normalnoj formi.
Normalizovanje je postupak koji omoguava ispravljanje loe osmiljene strukture Razume se, ova organizacija podataka je daleko od savrene jer imamo veliku
baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, to su ~t dundantnost- za svaku kombinaciju struna 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 reenje i pravilan nain organizovanja ovih podataka u prvu normalnu formu
Da biste pratili postupak normalizovanja, na strukturu baze podataka primeniemo prikazano je na slici 3.6.
redom sve tri normalne forme. U svakoj nomalnoj formi obino 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 treoj 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 znai da svaki atribut mora sadrati samo jednu 9006 NT
9006 Linux
vrednost, a ne kom.binaciju vie vrednosti ili drugi red baze podataka.
Pogledajte tabelu na slici 3.4. Slika 3.6 Pravilno reenje 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 struna
znanja svakog zaposlenog.
Jb t"ogtaVIJe J uorzan1 Kurs proJeKtovanJa oaza poaaiaKa Normalizovanjc

U ovom primeru, preneli smo strune kvalifikacije u zasebnu ta belu koja slui '!''::!belu moramo razdvojiti na vie tabela u kojima su svi atributi koji nisu deo pri -
samo da povee ifre zaposlenih s pojedinim kvalifikacijam.a. Time smo reili problem liLl rnog kljua funkcionalno potpuno zavisni od primarnog kljua. U ovom sluaju je
redundantnosti. ''' 1glcdno da to moemo postii ako tabelu razdvojimo na dve tabele:
Moda se pitate kako smo doli do drugog reenja. 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 sluaju, na kraju dobijamo emu sa slike 'lb je ema prikazana na slici 3.6.
3.6. Prednost iskustva je to to omoguava predvianje 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 takoe u drugoj normalnoj formi zato to svaki atribut koji nije
dl' o primarnog kljua sada je potpuno zavisan od svih delova primarnog kljua.
Druga normalna forma
Poto postavimo emu u drugu normalnu formu, moemo je preneti u naredne nor- Ir a normalna forma
malne forme vieg stepena, koje se neto tee razumeju. I'1111Ckad ete uti nekoga da kae: "Normalizovanje se tie kljua, celog kljua i nieg
Kae se daje ema u drugoj normalnoj formi (koja se takoe zove 2NF), ako su svi
t11t1gog osim kljua". Druga normalna forma nalae da atributi moraju zavisiti od
atributi koji nisu deo primarnog kljua funkcionalno potpuno zavisni od primarnog 1 1 log kljua. Trea normalna forma propisuje da atributi zavise samo od kljua.
kljua i emaje ve u prvoj normalnoj formi. ta to tano znai? To znai da svaki atri-
1:ormalno, da bi ema bila u treoj normalnoj formi (3NF), moramo ukloniti sve
but koji nije deo primarnog kljua 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 kljua, tj. ako primarni klju ini vie kolona, svi ostali atributi tabele moraju lidll:titivna zavisnost?
biti zavisni od kombinacije svih tih kolona. Pogledajte ponovo sliku 3.3. Prikazana je sledea ema:
Pogledajmo primer da bi postalo jasnije. l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)
Pogledajte sliku 3.5. U toj emi, tabela sadri jedan red po zaposlenom i po strunoj
kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog ega? Ova ema sadri sledee funkcionalne zavisnosti:
ta je primarni klju te tabele? Znamo da primarni klju mora jednoznano identifi- l'mployeeiD -7 name, job, departmentlD, departmentName
kovati svaki red tabele. U ovom sluaju, to je mogue samo pomou kombinacije kolona dcpartmentiD -7 departmentName
employeeiD i skills. Ako je sadraj kolone skills kao na slici, kolona employeeiD nije Primarni klju je employeeiD i svi atributi funkcionalno su potpuno zavisni od
dovoljna za jednoznano 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. Meutim, poto kombinacija vrednosti u kolonama employeeiD Meutim, vidljivo je i to da imamo:
i skills jednoznano identifikuje svaki red, upotrebiemo je kao primarni klju. Tako l'mployeeiD -7 departmentName
dolazimo do sledee 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
sluajuimamo:
employeeiD, skill -7 name, job, departmentiD Obratite panju i na to da atribut departmentiD nije klju.
ali i Ovaj odnos znai da je funkcionalna zavisnost employee ID -7 departmentName
employeeiD -7 name, job, departmentiD li,lllzitivna zato to postoji "meukorak" (zavisnost departmentiD -7 departmentName) .
Da bismo doli do tree normalne forme, moramo ukloniti ovu tranzitivnu zavisnost.
Drugim reima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo Kao i u prethodnim formama, da bismo doli do tree normalne forme, tabel u raz-
odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znai da su ti atri- dv.l_J.lmo na vie drugih tabela. U ovom sluaju takoe, prilino je oigledno ta bi trc-
buti funkcionalno samo delimino zavisni od izabranog primarnog kljua, odnosno lo.do da uradimo. emu d elimo na dve tabele, employee i department, na sledei nain:
vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog kljua 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.
Sledee pitanje je: "Kako bismo je doveli u drugu normalnu formu?"
'18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka
Pitanja 3

To nas vraa na emu tabele employee prikazanu na slici 3.2. Ona je u treoj nor- l'rmcipi projektovanja baza podataka
malnoj formi.
Redundantnost se mora minimizovati, ali bez gublje~a podataka.
Drugi nain da opiemo treu normalnu formu jeste da kaemo sledee: fo~maln~,
ako je ema u treoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh, Anomalije pri dodavanju, brisanju i auriranju jesu problemi koji se pojavljuju
ispunjen je jedan od sledea dva uslova: kada se u tabelu s loe osmiljenom strukturom podaci dodaju, briu iz nje ili
auriraju .
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 kljua te tabele.
Normalizovanje je formalni postupak koji omoguava poboljava~ e strukture
Drugi uslov se ne pojavljuje ba tako esto! U veini sluajeva, sve funkcionalne baze podataka.
zavisnosti bie obuhvaene prvim uslovom.
Prva normalna forma (lNF) znai da kolone ili atributi sadre iskljuivo proste
vrednosti.
Boyce-Coddova normalna forma
Poslednja forma koju emo - ukratko- razmotriti jeste Boyce-Cod~ova normalna Druga normalna forma (2NF) znai da svi atributi izvan kljua mor;Uu zavisiti od
celog kljua.
forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh ~mo ~~a usl.ova.
Da bi tabela bila u BCNF, mora biti u treoj normalnoj formi i mora 1spumt1 prv1 od Trea normalna forma (3NF) znai da ne sme biti tranzitivnih zavisnosti.
dva uslova, tj. sve funkcionalne zavisnosti moraju imati superklju na levoj strani. IJoyce-Coddova normalna forma (BCNF) znai da svi atributi moraju biti funk-
Taj uslov je esto automatski ispunjen i bez pred uzimanja posebn~hv mera, kao u cionalno odreeni superkljuem.
ovom primeru. Ako imamo zavisnost koja kri 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 vieg stepena ..
Postoje i normalne forme viih stepena (etvrta, peta itd.) ali su one pogodmje za aka- a) Minimalni klju
demske rasprave nego za praktinu primenu na projektovanje b~za podataka. 3NF b) Spoljni klju
(ili BCNF) sasvim. je dovoljna da rei te probleme redundantnost1 podataka na koje e) Grupa atributa koja jednoznano identifikuje svaki red tabele
ete naii.
d) Minimalna grupa atributa koja jednoznano identifikuje svaki red tabele
1
Ako je tabela u drugoj normalnoj formi
Saetak a) Takoe je u prvoj normalnoj formi
Za kraj, evo ta smo sve razmotrili u ovom poglavlju. b) Takoe je u treoj normalnoj formi
e) Ne sadri tranzitivne zavisnosti
Koncepti
d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog kljua
Entiteti su "stvari", a relacije su veze imeu njih . l, Ako je tabela u treoj normalnoj formi
Tabele sadre podatke koji se prikazuju u tabelarnom obliku.
a) Takoe je u Boyce-Coddovoj normalnoj formi
Kolone tabela su atributi (obeleja) koji opisuju svaki entitet. b) Sadri atribute koji nisu prosti
Redovi tabela sadre vrednosti iz svih kolona tabele .
e) Ne sadri tranzitivne zavisnosti
Kljuevi omoguavaju jednoznano identifikovanje pojedinih redova.
d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog kljua
Funkcionalne zavisnosti opisuju koji atributi odreuju vrednosti drugih atributa. 1. Tri vrste anomalija nastaju pri
eme su "nacrti" baze podataka.
a) dodavanju, uitavanju i brisanju podataka
b) dodavanju, aurira~u i brisanju podataka
e) uitavanju, auriranju i brisanju podataka
40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka

4
5. N-torka je
a) kolona
b) red
e) kandidat za klju
d) vrsta narodnog kola
e) spoljni klju
Pravljenje baza podataka,
Vebe tabela i indeksa
1. Normalizujte sledeu emu u treu normalnu formu:
Porudbine(ifraKupea, imeKupea, adresaKupea, brojPorudbine, datumPorud-
bine, ifraRobe, nazivRobe, koliinaRobe)
2. Pokuajte da osmisli te emu koja je 3NF ali ne i u BC NF.

Odgovori u O VO M POGLAVLJU NAUIETE


da pravite osnovne MySQL strukture: baze
tabele i indekse. Razmotriemo sledee 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 postojeih struktura tabela.
Vebe /.a rad s primerima u ovom poglavlju koristiemo jednostavnu bazu podataka: to je
1. 1:,1 podataka employee o kojoj je ve bilo rei u prethodnom poglavlju. ema te baze
Kupei(ifraKupea, imeKupea, adresaKupea) l"'d .1t~kaje sledea:
Porudbine(brojPorudbine, datumPorudbine, ~~~~~':~~~-~) tmployee(employeeiD, name, job, ~~p-~:~~~-r:~_I_l2)
StavkePorudbine(k:~i_~-~:_l!_~~~~~~.' ~~~~~?_<: koliinaRobe) t kpa rtment( departmentiD. name)
Roba(ifraRobe, nazivRobe)
tmployeeSkills(employeelD, skill)
2. Postoji puno moguih reenja, proverite samo da vae ne kri pravila
tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)
normalizovanja.
. l ssi gnmcnt(~}~~~-~~~.' ~-~J?!~Y~:!:'?. workdate, hours)
U sledeem poglavlju l >ok itate gradivo iz ovog poglavlja, moete unositi odgovarajue komande da biste
U poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", pretvoriete 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 pomou bilo kojeg klijentskog programa za MySQL, ali u ovim primc-
' lllt.l , bazu podataka napraviemo pomou MySQL monitora. Opredelili smo se za to
11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa.
42 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Biranje baze podataka

Trebalo bi da se najpre prijavite u MySQL monitor, na isti nain na koji ste to inili l lgl.tvnom, identifikatori mogu sadrati sve znakove koji postoje, osim sledeih:
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 mogunosti za definisanje podataka koje prua jezik
Imena baza podataka mogu sadrati sve znakove koji su dozvoljeni u imenima
SQL da bismo pravili baze podataka, tabele i indekse. ta to tano znai? SQL je skra-
1hrcktorijuma, ali ne i znakove koji imaju posebno znaenje u imenima direkto-
enica od Structured Query Language (strukturirani jezik za upite), to je jezik koji
1 Uu ma (/, \ i .) , iz oiglednih razloga.
emo koristiti za izradu relacionih baza podataka i uitavanje podataka iz njih. ine ga
dve semantiki odvojene komponente: jezik za definisanje podataka (engl. Data Difini- Imena tabela mogu sadrati sve znakove koji su dozvoljeni u imenima datoteka,
tion Language, DDL), koji omoguava formiranje struktura baze podataka), i jezik za rad osi m znakova . i l.
s podacima (engl. Data Manipulation Language, DML), koji omoguava pretraivanje ~vi identifikatori, osim alijasa, mogu se sastojati od najvie 64 znaka. Imena alijasa
baze podataka. (opt~ani su u poglavlju 7 ",Sloeniji upiti") mogu sadrati najvie 255 znakova.
U narednim odeljcima saznaete kako se u MySQL-u prave baze podataka, tabele jtdno neobino pravilo u MySQL-u glasi da moete koristiti rezervisane rei kao
i indeksi. lo tlllflkatore, pod uslovom da ih piete izmeu navodnika. Na primer, moete imati
l ''" lu ije je ime TABLE . Razume se, ako je neto dozvoljeno, to ne znai da to morate
'd .t vezno i raditi, a u ovom sluaju, navedenu praksu bolje je izbegavati. ak i ako se
Razlikovanje malih i velikih slova t 11 tome dobro snalazite dok radite s MySQL-om, to moe zbuniti program mysql-
Pre nego to zaponemo upotrebu jezika SQL i definiemo 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 rei koje MySQL prihvata kao identifikatore bez
U rezervisanim reima jezika SQL ne pravi se razlika izmeu malih i velikih slova.
tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je prilino uobiajeno u
To je standardno u svim sistemima za rad s bazama podataka.
' tkodnevnim poslovima. Najei primeri na koje ete nailaziti su upotreba rezervi-
Da li e MySQL praviti razliku izmeu malih i velikih slova u imenima baza poda- litt h rei DATE i TIMESTAMP za imena kolona.
taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to to e
najee svakoj bazi podataka odgovarati odreeni direktorijum, a svaka tabela bie
smetena u odgovarajau datoteku. Imena tih direktorijuma i datoteka slede razliita Pravljenje baze podataka
pravila, koja zavise od operativnog sistema. ~~.tkon projektovanja strukture baze podataka, naredni korak je, savim logino, da
To praktino znai da ako koristite Windows, u imenima baza podataka i tabela nee "l' t semo MySQL-u da elimo da napravimo novu bazu podataka. To se radi pomou
se praviti razlika izmeu malih i velikih slova, ali e suprotno pravilo vaiti ako koristite '><>L-ove komande CREATE DATABASE, na sledei nain:
neki operativni sistem iz porodice Unix. To moe biti uzrok zbrke, naroito ako je va ~~ate database employee;
operativni sistem OS X, koji moete podesiti tako da ne pravi razliku izmeu malih i
Da li je ova komanda uspeno izvrena, moete proveriti ako izdate komandu:
velikih slova (HFS+, standardno podeavanje), ili naprotiv, da je uzima u obzir (UFS).
rhow databases;
Da biste smanjili mogunost zbrke, korisno je da se naviknete da sve identifikatore
tretirate kao da je ukljueno razlikovanje malih i velikih slova, ak i pod operativnim Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka
sistemom Windows. To e vam omoguiti da lako preete na drugu platformu. 11,1 vaem raunaru .
Namerna upotreba dva razliita oblika istog identifikatora, npr. Zaposleni i zaposleni, Sada imate praznu bazu podataka koja eka da u njoj napravite nekoliko tabela.
moe zbuniti ljude koji itaju va kod, pa zato izbegavajte da to radite.
U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima e biti rei u
nastavku teksta) nikad ne pravi razlika izmeu malih i velikih slova.
Biranje baze podataka
l'rc nego to u bazi podataka employee napravimo novu tabelu ili uradimo bilo ta
drugo u njoj, moramo obavestiti MySQL da elimo da radimo u naoj novoj bazi
ldentifikatori u MySOL-u podataka. To se radi pomou komande use, na sledei nain:
Identifikator je opta re koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili noe employee;
indeksa. To je nain da se nedvosmisleno identifikuje odreeni objekat. Pre nego to
Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvrimo od
ponete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifika-
s.tda pa nadalje, podrazumevae 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

ultactPerson varchar ( 80) ,


Pravlj enje tabela t'lmtac tNumber char(l2)
Tabele u bazi podataka employee napraviemo pomou SQL-ove komande CREATE ype= InnoDB;
TABLE. Uobiajen oblik te komande je sledei:
tle table assignment
create table imetabele ( definicije kolona tabele ) [type=tip_tabele];

Kao to vidite, komanda poinje reima 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),
WtJrkda te date not null,
kraju komande moete po potrebi zadati tip maine 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 runo, ili preuz- l'oc emo od:
mite datoteku (zajedno s neto pro bnih podataka za bazu) sa Web lokacije posveene 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 brie, to vam "priprema teren", ako se tako moe rei. To nije ba
111oph odno i moe biti ak i opasno, ali ovde smo to uradili da bismo obezbedili da
drop database if exists employee;
111"'1 skript za izradu baze podataka uvek bude delotvoran, ak i ako ste ranije neto
create database employee;
l ' pcrim.entisali s bazom podataka employee.
use employee; Ukoliko MySQL koristite u okruenju iji niste vlasnik, moe 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 sluaju 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 poinjemo izradu tabela unutar te baze podataka. Najpre pravimo tabelu
name varchar(BO), 'it'partment, na sledei nain:
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 slube), koja je primarni klju,
skill varchar(l5) not null, 1 tl.lmc (naziv slube). Kolone tabele deklariemo 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 naa prva SQL komanda koja se rasprostire u vie redova. Budui da su
ll.il'ziku SQL razmaci nebitni, komande moemo pisati u obliku koji nam najbolje
client ID int not null auto increment pri mary key', od govara. Uobiajeno je da se stavke komande CREATE piu svaka u svom redu, da bi
name varchar(40), l l'l,l komanda bila itUivija . Interpretator jezika QL ne e pokuati da rastuma i valt
address varchar(lOO),
46 !'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa l'raviJenje tabela

komandu dok ne otkucate zavrni znak taka i zarez (;) i pritisnete taster Enter. ta to tano znai? MySQL podrava razne maine baze podataka, koje emo detalj
(Moete se opredeliti i da komande zavravate znacima \g, ali se znak taka i zarez nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM.
znatno ee koristi.) Ako elite da koristite My ISAM tabele, nije neophodno da na kraj komande create
U ovoj tabeli deklariemo dve kolone. Svaka deklaracija kolone poinje imenom database dodate odredbu type.
kolone, za ime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu U ovom sluaju potrebne su nam InnoDB tabele zato to emo u nekoliko primera
kolonu ovog primera jer se neto lake razume. Deklaracija koristiti spoljne kljueve. Maina baze podataka InnoDB podrava spoljne kljueve i
name varchar(20) lra nsakcije, to nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele esto
H l bre od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .
opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znai
Mogli smo da zadamo tabele razliitih tipova i da imamo, na primer, nekoliko
daje u pitanju znakovna vrednost promenljive duine, koja u ovom sluaju moe
lnnoDB tabela i nekoliko MyiSAM tabela (pa ak i tabele jo nekih drugih tipova,
sadrati najvie 20 znakova. Mogli smo da zadamo i tip char, to je znakovna vrednost
ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi emo iskljuivo
fiksne duine. Bez obzira na to da li zadate varchar ili char, nain rada s tim poda-
lnnoDB tabele.
cima se nee razlikovati, jedina razlika je u obliku u kojem se ti podaci smetaju u
Pogledajmo drugu komandu create table:
memoriju. Podatak tipa varchar (2 o) zauzima onoliko prostora koliko je potrebno za
skladitenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna- crea te table employee
kova, bez obzira na to da lije u njega smetena bilo kakva vrednost.Vie o relativnim
employeeiD int not null auto_increment primary key,
prednostima i nedostacima ovih tipova podataka bie rei 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 slube (departmentiD) u kojoj zaposleni radi. To je spoljni klju. U definiciji
(ne ponavlja se) koji emo koristiti za identifikovanje pojedinih slubi i odeljaka
t.1bele to se deklarie pomou odredbe references, na sledei nain:
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 reima , u svakom redu Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira
tabele, ta kolona mora sadrati neku vrednost. kolonu (povezana je s kolonom) department ID tabele department.
Drugo, zadali smo daje ta kolona takoe tipa auto_increment. To je veoma Imajte u vidu da sintaksu za spoljni klju moemo koristiti zato to je tabela
korisna mogunost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih kljueva
ifru slube, MySQL e sam do deli ti jedinstven broj koji e biti sledei po redosledu nij e mogua. Prema planu razvoja, trebalo bi da spoljni kljuevi u MyiSAM tabelama
auto_increment sekvence (niza). To e vam prilino olakati ivot. hudu podrani i jednoj od buduih verzija MySQL-a, verovatno u verziji 5.1.
Na kraju, odredba primary key znai da e ta kolona biti primarni klju tabele. Pogledajte sada treu komandu create table:
Ako se primarni klju sastoji od samo jedne kolone, moe se zadati u ovom obliku. Za create table employeeSkills
primarne kljueve sastavljene od vie kolona mora se upotrebiti drugi oblik komande,
koji emo razmotriti u nastavku ovog poglavlja. employeeiD int not null references employee(employeeiD),
Time se zavrava definicija tabele department. A sada, pogledajte sam kraj SQL-ove s kill varchar(15) not null,
p rimary key (employeeiD, skill)
komande. Iza zavrne zagrade nalazi se sledei red:
type=InnoDB;
type=InnoDB
U ovoj tabeli takoe imamo spoljni klju; to je kolona employee ID. Zanimljivo u
Time se zadaje da tabela treba da koristi mainu baze podataka InnoDB.Ako palji- vezi s definicijom ove tabele jeste to da ona ima primarni klju koji se sastoji od dve
vije pogledate definicije tabela, uoiete 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 sledeem 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:
Budui da u sintaksi definicija drugih tabela nema nieg novog, neemo ih detaljno
ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT
objanjavati. Obratite panju 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 bie vie rei o tim tipovim kolona. ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . )
Pomou sledee komande moete proveriti da li su tabele na vaem sistemu tano ili INDEX [ime_indeksa] (ime_indeksirane_kolone, ... )
ili UNIQUE [INDEX] [ime_ind eksirane_kolone , ... )
podeene: ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... )
show tables; ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]
(ime_indeksirane_kolone , ... )
Trebalo bi da dobijete sledee rezultate: [definicija_reference]
+-------- ------------+ ili CHECK (izraz)
l Tables_in_employee l Pogledajmo detaljnije opcije koje postoje u optoj definiciji.
+--------------------+ Rezervisana re TEMPORARY omoguava izradu privremene tabele koja e biti
assignment
client dosegljiva samo u tekuoj sesiji, a kada se veza s bazom podataka zatvori, tabela se
department automatski brie.
employee Odredbu IF NOT EXISTS moete upotrebiti da biste napravili novu tabelu samo
employeeSkills ako ne postoji tabela s imenom koje ste zadali.
+--------------------+ Pomou odredbe LIKE izvorna_ tabela moete napraviti novu tabelu koja ima
Detaljnije podatke o strukturi svake tabele moete dobiti pomou komande des- istu emu kao izvorna tabela.
cribe; na primer: U komandi CREATE TABLE deklariemo unutar zagrada kolone koje nam trebaju,
describe department; njihove tipove podataka i druge informacije koje se tiu strukture tabele. Najjednostav-
Trebalo bi da na svom ekranu dobijete rezultate nalik na sledee: nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared-
nom odeljku ovog poglavlja objasniemo vaee tipove podataka za kolone tabele.
+--------------+-------------+-------------------+------+-----+---------+----------------+
1 Field l Type l Collation l Null l Key l Default l Extra l Svaku deklaraciju kolone moemo, po potrebi, proiriti sledeim opcijama:
+--------------+-------------+-------------------+------+-----+---------+----------------+ Svaku kolonu moemo deklarisati kao NOT NULL ili NULL, to znai 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 sadri 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. Pomou rezervisane rei DEFAULT iza koje sledi neka vrednost moete zadati
podrazumevanu vrednost za kolonu.
Komanda CREATE TABLE Rezervisana re AUTO_INCREMENT omoguava generisanje rednog broja, kao to
Poto ste videli primer, moemo prei na opis cele sintakse komande CREATE TABLE. smo to uinili u prethodnom primeru.Ta vrednost, koja se automatski generie
U MySQL-ovoj dokumentaciji stoji da komanda ima sledei opti oblik: bie za jedan vea od tekue najvee vrednosti iz tabele. Prvi red podataka koji
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele un este u tabel u imae redni broj l. Tabela moe sadrati samo jednu kolonu tipa
[ (definicija_kolone, ... ) l AUTO_INCREMENT, koja mora biti indeksirana. Obratite panju na to da u prethod-
[ope i j e_ za_ tabel u] [komanda_ se l e ct l
nim primerima nismo runo napravili nijedan indeks; meutim, neki su ipak bili
automatski napravljeni. Indeksi se automatski prave za kolone koje deklariete kao
ili
primarne kljueve (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 moemo deklarisati kao primarne kljueve (odredba PRIMARY
KEY).
Pojedine kolone moemo deklarisati kao spoljne kljueve, pomou 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 Moemo zadati jo nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri-
TABLE moemo zadati i dodatne podatke: ''"w pre svega optimizaciji. Neke meu njima objasniemo u poglavlju 18",0ptimi-
Moemo zadati primarni klju koji se sastoji od vie kolona, kao u ovom pri- "v.tnje baze podataka" . To su sledee opcij e:
meru, tako to iza opcije PRIMARY KEY navedemo imena kolona koje ine pri- AUTO_INCREMENT = # Omoguava da u koloni tipa auto_increment zadate
marni klju. Na taj nain moe se zadati i primarni klju koji se sastoji od samo po etnu vrednost razliitu od 1.
jedne kolone. Kolona deklarisana kao PRI MARY KEY moe sadrati samo jedin- AVG_ROW_LENGTH = # Omogu ava da zadate prosenu duinu reda da biste
stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne moe "pomogli" maini baze podataka.
sadrati vrednost null. CHECKSUM = l Omoguava da ukljuite izraunavanje kontrolnog zbira u redo-
Opcije INDEX i KEY su sinonimi i znae da e zadata kolona (ili kolone) biti vima tabele, to moe biti korisno kada reavate problem oteenog sadraja
indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadre tabele. Zadajte vrednost 1 da biste ukljuili izraunavanje. Ova opcija je stan-
jedinstvene vrednosti. dardno iskljuena a upotrebljiva je samo za My ISAM tabele.
Pomou opcije UNIQUE zadaje se da odreena kolona moe sadrati samo jedinst- COMMENT = "tekst" Omoguava da tabeli pridruite neku napomenu.
vene vrednosti. Kolone deklarisane kao UNIQUE takoe se automatski indeksiraju. MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se moe
Pomou opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre- uneti u tabelu.
traivanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraivanje MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela
moete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9. moe sadrati.
Opcija FOREIGN KEY omoguava da deklariete spoljne kljueve na isti nain kao PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje)
primarne kljueve. sadraj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate
Iza zatvarajue zagrade moete zadati odreene opcije koje se tiu tabele. Dosad vrednost 1, svi indeksi e se pakovati; ako zadate vrednost o, nijedan indeks se
smo ve videli da to moe 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 moe biti jedan PASSWORD = "tekst U standardnoj verziji MySQL-a ova opcija na radi ba
od sledeih: nita.
My ISAM, koji se podrazumeva, veoma je brz i podrava indekse za tekstualno DELAY_KEY_WRITE = {o l l } Omoguava da odloite auriranje indeksa dok
pretraivanje; zamenjuje nekadanji podrazumevani tip ISAM. ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.
ISAM je stariji tip tabela. Slian je tipu My ISAM ali prua manje mogunosti, ROW_FORMAT= {default l dynamic l fixed l compressed } Omoguava
zbog ega bi trebalo da umesto njega uvek koristite MyiSAM. da zadate format u kojem se skladite podaci u redovima tabele. Upotrebljiva je
InnoDB je maina baze podataka usklaena s grupom pravila ACID koja samo za MyiSAM tabele.
podrava transakcije, spoljne kljueve i zakljuavanje podataka na nivou pojedi- RAID_TYPE= { l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=#
nanog reda tabele. Omoguava da u cilju optimizovanja servera zadate tip RAID grupe diskova koji
BDB (Berkeley DB) je maina baze podataka koja podrava transakcije i zaklju- imate.
avanje podataka na nivou stranice tabele. UNION= (ime_tabele, [ime_tabele ]) Ovaopcija,namenjenaiskljuivo

Ceo sadraj tabela tipa HEAP uva se u memoriji i nikad se ne upisuje na disk; tabelama tipa MERGE, omoguava da zadate tabele koje ine grupu MERGE.
zahvaljujui tome, te tabele su veoma brze, ali veliina im je ograniena i podaci INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva iskljuivo
iz njih se ne mogu restaurirati ukoliko se sistem pokvari. za tabele tipa MERGE i slui da se zada tabela u koju se podaci umeu.
Tabele tipa MERGE omoguavaju kombinovanje vie tabela tipa MyiSAM koje DATA DIRECTORY="apsolutna putanja Pomou ove opcije moete izriito
imaju istu strukturu, tako da se podaci iz njih itaju kao da radimo s jednom tabe- zadati direktorijum u koji elite da se smetaju podaci tabele.
lom.To se moe iskoristiti kada operativni sistem ograniava maksimalnu veliinu INDEX DIRECTORY="apsolutna putanja" Pomou ove opcije moete izri ito
datoteka - pa zbog toga i tabela. zadati direktorijum u koji elite da se smeta sadraj 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 opti oblik komande CREATE TABLE, uoiete da
MEDIUMINT zauzima tri bajta (2 24 moguih vrednosti).
komandu CREATE TABLE moete zavriti komandom SELECT. SELECT je SQL-ova
komanda koja omoguava uitavanje redova iz jedne ili vie tabela. (Podrobnije je BIGINT zauzima osam bajtova (2 64 moguih vrednosti).
opisana u poglavljima 6, 7 i 8 ove knjige.) Pomou tc opcije moete napuniti novu Aproksirnirani numeriki tipovi opisani su u nastavku teksta.
tabelu podacima koje uitava zadata komanda select.
Tip FLOAT
Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti.
Tipovi podataka u kolonama Moe predstavljati pozitivan broj u opsegu od 1.18 x 10-38 do 3.40 x 10 38 i slian opseg
U MySQL-u postoje tri osnovna tipa kolona: numeriki, znakovni ili tekstualni 11egativnih brojeva.
i datumsko/vremenski. Objasniemo ih jedan po jedan u narednim odcljcima.
Tip DOUBLE
Numeriki tipovi podataka Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi
Numeriki tipovi se koriste za skladitenje brojeva. U naem 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 slian opseg negativnih brojeva.
308

primera podtipova numerikih tipova: tani numeriki tipovi i aproksimirani (pri-


blini) numeriki tipovi. Znakovni i tekstualni tipovi podataka
Za numerike tipove moete zadati ukupan broj cifara koji sc prikazuje (irina, M) MySQL podrava vie 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. Opisaemo ih jedan po jedan u
zadaju se iza deklaracije tipa podatka; na primer: 11astavku teksta.
plata decimal(lO, 2)
Ova komanda omoguava prikazivanje vrednosti sa ukupno 12 cifara i dva deci- Tip CHAR
malna mesta. l'ip CHAR omoguava skladitenje znakovnih vrednosti fiksne duine. Kao u primeru
Moete se opredeliti da ne zadate nijedan od ovih parametara, ili moete zadati haze podataka employee, rezervisanoj rei CHAR obino sledi duina (broj znakova) zna-
samo ukupnu irinu za prikazivanje, ili i irinu i broj decimala. kovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate duinu, podrazumeva se CHAR ( 1) .
Uz numerike tipove moete zadati rezervisane rei UNSIGNED i/ili ZEROFILL. Maksimalna duina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upie
Rezervisana re UNSIGNED znai da kolona moe sadrati samo nule ili pozitivne ll kolo~ u ta?ele, on uvek ima duinu koju ste zadali u definiciji kolone. To se postie

vrednosti. Rezervisana re ZEROFILL znai da e se vrednosti iz kolone prikazivati d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri
s vodeim nulama. liCJtavanJU podatka IZ kolone tipa CHAR.
Tani numeriki tipovi opisani su u nastavku teksta. Oigledno je da podaci tipa CHAR zauzimaju vie prostora na disku od ekviva-
il'J~tnih z~akovnih ~~ednosti promenljive duine. Prednost im je to to se podaci bre
Tip NUMERIC ili DECIMAL u!tavaju 1z tabele CIJe su sve kolone fiksne irine (tj. CHAR, numeriki ili date).
O be rei oznaavaju potpuno isti tip podataka, a DECIMAL se moe skratiti na DEC. Ovi ll udui da je brzina uitavanja podataka esto vanija od prostora koji oni zauzimaju
tipovi omoguavaju uvanje tanih vrednosti s pokretnim zarezom i obino se koriste na disku, moda ete se opredeli ti da tekstualna polja u kojima se vrednosti ne razli-
za rad s novanim vrednostima. Opseg moguih vrednosti jednak je kao za brojeve kLUU mnogo po duini deklariete kao CHAR da biste (malo) optimizovali sistem.
s pokretnim zarezom dvostruke preciznosti. Ispred deklaracija oba tipa, CHAR i VARCHAR, moete dodati rezervisanu re NATIO-
NAL, to znai da elite da ograniite sadraj na standardni skup znakova. Poto se ova

Tip INTEGER i varijante opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil-
Ovaj tip se moe skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se llOSt izmeu razliitih platformi.
smctaju u etiri bajta, to daje 232 mogue vrednosti. Tip INT ima nekoliko varijanti: Deklaracijama tipova CHAR i VARCHAR moe slediti rezervisana re BINARY to znai
d.t sc pri poreer0u znakovnih vrednosti pravi razlika izmeu malih i velikih slova.
TINYINT zauzima jedan bajt (28 moguih vrednosti). Rezervisane rei BIT i BOOL
Podrazumevani nain poreenja je da se ta razlika ne pravi.
su sinonimi za TINYINT.
16
SMALLINT zauzima dva bajta (2 moguih vrednosti).
Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Pravljenje indeksa
54

fip TIME
Tip VARCHAR .. v v

Tip VARCHAR omoguava skladitenje znakovnih nizova promenljlVe duzme. Duzma Ovaj tip <:n;oguava skladitenje podataka koji predstavljaju vreme, koje se prikazuje u
podataka zadaje se izmeu zagrada iza imena tipa, na primer, VARCHAR (l ol . Opseg lormatu CC:MM:SS.
moguih 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 omoguavaju skladitenje tekstualnih podataka duih od ono.g to m?.e
da stane u tipove CHAR i VARCHAR. BLOB je skraenica za Binary Large OBject (vehki fip TIMESTAMP
binarni objekat). Ovi tipovi se meusobno ni po emu ne razlikuju, jedino je BLOB <)vo je koristan tip podataka za kolone tabele. Ako u odreenom redu ne zada te vred-
namenjen uvanju binarnih a ne tekstualnih podataka. Pri poreenju podataka tipa IIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat
BLOB pravi se razlika izmeu malih i velikih slova, dok se to ne ini pri poreenju P~.da t.tbcli ili kada je poslednji put izmenjen sadraj reda.
taka tipa TEXT. Oba tipa su promenljive duine i za oba postoje varijante razmh velicma: Kada uitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE-
8 '1'IME. To je znaajna razlika izmeu MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla-
Tip TINYTEXT ili TINYBLOB moe sadrati najvie 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 moe sadrati najvie 65,535 (i 6 -1) znakova ili bajtova (64 KB).
24
Tip MEDIUMTEXT ili MEDIUMBLOB moe sadrati najvie 16,777,215 (2 -1) znakova rip YEAR
ili bajtova (16 MB). ()vaj tip omoguava skladitenje podataka koji predstavljaju godine. Kada deklariete
32
Tip LONGTEXT ili LONGBLOB moe sadrati najvie 4,294,967,295 (2 -1) znakova ~o! onu ovog tipa, moete 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 omoguava da zadate hstu moguClh vrednost1. Kolona tabele ~oze
sadrati jednu vrednost iz nabroj anog skupa moguih. Tip podataka ENUM deklanse se Sve indekse koji vam trebaju najee ete praviti automatski kada pravite tabele. Za
W;tku kolonu koju deklariete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto-
na sledei nain:
lll.ltski se formira i indeks.
pol enum('m', '') Ponekad ete ustanoviti da koristite vei broj upita koji obuhvataju kolonu za koju
Poto vrednost tipa ENUM moe biti i NULL, mogue vrednosti kolone pol su m, 11istc definisali indeks; u takvim sluajevima moete dodati nov indeks pomou
, NULL ili error. ~oman de CREATE INDEX.
Zanimljivo je to da se, pre izvravanja, komanda CREATE INDEX preslikava u
Tip SET v . komandu ALTER TABLE. Komanda ALTER TABLE moe se upotrebiti i za mnoge druge
Tip SET je slian tipu ENUM s tom razlikom to kolone u redovima tabele mogu sadrzat1 11.11ncne, koje emo opisati u poslednjem odeljku ovog poglavlja.
i vie vrednosti iz nabrojanog skupa moguih. Na primer, tabeli employee moemo dodati nov indeks na sledei nain:
<'l' ate index name on employee (name) ;
Datumski i vremenski tipovi podataka
MySQL podrava vie 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 rei index moete dodati re
nim odeljcima.
liN J QUE ako elite indeks s jedinstvenim vrednostima. Osim toga, ispred rei index
111octe navesti rezervisanu re FULLTEXT da biste napravili indeks za tekstualno pre-
Tip DATE !I,J~ivanje MyiSAM tabele. (Vie detalja o tome nai ete u poglavlju 9.)
Tip date omoguava skladitenje datuma. MySQL oekuje da datum bude u ISO
redosledu godina-mesec-dan, ime se izbegavaju problemi usled razliitih formata
datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.
56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa tzmena struKture postoJece t110e1e

Indeksi definisani nad kolonama tipa char i varchar mogu se ograniiti na prvih ll udui da komanda ALTER TABLE prua veliki broj mogunosti, ima i veliki broj
nekoliko znakova u polju. To ete uraditi tako to iza imena indeksirane kolone zada te lj H 'Ja . Opti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji
izmeu 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 ... ]
Poto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad t a_ izmene:
numerikim kolonama, indeksiranje samo nekoliko poetnih znakova poboljava 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, . . . )
Poto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da nauite l li ADD FULLTEXT [ime_indeksa] (i;e indeksira;e kolone, ... )
ll i ADD [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa]
i da ih briete. Rezervisana re koja vam treba za tu namenu jeste DROP.
(ime_indeksirane_kolone, ... )
Celu bazu podataka, zajedno s njenim sadrajem, briete pomou sledee 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 moete dodati neobaveznu opciju IF EXISTS. Ako se 11 i MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone]
vratite na listing 4.1, videete da je u njemu upotrebljena ba ova verzija komande l ll DROP [COLUMN] ime_kolone
DROP DATABASE. l Ji DROP PRIMARY KEY
Tabelu moete izbrisati pomou komande DROP TABLE, na primer: l li DROP INDEX ime_indeksa
lli DISABLE KEYS
drop table assignment; 1l i ENABLE KEYS
Opti 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 izbriete privremenu tabelu, upotrebite rezervisanu re TEMPORARY Veina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi
Istom komandom moete izbrisati vie tabela ako zadate listu njihovih imena razdvo- ' 'll EATE TABLE, kao to je ADD PRI MARY KEY Opisaemo ukratko one koje moda nisu
jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti nain kao u komandi t1.1[j asnije.
DROP DATABASE.
pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omoguavaju izmenu defi-
Indeks briete pomou komande DROP INDEX, na primer: lltnj e kolone ili njenog mesta u tabeli.
drop index part_name on employee; Opcija DROP COLUMN brie kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP
1NDEX briu samo indeks pridruen koloni.
Kao to vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridruen.
Opcija DISABLE KEYS nalae MySQL-u da ne aurira sadraj indeksa, ali upotre-
i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS ukljuuje auriranje indeksa.
lzmena strukture postojee tabele Opcija RENAME omoguava promenu imena tabele.
Osim izrade novih tabela i brisanja postojeih, esto e vam zatrebati da izmenite Opcija ORDER BY e poreati zadatim redosledom redove tabele na koju je prime-
strukturu postojee tabele. To se moe uraditi pomou komande ALTER TABLE- ona IIJCI1a, slino opciji ORDER BY u komandi SELECT, koju emo razmatrati u poglavlju 6,
ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela. .. Korienje upita u MySQL-u". Taj red o sled nee biti ouvan kada se kasnije unesu
Na primer, indeks nad ta belom employee mogli smo da napravimo na sledei nain: Ilovi podaci u tabelu.
alter table employee Opcija opcije_za_tabelu omoguava da na kraj komande zadate iste opcije za
add index name (name) ; t.ll>elu kao u komandi CREATE TABLE- vie detalja o tome nai ete u prethodnom
dl'lu ovog poglavlja.
58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa ;:,azetaK

Saetak l ipovi podataka za kolone


U ovom poglavlju, nauili ste da pravite i briete baze podataka, tabele i indekse, i da Tani numeriki tipovi SU TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC
izmenite strukturu postojee tabele. i DECIMAL.
Aproksimirani numeriki tipovi su FLOAT i DOUBLE.
ldentifikatori i razlikovanje malih i velikih slova Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB .
Za imena baza podataka vae ista pravila razlikovanja malih i velikih slova kao u Za rad S datumima i vremenima slue tipovi DATE, TIME, DATETIME, TIMESTAMP
direktorij urnima vaeg operativnog sistema. Za imena tabela vae ista pravila kao i YEAR.
za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika Za navedena imena tipova podataka postoji i vie alijasa (sinonima).
izmeu malih i velikih slova.

Svi identifikatori, osim alijasa, mogu sadrati najvie 64 znaka. Duina alijasa Brisanje baza podataka, tabela i indeksa
moe biti najvie 255 znakova. Bazu podataka briete pomou komande
Identifikatori mogu da sadre veinu postojeih znakova, ali imena baze podataka drop database ime_baze;
ne mogu sadrati znakove l, \ i . a imena tabela ne mogu sadrati znakove . i l. Tabelu briete pomou komande
Rezervisane rei moete koristiti kao identifikatore, pod uslovom da ih piete drop table ime_tabele;
izmeu navodnika. Indeks briete pomou komande
drop index ime_indeksa on ime_tabele;
Pravljenje baze podataka
create database ime_baze; pravi novu bazu podataka.
lzmena strukture postojee tabele
use database ime_baze; bira (otvara) bazu podataka za upotrebu.
Strukturu tabele menjate pomou komande ALTER TABLE, iji opti oblik
izgleda ovako:
ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]
Pravljenje tabela
Tome slui komanda create table, iji opti 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_postojee_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] tekue_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 sadraj, zadali biste
Pitanja
a) drop all tables on dbname;
1. ta od sledeeg nije ispravno ime tabele u MySQL-u?
b) drop database dbname;
a) employee
e) drop dbname;
b) select
d) delete database dbname;
e) employee.skill
d) employeeSkills
2. Od sledeih tvrdnji o tipovima podataka CHAR i VARCHAR, koje su tane? Vebe
a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadraj. 1. Napiite SQL komande koje formiraju bazu podataka porudzbine ija je ema
sledea:
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)
sadraj. Moete izabrati proizvoljne tipove podataka.
3. Pre nego to ponemo da pravimo tabele u bazi podataka, moramo prvo Testirajte komande u MySQL-u, a zatim pregledajte rezultujue tabele pomou
a) napraviti indekse tabela komandi SHOW i DESCRIBE.
b) napraviti bazu podataka 2. Svakoj porudbini 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 pomou odgovarajue komande
d) napraviti sve kolone tabela ALTER TABLE, a zatim proverite rezultat pomou komande DESCRIBE.
4. Od sledeih komandi CREATE TABLE, koja je sintaksno ispravna? 3. Izbriite 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 Vebe
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 auriranje podataka
robaiD int not null references roba(robaiD),
6 Korienje upita u MySQL-u
robaKolicina int,
primary key (porudzbinaiD, robaiD)
7 Sloeniji upiti
type = InnoDB;
8 Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT
alter table porudzbine
add column napomena text;

drop database porudzbine;

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

u OVOM POGLAVLJU
1 UPDATE umeu
OBJASNIEMO
kako se komande
i auriraju podaci u MySQL-ovoj bazi podataka .
pomou INSERT, DELETE

Razmotriemo sledee teme:

Komanda INSERT
Komanda DELETE
Komanda UPDATE
Uitavanje podataka pomou komande LOAD DATA INFILE

Proirenja: komande REPLACE i TRUNCATE.


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

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

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 izriito smo zadali vrednosti za kolonu departmentiD. Pogle-
insert into employee values dajmo ponovo definiciju kolone departmentiD. Verovatno se seate 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); Budui daje u pitanju kolona tipa auto_increment, moemo izriito zadati

from employeeSkills; vrednost za nju, ili prepustiti MySQL-u da sam generie neku vrednost. (Pri upotrebi
delete
insert into employeeSkills values kolona tog tipa obino se preputa MySQL-u da sam izrauna vrednost, ali postoje
(7513, e)' i sluajevi, kao to je ovaj, gde ete imati postojeu vrednost koju ete eleti da
(7513, Perl'), upotrebite.)
(7513, 'Java'), U redovima s podacima o slubama Human Resources i Marketing, u koloni
(9842, 'DB2'),
department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment
(6651, 'VB'),
(6651, 'Java'), koji izraunava novu vrednost. Pogledajmo ta emo dobiti s tom komandom
(9006, 'NT'), lNSERT.
(9006, 'Linux'); Ako paljivije pogledate pojedine komande INSERT, uoiete da su podaci koji se
umeu u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese-
delete from client; arch and Development'. Polunavodnici se ne koriste za numerike 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) ' sadri polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape).
(NULL, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', Jednostavnije reeno, 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 znaenja? U tom sluaju, morate na isti nain preslikati i obrnutu
(l, 7513, '2003-01-20'' 8.5); kosu- zamenite je s dve obrnute kose crte (\ \).
Podatke uitavamo iz baze pomou komande SELECT. Tu komandu emo veoma
Obratite panju na to da pre nego to dodamo nove podatke u tabelu, izvravamo detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da e se,
komandu DELETE- ni u ovom sluaju to nije neophodno, ali tako ete ukloniti iz ako zadate:
tabele probne podatke koje ste moda ranije uneli. U narednom odeljku vratiemo se selec t * from ime_tabele;
na komandu DELETE.
uitatisvi podaci koji se nalaze u tabeli.
Osim toga, obratite panju 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 meusobno su veoma sline. Pogledajmo prvu da trebalo bi da na ekranu dobijete rezultate nalik na sledee:
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 ----------- --+----------------------+
sluaju, to je tabela department, u koju unosimo etiri reda s podacima. Moda se ~ rows in set (0.01 sec)
seate da tabela department ima dve kolone, departmentiD i name. (U to se moete
Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment
uveriti ako izdate komandu describe department.) vrtdnost koja je za jedan vea od tekue najvee vrednosti u koloni.
GB Poglavlje 5 Umeta nje, brisanj e i auri ra nje podata ka
Komanda INSERT

U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima sledei opti oblik: opcija LOW PRIORITY blokira klijentski program koji umee 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, moda ete morati da saekate pre nego to budete mogli da
VALUES ((izraz l DEFAULT), ... ),( .. . ), ... nastavite izvravanje upita iz svog klijentskog progran1a. Ako upotrebite opciju
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J
DELAYED, bie vam dozvoljeno da zaponete izvravanje drugog upita, ali onda
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] morate imati u vidu da vai podaci nee biti upisani u tabelu dok ona ne bude
[INTO] ime tabele [ (ime_kolone, ... ) J potpuno slobodna.
SELECT ... Opcija IGNORE je korisna prvenstveno kada umeete vie redova istovremeno.
ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] Standardno ponaanje je takvo da ukoliko jedan od redova koji pokuavate da
[INTO] ime_tabele umetnete izazove greku tipa dupliran primarni klju ili duplirana vrednost u
SET ime_kolone=(izraz l DEFAULT), ... koloni koja prihvata samo jedinstvene vrednosti, dolazi do greke a operacija
[ ON DUPLICATE KEY UPDATE ime_kolone=izraz, . . . J umetanja se ponitava. Ako upotrebite opciju IGNORE, greka se zanemaruje a
U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite postupak umetanja se nastavlja s podacima iz sledeeg reda.
panju na to da rezervisana re INTO nije obavezna. Mogli smo je izostaviti i zapoeti Moete izriito 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 prua elegantno reenje problema duplira-
Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati nog primam og kljua ili duplirane jedinstvene vrednosti. Iza ove opcije sledi
listu vrednosti poredanih istim redosledom kao odgovarajue ciljne kolone tabele. komanda update koja menja postojeu vrednost primarnog kljua ili postojeu
U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID, jedinstvenu vrednost u koloni tako da se ona vie "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.
omoguava da se jednom komandom INSERT umetne vie novih redova u tabel u.
N aredni kratak primer ilustruje uobiajeni nain upotrebe opcije ON DUPLICATE
Drugi oblik komande INSERT zavrava se komandom SELECT. Um.esto da vredno- ~ J,YUPDATE:
sti umeete runo, ovaj oblik omoguava da podatke uita te iz jedne ili vie tabela
t' teate table warning
baze podataka i da ih zatim umetnete u ciljnu tabelu. (
Trei oblik komande INSERT omoguava da izriito 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 omoguava 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 sluaju, koloni department ID Ova opcija je korisna u sluajevima kada ne samo to elite da unesete jedinstvene
prosleuje se vrednost NULL, usled ega se aktivira mehanizam auto_increment koji vrednosti, ve hoete i da izvrite neku akciju, npr. da poveate odreeni broja, kada
generie novu vrednost u toj koloni. (U to se moete uveriti ako ponovo izdate w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog dogaaja je korisna.
komandu select * from department.) Nastavljajui 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 tie odreenog zaposlenog, izvrite ovu
Moete zadati da se komanda INSERT izvrava s niskim prioriteom (opcija LOW komandu INSERT. Budui da kolona count ima podrazumevanu vrednost 1 i za nju
PRIORITY), ili da se izvravanje odloi (opcija DELAYED). Obe opcije ine da se 111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD bie upisana
umetanje podataka u tabelu odloi dok vie ne bude nijednog klijenta koji poku- vrtdnost 1 svaki put kada umetnete red u tabelu . Svaki naredni red koji u kolonu
ava da uita podatke iz tabele. Razlika izmeu ove dve opcije je u tome to mployeeiD umee istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE
ko1.1 povcbva broja.
Poglavlje 5 Umetanje, brisanje i auriranje podataka Komanda DELETE
70

ili
Komanda REPLACE
Komanda REPLACE deluje slino komandi INSERT, s tom razlikom to ako doe do IlE LETE [LOW_PRIORITY] [QUICK] ime tabele [. *] [, ime tabele [. *] ... ]
dupliranja kljua, novi red koji umeete zamenjuje postojei 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 dosadanjim primerima.
ili REPLACE [LOW_PRIORITY l DELAYED] Druga dva oblika omoguavaju brisanje redova iz jedne ili vie 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 uoili slinost 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 omoguava brisanje redova iz tabele. U listingu 5.1 prika- Ovaj primer brie sve zaposlene koji rade u slubi Finance i sve zapise o njihovim
zano je nekoliko primera komandi delete, kao to je sledei: s trunim kvalifikacijama. Obratite panju na to da se redovi briu 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 brie 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
Pomou opcije WHERE moete zadati redove koji se briu, na primer:
navedene u odredbi from biti pretraene ali se redovi iz njih nee brisati, osim ako su
delete from department where name:Asset Management'; navedene i u odredbi delete.
Ova komanda brie samo redove koji ispunjavaju uslove zadate u odredbi where. Obratite panju na to da je ovaj primer prilino sloen jer obuhvata ak tri tabele!
U ovom primeru, bie izbrisani samo redovi koji u koloni name sadre vrednost Za ilustrovanje ovog primera potrebne su nam tri tabele. Takoe vam savetujemo da
Asset Management. ovaj primer i opciju WHERE ponovo prouite poto proitate odeljak o spajanju tabela
Nije uobiajeno da se briu ba svi redove. Meutim, poto je to najkrai oblik ll poglavlju 7, "Sloeniji upiti".
komande delete, moe vam se dogoditi daje grekom zadate bez odredbe WHERE. U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju
Moete potedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa . ta bela. kolona . Pomou operatora AND spojili smo vie uslova . To je primer jedno-
mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano u.pogl.~vlju stavnog logikog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija
2 Kratak obilazak". Te opcije e vas spreiti da izbriete redove (Ih da Izmemte nJihov ~nai "kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije
s~d~aj) ako pomou odredbe WHERE ne zadate uslov za klju, tj. morate zadati da elite e mo objasniti te koncepte.
da izbriete samo redove koji sadre odreene vrednosti kljueva. Trei oblik komande DELETE slian je drugom obliku, s tom razlikom to u ovom
U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima sledei opti oblik: slu aju briemo 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 unoenje podataka pomou komande LOAD DATA INFILE
72 Poglavlje 5 Umetanje, brisanje i auriranje podataka

Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je Moete dodati neobavezno opciju WHERE da biste aurirali samo odreene redove,
1 d o je izosta vite, auriraete sve redove tabele. U ovom sluaju takoe, moe vam se
drugaijasintaksa.
Opti oblik komande DELETE prihvata i druge neobavezne odredbe: ,1, ,Koditi da zaboravite opciju WHERE- seam se kad je jedan moj povrni kolega zadao
111 liO nalik na sledee:
Odredba LOW_PRIORITY deluje na isti nain kao U komandi INSERT.
1 ul te user
Odredba QUICK moe ubrzati komandu DELETE jer nalae MySQL-u da odloi l password='test';
neke od poslova odravanja indeksa dok brie podatke iz tabele.
Ovaj primer jo jednom istie korist od opcije -- i-am-a-dummy programa mysql,
Odredba ORDER BY odreuje redosled brisanja redova. Najkorisnija je u kombi-
11.11o i tokada imate posla s neznalicama.
naciji sa opcijom LIMIT - na primer, kada elite da izbriete iz tabele samo n Druga navedena verzija komande UPDATE omoguava auriranje vie tabela jednom
najstarijih redova. lnluandom. Postupak je slian brisanju podataka iz vie tabela istovremeno, koje smo
Odredba LIMIT odreuje maksimalan broj redova koji komanda DELETE srne da "hJ.ISnili u prethodnom odeljku. Imajte u vidu da e biti aurirane samo kolone koje
izbrie. 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 nain kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju
11.1 1sti nain kao u komandi DELETE.
Komanda TRUNCATE
Komanda TRUNCATE brie sve redove iz tabele. Na primer:
TRUNCATE TABLE employee; rupno unoenje podataka pomou komande
Ovaj upit brie sve zaposlene iz tabele employee. Bri je od komande DELETE jer LOAD DATA INFILE
radi tako to najpre fiziki uklanja celu tabelu a zatim pravi istu takvu ali praznu. l omanda LOAD DATA INFILE omoguava grupno prenoenje podataka iz tekstualne
Vodite rauna o tome da komanda TRUNCATE nije ukljuena u transakcionu obradu. d.tloteke u tabelu, bez potrebe da piete komande INSERT. Primenjujui ovu tehniku,
1110gli smo da napunimo podacima tabelu department na nain opisan u nastavku ovog
11kljka. U listingu 5.2 prikazan je sadraj datoteke s podacima o nazivima slubi koje
Komanda UPDATE lll'ba uneti u tabelu department.
SQL-ova komanda UPDATE omoguava auriranje postojeih redova u tabelama baze
podataka. Na primer, pretpostavimo da je jedan od zaposlenih preao 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 sledei oblik: Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, to znai
d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna-
UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele
SET ime kolonel=izrazl [, ime kolone2=izraz2 ... ) ' una za tabulator. (To se moe podesiti i drugaije, to emo opisati u nastavku .)
[WHERE uslov] Podatke moete uneti u tabelu department pomou sledee komande LOAD DATA
[ORDER BY ... ) INFILE:
[LIMIT broj_redova] lo d data local infile 'department infile.txt'
Into table department; -
ili
Ova mogunost je naroito 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 proraune ili iz CSV (comma-
SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... ) \l'parated values) datoteke .
[WHERE uslov]
Komanda UPDATE je po mnogo emu slina komandi DELETE.
Pn1JI;1vlj b Umetanje, brisanje i auriranje podataka Saetak
lli

Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije Za prenoenje podataka iz jednog formata u drugi, esto se koristi CSV format
infom1acije o tome potraite u poglavlju ll, "Upravljanje pravima korisnika", naroito (e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi itaju i
ako imate problema pri izvravanju ove komande. Pravo izvravanja ove komande pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu
esto je ogranieno iz ozbiljnih bezbednosnih razloga- na primer, da biste spreili 1. ) prikazana je kratka CSV datoteka dobijena iz Excela.

korisnike da bilo ta unesu u /etc/passwd.


11\ting 5.3 new_programmers.csv
Opti 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 moete preneti u tabelu employee pomou sledeeg 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 sledee odredbe: (name, job, departmentiD);

Odredba LOW PRIORITY deluje na isti nain kao u komandi INSERT, tj. eka da Kao to vidite, za prenoenje ovih podataka naveli smo vie opcija nego kada su
drugi klijentski programi zavre uitavanje podataka iz tabele. Odredba CONCUR- podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istai
sledee:
RENT, s druge strane, omoguava drugim klijentskim programima da uitavaju
podatke iz tabele dok je vi punite podacima pomou komande LOAD DATA Buduida smo putanju datoteke zadali u formatu uobiajenom u Windowsu/
INF ILE . DOS-u, ~. pu tanja sadri obrnutu kosu crtu, morali smo da je preslikamo
U navedenom primeru zadali smo neobaveznu rezervisanu re LOCAL, koja znai pomou dodatne kose crte. Zbog toga je putanja zada ta u obliku

da se datoteka s podacima nalazi na klijentskom (lokalnom) raunaru. Ako ne 'e:\ \new_programmers. csv'.
zadate ovu odredbu, MySQL e traiti datoteku na serveru. Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se
Ako se pri punjenju tabele podacima kljuevi dupliraju, odredbe REPLACE i to ipak mora izriito zadati u komandi .
IGNORE pruaju dve mogunosti reavanja tog problema. Opcija REPLACE nalae Nije neophodno da izriito zadate da se redovi zavravaju znakom za nov red, ali
MySQL-u da postojei red zameni novim redom, dok opcija IGNORE nalae mi smo se opredelili da to ipak uinimo.
MySQL-u da zadri postojei red. Poto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadre podatke i treba
Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U optem ih izostaviti pri uitavanju podataka iz datoteke.
obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih Poto datoteka ne sadri ifre zaposlenih (kolona employeeiD), da bismo preneli
opcija - svaki red s podacima smeten je u zaseban red datoteke, a vrednosti tri kolone podataka u etiri kolone tabele, moraemo da navedemo ciljne kolone
kolona razdvojene su zarezima.Vrednosti kolona moete omeiti navodnicima, (i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,
a pomou obrnute kose crte moete preslikati svaki znak (kao to je polunavod- job, departmentiD).
nik) koji bi MySQL moda pogreno protumaio .
Odredba IGNORE broj LINES nalae MySQL-u da zanemari (preskoi) prvih
broj redova.
Saetak
U ovom poglavlju razmatrali smo naine umetanja, brisanja i auriranja podataka u
Poslcdnjom odredbom zadajete da elite da popunite podacima samo navedene
tabelama baze podataka.
kolone tabele.
76 Poglavlje 5 Umetanje, brisanje i auriranje podataka

LOAD DATA INFILE


Umetanje podataka
Komanda LOAD DATA INFILE omoguava prenoenje sadraja tekstualne dato-
Vrednosti znakovnog tipa treba da budu omeene navodnicima. Polunavodnike
ili obrnute kose crte unutar vrednosti treba preslikati pomou obrnute kose crte. teke u tabelu:
LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE
Komanda INSERT omoguava 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 nain kao komanda INSERT, s tom razlikom to u 1. Koja od narednih komandi uspeno umee nov red u tabelu employee?
sluaju dupliranja kljua zamenjuje postojee redove. Ako se to dogodi u komandi
a)
INSERT, komanda se ne izvrava 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 pomou opcije --i-am-a-dummy. b)
Komanda DELETE brie 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) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vred-
USING reference_na_tabele
[WHERE uslov] nosti kljua postojei red zamenjuje novim redom
Komanda TRUNCATE TABLE brie sve redove tabele. b) slina je komandi INSERT, s tom razlikom to se u sluaju dupliranja vred-
nosti kljua postojei red zadrava a novi zanemaruje
Auriranje podataka e) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vred-
Podatke u tabelama aurirate pomou komande UPDATE TABLE: nosti kljua postojei red zamenjuje novim redom
UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele d) slina je komandi UPDATE, s tom razlikom to se u sluaju dupliranja vred-
SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ] nosti kljua postojei red zadrava a novi zanemaruje
[WHERE uslov] 3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql
[ORDER BY ... ]
[LIMIT redova] a) spreava unoenje podataka
ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ] b) spn:nva auriranje podataka ako ni rc zadat~ vrednost odgovarajueg kljua
SET ime_kolonelizrazl [, ime kolone2 izraz2 ... ]
[WIIERE us 1ov]
78 Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa

e) spreava brisanje podataka ako nije zadata vrednost odgovarajueg kljua


d) i b) i e)
4. U standardnom forma tu datoteke koj u zadate u komandi
podaci su razdvojeni
a) zareztma
LOAD DATA INFILE 6
b) razmacima
e) znakovima za tabulator
Korienje 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 raunaru
b) zadaje da se datoteka s podacima nalazi na serveru
e) zadaje da se datoteka s podacima nalazi na klijentskom raunaru
D o sAD SMO OBJASNILI PROJEKTOVANJE, izradu i punjenje podacima MySQL-ove
d) zadaje da serverski program radi na lokalnom raunaru . haze podataka. U ovom i u dva naredna poglavlja razmotriemo drugu stranu
postupka: uitavanje podataka iz baze.
Vebe U ovom poglavlju detaljnije emo objasniti SQL-ovu komandu SELECT. To je
wrovatno najvanija komanda jezika SQL, koja omoguava uitavanje redova iz
1. Napiite grupu komandi INSERT pomou kojih ete napuniti podacima tabele
wdne ili vie tabela baze podataka.
u svojoj bazi podataka porudzbine.
U ovom poglavlju objasniemo kako se uitavaju redovi iz jedne tabele baze poda-
2. Izbriite podatke iz svojih tabela. Lika. Razmotriemo sledee teme:
3. Napravite datoteku koja sadri iste podatke koje ste uneli u taki l i prenesite ih
Opti oblik komande SELECT
u svoju bazu podataka porudzbine pomou komande LOAD DATA INFILE.
Jednostavni upiti
U itavanje podataka samo iz odreenih kolona
Odgovori Alijasi kolona
Upotreba odredbe WHERE za uitavanje samo odreenih redova
Pitanja
Upotreba odredbe GROUP BY
l. b
O graniavanje grupa podataka pomou odredbe HAVING
2. a
Sortiranje rezultata upita pomou opcije ORDER BY
3. d
O grani avanje broj a redova rezultata pomou opcij e LIMIT
4. e
U poglavlju 7, "Sloeniji upiti" , b aviemo se sloenijim upitima, a naro ito upi-
5. e
tima koji obuhvataju vie tabela, te podupitima i raznim vrstama spoj eva izme u
tabela.
Vebe U poglavlju 8, "Upotreba M ySQL- ovih ugraeni h funkcija u komandi SELE CT",
Ne postoji jedno " tan o" reenj e vebi iz ovog poglavlj a. Potrudite se samo da ih sve razmotrie 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 opti oblik komande SELECT.

U sledeem poglavlju
U poglavlju 6, "Korienje upita u MySQL-u", poeemo da se bavimo SQL-ovom
"dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.
HU roglaVIJe b K.OnscenJe up1ta u My:>uL-u Apsolutna 1mena oaza pooataka 1 tabel;

Opti oblik komande SELECT rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti
r:tzdvojenih zarezima.
Komanda SELECT ima sledei opti oblik:
Sledei upit uitava samo vrednosti iz polja employeeiD i name tabele employee:
SELECT kolone
FROM tabele aelec t name, employeeiD from employee;
[WHERE uslovi] Ako ovaj upit izvrite u bazi podataka employee, trebalo bi da dobijete rezultate
[GROUP BY grupe nalik na sledie:
[HAVING uslovi_za_grupe]]
[ORDER BY kolone_za_sortiranje] ---------------+-------------+
[LIMIT broj] ; l name l employeeiD
Ovo nije potpuna sintaksa- objasniemo je u narednom poglavlju- ali ilustruje
---- -----------+-------------+
Ajay Patel 6651
opti oblik komande. Odredbe koje su ovde navedene opisacmo 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 opte 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 panju 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 izvrite s podacima koji postoje u bazi podataka employee, trebalo bi Apsolutna imena baza podataka i tabela
da dobijete rezultate nalik na sledee: Dodatan oblik notacije koji bi trebalo da imate u vidu omoguava zadavanje apsolut-
+---------------+--------------------------+ nih imena baze podataka i tabele s kojom elite da radite. Kolonu name tabele
l departmentiD l name l employee moemo 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 sledee:
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 moete isprobati i na nekoj drugoj tabeli- na primer, uitajte sve redove Candy Burnett
i sve kolone iz tabele employeeSkills. Ben Smith
Razume se, sutina 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 omogui da naete odreene podatke.
Slino tome, moete izriito zadati koju tabelu u kojoj bazi podataka imate na umu,
nn primer:
Uitavanje podataka iz odreenih kolona selec t name
U narednom koraku ograniiemo kolone iz kojih uitavamo podatke. Znak * u irom employee.employee;
prethodnom primeru upita (select * from department) znai "sve kolone tabele" . (Trebalo bi da pomou ovog upita dobijete isti rezultat kao pomou prethodnog
Umesto zvezdice, moete zadati samo kolone iz kojih vam trebaju podaci. To moe upita.)
biti samo jedna kolona, nekoliko kolona tabele, ili ak sve kolone tabele poreane
t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U upuucuct uurcuuc vvncnc Let ucnctVCifiJC ~ctrnu uurcucr1111 rt:uuvd

U ovom primeru, izriito 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 sluaju je baza_podataka . tabela. da napiemo i u sledeem obliku:
Ako je potrebno, moete zadati kojoj bazi podataka i tabeli pripada odreena kolona. oe lect name employeeName
Isti primer moe se napisati pomou sintakse baza_podataka. tabela . . kolona u sle- Lrom employee;
deem obliku: ili
select employee.employee.name se lect e.name
from employee; from employee e;
Ova sintaksa nije naroito korisna za ovakve jednostavne upite, ali kad budete Upite moete pisati u obliku koji smatrate najpogodnijim. To je iskljuivo pitanje
preli na sloenije upite, ona e vam omoguiti da na nedvosmislen nain 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 moe se napisati na vie razliitih naina. Kao i u drugim
programskim jezicima, lini 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 uitavanje
Kolonama i izrazima u komandi SELECT moete dodeliti drugaija imena, koja e
se prikazivati u rezultatima. Na primer, moemo upotrebiti sledei upit:
samo odreenih redova
Dosad smo razmatrali uitavanje svih podataka sadranih u tabeli i uitavanje svih
select name as employeeName
podataka samo iz odreenih kolona. Sada emo prei na uitavanje samo odreenih
from employee;
redova. To je korisno jer esto treba da iz jedne ili vie tabela uita te samo zapise koji
U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon- ispunjavaju odreene uslove. Ta mogunost postaje jo vanija kada je potrebno ui
tekstu ovog upita. Rezultati izvravanja ovog upita u bazi podataka employee izgle- tati samo nekoliko traenih redova iz veoma obinme tabele.
daju ovako: To se moe obaviti pomou odredbe WHERE komande SELECT. Jednostavan primer
+---------------+ bio bi sledei:
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 moe rasporediti u vie redova. Svaki upit
Ben Smith se zavrava znakom taka i zarez. (;). Upite piemo na taj nain da bi bili itljiviji.)
+---------------+ Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako:
4 rows in set (0.01 sec)
Kao to vidite, sadraj kolone name sada je prikazan ispod zaglavlja employeeName .
+- --- - --------+--------------+
l employeeiD l name
Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje odreena pra- +--- ----------+--------------+
vila o tome ta se moe a ta se ne moe raditi sa alijasima, koja emo objasniti kad 6651 l Ajay Patel l
doemo na tu temu . 7513 l Nora Edwards l
Navedeni primer alijasa nije naroito koristan. Meutim, pravu mo alijasa shva- +- ------------+--------------+
2 rows in set (0.42 sec)
ti ete kad ponete da piete sloenije upite i upite u kojima se neto izraunava.
Alijasi se mogu zadavati i za tabele, kao u sledeem primeru: 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 panju na to da smo u upitu kombinovali uslov s kolonama koje nam tre-
baju (employeeiD i name) da bismo uitali 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 nain notacije postae koristan kada u narednom poglavlju ponete da
pa nju na to da u SQL-u znak = slui za ispitivanje jednakosti. To je razliito od mn -
izvravate upite koji obuhvataju vie 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 pomou 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 najee koriste:
--- ------------------+
Jednakost, ili=, to smo ve koristili. job
Nejednakost (razliitost), koja se pie kao ! = ili <>. --- ------------------+
Programmer
Sve kombinacije > (vee od), < (manje od), >= Uednako ili vee od), i <= Ued- Programmer
nako ili manje od). Sys tems Administrator
OBA
IS NULL i IS NOT NULL, pomou kojih se ispituje da li odreena vrednost jeste
ili nije NULL. To ne moete utvrivati pomou izraza nekavrednost=NULL. (Zbog
-- -------------------+
rows in set (0 . 01 sec)
ega to ne moe, objasniemo u poglavlju 8.)
Obratite panju na to da se podatak Programmer pojavljuje dvaput jer postoji
Uobiajeni aritmetiki operatori koje biste oekivali i koji se najee koriste
ll dva reda tabele. Upit je u itao listu svih vrednosti iz kolone job tabele employee .
u kombinaciji s operatorima za poreenje. Na primer, moete ispitati da li je
A sada, pogledajte sledei upit:
nekavrednost > nekadrugavrednost*lO.
lect distinct job
Standardni logiki operatori AND, OR i NOT, koji se koriste za povezivanje vie It om employee;
uslova. Budui da imaju nii prioritet od operatora za poreenje, na primer,
izraz plata > 30000 AND plata < 50000 izraunava se kako biste i oekivali. Ovaj upit daje sledee rezultate:

Osim operatora, u nekim primerima koristiemo i funkcije. Funkcija count (l


-- -------------------+
job
omoguava prebrojavanje redova koje je upit uitao. Na primer: --- -------- - ---------+
select count(*) from employee; Programmer
Systems Administrator l
Ovaj upit pokazuje koliko redova sadri tabela employee. OBA 1
I najzad, standardni redosled prioriteta izraunavanja delova izraza moete menjati - --------------------+
tako to ih grupiete izmeu zagrada. l rows in set (0.04 sec)
Sledei primer je neto sloeniji upit u kojem je zada ta odredba WHERE: U ovom primeru duplikati se ne pojavljuju.
select * from assignment U ovom sluaju razlika ne izgleda tako znaajna - naravno, drugi skup rezultata je
where employeeiD=6651 and hours > 8; tlt'to uredniji, ali poboljanje i nije tako veliko. Bilo bi primetnije kada biste imali
Ovaj upit uitava iz kolone assignment sve poslove na kojima je zaposleni ija je opsenu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili tane
ifra employeeiD 6651 (Ajay Pate!) radio vie od osam asova. podatke.
Vano je istai da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone S druge strane, pogledajte sledei upit:
tabela, ve morate navesti izvorno ime kolone. To je ogranienje ANSI standarda za mysql> select count(job) from employee;
jezik SQL. Razlog je to to vrednost kolone predstavljene alijasom moda nee biti --- -------+
poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE. count (job) 1

-- --------+
4 l
Uklanjanje dupliranih vrednosti pomou -- --------+
row in set (0 . 01 sec)
opcije DISTINCT Prema rezultatima ovog upita, kolona j ob sadri etiri vrednosti . To navodi na
Pomou rezervisane rei DISTINCT navodite da u rezultatima upita ne elite da vidite
po~rean zakljuak jer nije tano da u toj koloni postoje etiri razliite vrednosti. Ako
duplirane vrednosti. Na primer, sledei upit:
pogledate podatke u tabeli, videete da kolona j ob sadri samo tri razliite vrednosti.
select job Lako vam se moe dogoditi da grekom zadate prethodni upit kada ste imali na
from employee; 11111u sledei upit:
l ct count(distinct job) from employee;
Sortiranje uitanih rezultata pomou odredbe ORDER BY
86 Poglavlje 6 Korienje upita u MySQL-u

ltlzultati e biti nalik na sledee:


On daje sledei 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 opadajuim abecednim redo-
lodom. Moete da zadate opciju ASC (od engl. ascending, rastui redosled), ali poto se
1 q tlclosled podrazumeva, nema potrebe da ga izriito zadajete.
Upotreba odredbe GROUP BY . , . . V

Sledea odredba koju emo razmotriti jeste GROUP BY koJa omogucava gruptsanJe u ct-
tanih redova. Ona je zaista korisna samo kada je upotrebite u kombinaciji s funkcijama
l/dvajanje odreenih grupa podataka pomou
koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste
count (), ali u poglavlju 8 razmotriemo vie drugih. opcije HAVING
Pogledajte sledei upit: l c d ca odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je
olodata odredba HAVING deluje na slian nain kao komanda SELECT kojoj je dodata
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. utvruje broj zaposlenih. po l e om employee
11 oup by job
svakom radnom mestu. Ako izvrite ovaj upit u bazi podataka employee, trebalo bt da
lt.,ving count (*l =l;
dobijete rezultat nalik na sledei:
O vaj upit uitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu-
+----------+-----------------------+ :hl'nik. Trebalo bi da rezultati budu nalik na sledee:
l 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 izmeu naina na koji odredba GROUP BY radi u MySQL-u
i u standardnom ANSI SQL-u. Prema naem dosadanjem iskustvu, poetnici 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 moete 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 pojedinane redove . Odredbu HAVING
~ oristite kada odreeni uslov treba da vai za celu grupu.
kojih nema u odredbi SELECT. .
MySQL omoguava da izaberete redosled grupa kojim se prikazuju rezultati. Podra-
zumeva se rastui redosled. Ako elimo da ponovimo poslednji upit, ali tako da se
Sortiranje uitanih rezultata pomou odredbe ORDER BY
rezultati prikau opadajuim redosledom, moemo upotrebiti sledei upit:
S k-d e a odredba komande SELECT jeste odredba ORDER BY koja omoguava sortiranje
select count(*), job t l'rttltujuih redova po jednoj ili vie kolona. Redosled sortiranja moe biti rastui , to
from employee st' ozna ava sa ASC, ili opadajui, to se oznaava 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 ;
Saetak
BB Poglavlje 6 Korienje upita u MySQL-u

Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od
Ovaj upit uitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani
kojeg poinje uitavanje) a drugi je maksimalni broj redova koji elimo da se uita.
po abecednom redosledu sadraja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.t o radno
Uporedite to s prethodnim sluajem: kada zadamo samo jedan parametar, on predsta-
mesto, oni e biti sortirani opadajuim abecedmm redosledom po unemma l prezl-
vlja maksimalni broj redova koji elimo da se uita.
menima. Rezultati upita izgledaju ovako: Kada zadajemo pomak, on poinje od O (kao to se vidi u prethodnom primeru-
+ --------------+-----------------------+--------------+ za esti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT uitava
+------------ - 1 b l departmentiD l
1 employeeiD l name JO --------------+ redove od O do 4, a drugi primer uitava redove od 5 do 7.
+------------+---------------+-----------------------i 42 l Ako kao vrednost drugog parametra zadate -1, upit e uitati 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 najee 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 odreeni 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 naroito 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 omoguava jednostavan mehanizam podele rezultata na stranice.
ASC. Ukoliko ne zadate odredbu ORDER BY, nita se ne moe pretpostav1t1 o redosledu
redova u skupu rezultata.
Saetak
Ograniavanje broja redova rezultata pomou Komanda SELECT ima
SELECT kolone
sledei opti 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 ograniava broj redova rezultata koje up1t daje. Na pnmer, pog [ORDER BY kolone_za_sortiranje]
dajte sledei upit: [LIMIT broj] ;
Odredba select * uitava sve kolone; select ime kolone uitava samo nave-
select *
from employeeSkills denu kolonu.
limit 5; Tabele moemo 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 uitanih uz tabele, kao sto je pnkazano: Alijasi su alternativna imena za tabele i kolone, a zadaju se na sledei nain:
select kolona as alijas_kolone
+------------+-------+
1 employeeiD l skill l from tabela as alijas_tabele;
+------------+-------+ Odredba WHERE slui za uitavanje 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 obrauje 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 slino odredbi WHERE, ali na grupe.
5 rows in set (0.44 sec)
Moete zadati i da elite podskup redova drugaiji od prvih n. Ako pomo~u p:e- Odredba ORDER BY sortira redove rezultata prema sadraju kolona koje navedete.
thodnog upita hoemo da uitamo redove od 6 do 8, to emo uraditi na sledeCl nacm: Odredba LIMIT odreuje koji e redovi biti uitani iz mogueg skupa rezultata.
Maksimalni broj redova zadaje se u obliku pomaka od kojeg poinje u itavanje.
select *
from employeeSkills
limit 5, 3;
Ud govon
90 Poglavlje 6 Korienje upita u MySQL-u

4. Gde se alijas ne moe zadati?


Pitanja a) za kolone
1. Koji od narednih upita uitava sve podatke iz tabele client? b) za tabele
a) 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, odgovarajua 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; Vebe
2. Koji od sledeih upita uitava sve programere iz tabele employee? 1. Napiite upit koji daje sve podatke o zaposlenima u slubi (tabela department)
ija je ifra 128.
a)
select * 2. Napiite upit koji iz kolone employeeiD uitava sve ifre zaposlenih koji su radili
from employee za klijenta ija je ifra l.
where job='Programmer'; 3. Napiite upit koji za svakustrunu 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 sledeih upita ne daje ukupan broj zaposlenih evidentiranih u tabeli Vebe
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 1om mploy Skills
CJI Oll Jl IJy ll k { ) J ;
92 Poglavlje 6 Korisenje upita u My~UL-u

U sledeem poglavlju
U sledeem poglavlju, "Sloeniji upiti", razmatraemo upite koji obuhvataju vie
tabela i druge detalje komande SELECT. 7
Sloeniji upiti

u OVOM POGLAVLJU BAVIEMO


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

Izvravanje upita koji obuhvataju vie tabela primenom sledeih vrsta spojeva:
Prirodnih, unutranjih i unakrsnih spojeva
Jednakovrednih spojeva
Levih i desnih spojeva
Podupiti
Upotreba opcija komande SELECT

Upotreba spojeva u upitima koji obuhvataju vie tabela


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

Spajanje dve tabele


Pogledajte sledei upit:
select employee.name, department.name
trom employee, department
where employee.departmentiD = department.departmentiD;
rogtaVIJC l :>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 moguih kombinacija
sluajuelimo da uitamo imena zaposlenih i nazive slubi u kojima rade. Rezultati lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.
ovog upita izgledaju ovako: Sasvim je oigledno da je odredba WHERE kljuna za dobijanje rezultata koji nam
+---------------+--------------------------+ li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomou kojih pove-
l name l name t ujemo tabele zove se spojni uslov. U ovom sluaju, uslov je employee. department ID
+---------------+--------------------------+ de partment. department ID, to je veza izmeu tabela koju smo definisali preko
Ben Smith Finance \poljnih kljueva jo u emi baze podataka.
Ajay Patel Research and Development
Nora Edwards Research and Development Kada elite da istovremeno uita te podatke koji se nalaze u vie tabela, morate upo-
Candy Burnett Research and Development trebiti veze izmeu tih tabela da biste pronali podatke koje traite. Ponekad to znai
+---------------+--------------------------+ da morate pronai put od podataka koje znate do podataka koje traite. U narednom
4 rows in set (0.42 sec) odeljku opirnije emo objasniti tu ideju.
Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u razliitim U prethodnom primeru rezultata obratite panju i na to da u zaglavljima obe
tabelama. (Obratite panju na to da smo upotrebili notaciju s takom, 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 izvrite bez Jrom employee, department
where employee . departmentiD department.departmentiD;
odredbe WHERE, u sledeem obliku:
Ovaj upit daje sledee rezultate:
select employee.name, department.name
from employee, department; 1---- -----------+--------------------------+
dobiete sledee 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 Sadraj ovog skupa rezultata je razumljiviji nego prethodni.
Nora Edwards Research and Development
Candy Burnett Research and Development Spajanje vie od dve tabele
Ben Smith Research and Development Spajanje vie tabela ne razlikuje se od spajanja samo dve tabele.
Ajay Patel Human Resources Recimo da treba utvrditi iz koje su slube zaposleni koji su radili za klijenta ije je
Nora Edwards Human Resources
ime Tele o Inc. Kako da doemo do tih podataka?
Candy Burnett Human Resources
Ben Smith Human Resources Poto znamo ime klijenta, u koloni clientiD tabele client moemo pronai njegovu
Ajay Patel Marketing i fru . Pomou tog podatka potrai~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 moemo zatim pronai u tabeli employee ifre slubi u kojima rade ti zaposleni. I najzad,
Ben Smith Marketing
p o mou tih podataka pronai emo u tabeli department odgovarajue nazive slubi!
+- - -------------+--------------------------+
16 rows in set (0.01 sec) Poto smo osmislili putanju traenja kroz sve etiri tabele, preostaje nam da tu
logiku preslikamo u odgovarajui upit, to daje sledee:
Prvi upit, kojem je pridruena odredba WHERE, prikazuje zaposlene s tanim 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 mogue utvrditi koji redovi rezultata sadre ta n e pod.11 kl a koji wh re c li ent . name= 'Telco Inc '
I'U911VIJe l ::IIUZeniJI Ufllll Vrste spoJeva 1zmeau tall' 1:1

and client.clientiD = assignment.clientiD To moemo obaviti pomou sledeeg upita:


and assignment.employeeiD = employee.employeeiD
and employee.departmentiD = department.departmentiD; select e2.name
from employee el, employee e2
Nakon izvravanja 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 razliita 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 sluajno sadre iste podatke. Zatim smo te tabele spojili, na isti nain kao to
l row in set (0.00 sec) bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potraili
U upitu koji smo napisali uoiete 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 sluaju zatim smo u tabeli e2 potraili redove koji u koloni departmentiD sadre istu ifru
imamo jedan obian uslov- client. name = 'Tel co Inc' - i vie spojnih uslova. slube kao ona u kojoj radi Nora (el. department ID = e2. department ID).
Obratite panju na to da smo spojili etiri tabele pomou tri spojna uslova. Moda e vam trebati malo vremena da se naviknete, ali ako moete da zamislite da
Primenom ovog pravila moete proveriti da li ste zadali sve potrebne uslove. Kada radite s dve razliite tabele, ne bi trebalo da imate veih tekoa.
spajate n tabela, u veini sluajeva, trebae vam po jedna veza izmeu svakog para tabela, Ovo su rezultati prethodnog upita:
to znai da ete imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani +--------- ------+
su na slici 7.1.Jasno se vidi zbog ega je za etiri tabele potrebno tri (n-1) spoja. l name l
+---------------+
Ajay Patel l
l Nora Edwards l
l Candy Burnett l
+------ ---------+
3 rows in set (0.00 sec)
Prikazani su svi zaposleni koji rade u istoj slubi kao Nora. Kao to se vidi, na listi se
nalazi i Nora. Upitu moemo lako dodati nov uslov koji e je iskljuiti is skupa rezultata:
assignment.employeeiD=employee.employeeiD 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 izmeu tabela


Postoji vie vrsta spojeva koji se mogu uspostaviti izmeu 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 moemo je spojiti i sa samom sobom. naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira
Zato bismo to uradili? Ponekad ete traiti veze izmeu redova u istoj tabeli. Pretpo- na ime, sastoji se od skupa svih moguih kombinacija redova tabela. Kada tom spoju
stavimo da elimo da saznamo imena svih zaposlenih koji rade u istoj slubi kao Nora dodamo odreeni uslov (kao to je employee. department ID = department. de-
Edwards. Da bismo doli do tih podataka, prvo moramo u tabeli employee pronai ifru partmentro), dobijamo neto to se ponekad nazivajednakovredni spoj (engl. equij"oin),
slu be (kolona department ID) u kojoj radi Nora, a zatim emo u tabeli employee koji ograniava broj redova u skupu rezultata.
potra7iti i sve ostale zaposlene koji rade u toj slubi.
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) trai odgovarajue redove u tabeli na desnoj strani spoja. Pronaeni
mu dodamo odredbu WHERE. MySQL podrava vie 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 moete pronai ako zadate uslov daje vrednost kljua 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, moe se zadati neobavezna rezervisana re JOIN: nekog spoljnog klijenta, dobiemo red s podacima o zaposlenom i o poslu koji je
select employee.name, department.name obavio. Kada za nekog zaposlenog ne postoji odgovarajui red u tabeli assignment, levi
from employee join department spoj generie "prazan red" u kojem sve kolone sadre vrednost NULL. Te prazne redove
where employee.departmentiD ; department.departmentiD;
moemo pronai tako to potraimo sve zaposlene koji su neto radili za spoljnog
Osim rei JOIN, moete zadati i CROSS JOIN ili INNER JOIN. klijenta ija ifra (kolona clientiD) sadri vrednost NULL. (Ne bi trebalo da takav
Kada zadate ovu vrstu spoja, MySQL pretrauje sve tabele koje ste zadali i pokuava s l uaj postoji u tabeli assignment budui daje clientiD polje kljua.)
da pronae najefikasniji nain 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. Dogaa se i to da upit ne bude uvek najbolje optimizovan, to emo Podupiti su objanjeni 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 naloite MySQL-u da spoji tabele ba redosledom koji ste upotrebimo i operator RIGHT JOIN, koji deluje na isti nain, s tom razlikom to je
naveli, zamenite re JOIN reima STRAIGHT JOIN. desna tabela osnova, a nedostajui 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 rei JOIN, CROSS JOIN, INNER JOIN ili moda STRAIGHT JOIN, i traili pove- Pod upiti
zane redove u dve ili vie tabela. ta ako elimo da pronaemo sve redove u jednoj Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit iji se rezultat
tabeli za koje ne postoje odgovarajui redovi u drugoj tabeli? koristi u drugom upitu. Ponekad se nazivaju i ugneenim upitima (engl. nested queries).
Razmotrimo sluaj u kojem elimo da pronaemo zaposlene koji jo nisu radili na Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogunost korisnici su ve due
poslovima za spoljne klijente kompanije, tj. zaposlene ije ifre (vrednosti u koloni vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti esto lake razu-
employeeiD) ne postoje u tabeli assignment .To se moe uraditi pomou levog spoja, nlljivi kada se, umesto sloenih spojeva izmeu tabela, upotrebe podupiti.
odnosno operatora LEFT JOIN, na sledei nain: Ve ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i auri-
ra nj e redova u vie tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje,
select employee . name
from employee left join assignment brisanje i auriranje podataka" ,jedna su vrsta specijalizovanog pod upita.
on employee.employeeiD; assignment.employeeiD U ovom poglavlju opisaemo upotrebu podupita u komandama SELECT.
where clientiD is null; MySQL-u su dodate dve osnovne vrste podupita:
Ovaj upit daje sledee 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 logikog tipa
+-- -------------+
3 rows in set (0.49 sec) Po gledaemo redom po jedan primer svake pomenute vrste pod upita.
Ako pogledate sadraj tabela, lako ete se uveriti da su rezultati tani, ali kako sm o
do njih doli ?
l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill
Pod upiti

Podupiti za izvedene tabele , . . . U ovom primeru traimo zaposlenog koji bi mogao zasluiti "titulu" najvrednijeg
Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta 1.1dnika u firmi. Pita~ e je sledee: koji je zaposleni proveo najvie radnih sati dnevno
u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu. 11~ nekom poslu?
Pogledajte sledei jednostavan upit: Ovo su rezultati izvravanja upita:
select employeeiD, name from employee where job='Programmer'; 1--- ----------+---------- ----+
Jasno je da ovaj upit uitava ifre i imena zaposlenih koji su programeri. Ovaj upit l employeeiD l name
moemo 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, vraaju red s vie vrednosti, ali
where programmer.employeeiD = assignment.employeeiD; .Jl: korist od toga esto ograniena. U nastavku teksta obradiemo primer takvog upita.
U ovom primeru upotrebili smo podupit (select employeeiD, name from
Podupiti za izraze logikog tipa
employee where j ob= Programmer ') da bismo formirali izvedenu tabel u iji redovi
Podupiti za izraze logikog tipa (engl. Boolean expression subqueries) omoguavaju da se
sadre 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 moemo potom pretraivati na isti nain kao bilo koju drugu
l ogikog 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 omoguava poree~e s grupom vrednosti. Pogledajte sledei
za spoljne klijente i dobili smo sledee 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, poeemo jednostavnim upitom: klijenta. Rezervisana re IN omoguava da utvrdite da li se data vrednost nalazi u
odre enom skupu moguih vrednosti. U ovom sluaju dobijamo jednake rezultate
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 najvei 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 najveu vrednost u zadatoj koloni_ 1--- ------------+
tabele. Funkcijom max () baviemo se vie u poglavlju 8, "Upotreba MySQL-ov1h / Ajay Patel l
ugraenih funkcija u komandi SELECT". U pod upitima koji vraaju jednu vrednost l Candy Burnett l
(engl. single-value subqueries), esto se ova vrsta funkcija koristi za dobijanje meurezul
l Ben Smith l
1-- ------- ------+
tata koji se potom koristi za druge proraune. 3 rows in set (0.45 sec)
Kao u prethodnim odeljcima, ovaj upit emo upotrebiti unutar drugog upita.
Zanimljivo je da se pomou operatora IN podaci upita mogu porediti i s listom
Rezultat upita koji vraaju jednu vrednost jeste odreena vrednost koja se potom
navedenih vrednosti, kao u narednom primeru:
obino poredi s nekom drugom vrednou. Pogledajte sledei 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 oeniji upiti
Opcije komande SELECT

Rezervisana re EXISTS deluje na malo drugaiji nain od rezervisane rei IN. vei 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 utvruje da li je broj radnih sati zaposlenog vei od broja radnih sati svakog
(glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit. programera pojedinano.
Pogledajte sledei upit: Nee vas iznenaditi informacija da ovaj upit ne vraa nijedan red podataka, ime
select e.name, e.employeeiD dokazuje da niko u toj firmi ne radi vie od programera.
from employee e
where not exists
(select * Opcije komande SELECT
from assignment Kada smo prvi put razmatrali komandu SELECT, opisali smo skraeni oblik opte
where employeeiD = e.employeeiD);
sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli ta jo
U ovom primeru takoe traimo zaposlene koji nisu nikad radili na poslovima za ne znamo.
spoljne klijente. U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima sledei opti oblik:
Pod upit uitava 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 potie 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_uitavanje, ...
nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom prosleuje
u konaan skup rezultata upita. [INTO {OUTFILE l DUMPFILE} 'ime_datoteke' opcije_pri_izvozu]
[FROM reference_tabela
Mada e neki korisnici lake razumeti ovu sintaksu, rezultate jednake onima iz [WHERE uslov]
prethodnog odeljka dobijamo i pomou 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

+---------------+-------------+ Veinu odredaba ve poznajete. Pogledajmo ukratko one koje dosad nismo
3 rows in set (0.00 sec) pominjali:
Rezervisane rei ALL, ANY i SOME omoguavaju poreenje sa skupom vrednosti koje Odredba STRAIGHT JOIN na samom poetku komande nalae optimizatoru
vraa podupit. upita da spoji tabele ba redosledom koji ste zadali. Uinak ove opcije jednak je
Pretpostavimo da Nora Edwards, koje se moda seate kao programera koji najvie kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao to je napomenuto u
radi, eli da dokae da niko nema vie radnih sati od programera . Da bi dokazala tu prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proirenja ANSI
injenicu, smislila je sledei upit: standarda za jezik SQL.
select e.name Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT omogua
from employee e, assignment a
vaju optirnizovanje upita. Pomou opcija SQL_SMALL RESULT i SQL BIG RESULT
where e.employeeiD = a.employeeiD
and a.hours > all obevetavate MySQL da oekujete da e se skup rezul~ata upita sastoJati od malog,
(select a.hours odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalae MySQL-u da
from assignment a, employee e skup rezultata smesti u privremenu tabel u. Tu opciju moete iskoristiti kada znate
where e.employeeiD = a.employeeiD da e slanje skupa rezultata klijentskom programu potrajati prilino dugo, a elite
and e.job='Programmer'); da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se uitaju.
Podu pit uitava listu radnih sati, pojedinano po programeru i po poslu koji je Ove opcije su MySQL-ova proirenja ANSI standarda za jezik SQL.
obavio. Potom glavni upit ispituje da li postoji drugi zaposleni iji je broj r:~dnih sati
104 Poglavlje 7 Sloeniji upiti rrranJa

SQL CACHE i SQL NOCACHE nalau MySQL-u da rezultate smeta, odnosno ne Pod upiti
smeta u ostavu (i~e). Oo jedno proirenje ANSI standarda za jezik SQL.) Pod upit je upit ugneen unutar drugog upita.
SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL izrauna Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se
koliko bi ~kup no-redova upit vratio kada ne bi sadrao odredbu LIMIT. Taj broj koristiti i za ispitivanje logikih uslova pomou operatora SOME, ALL ili ANY
redova se zatim moe uitati pomou opcije select found_rows () ; Uo jedno Pomou operatora EXISTS moe se utvrditi da li u rezultatima podupita postoji
proirenje 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 izvri upit s funkcijom Opcije komande SELECT
COUNT (*),a zatim i drugi upit SELECT koji sadri opciju LIMIT.
Komandi SELECT mogu se pridruiti razne opcije koje optirnizuju izvravanje te
HIGH PRIORITY obavetava MySQL da taj upit treba da ima prednost nad svim komande.
komandama UPDATE koje ekaju pristup tabelama navedenim u upitu .
Pomou 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, slino nainu na koji smo u poglavlju 5 uitavali podatke iz
suprotan efekat (uitava sve duplikate) a to je i podrazumevana opcija. datoteke u tabelu pomou 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 obrauju
smo razmatrali u poglavlju 5, "Umetanje, brisanje i auriranje podataka". podatke pre prenoenja u MySQL ili iz MySQL-a.
Ova komanda smeta rezultate komande SELECT u zadatu datoteku. Odredba
opcije_pri_izvozu ima isto znaenje kao u komandi LOAD DATA INFILE (vie
detalja o tome nai ete u poglavlju 5). Pitanja
Odredba PROCEDURE omoguava da zadate proceduru koja se poziva pre nego to 1. De kart ov proizvod je
se skup rezultata poalje klijentskom programu. Ta procedura mora biti napisana a) skup svih moguih kombinacija redova iz dve ili vie tabela
na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba vie b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
informacija, potraite ih u MySQL-ovoj dokumentaciji.
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaa maina baze tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
podataka zakljuava podatke na nivou stranice ili reda. U praksi, opcija je upo- NULL na mestima gde bi bili podaci iz druge tabele
trebljiva ako koristite maine InnoDB i BDB.Ako zadate FOR UPDATE, zakljua d) nije nita od prethodnog
vanje podataka e biti iskljuivo, a ako zada te LOCK IN SHARE MODE, zakljuavanje
2. Levi spoj je
e biti deljeno.Vrste zakljuavanja razmotriemo u poglavlju lO",Upotreba trans-
akcija u InnoDB tabelama". a) skup svih moguih kombinacija redova iz dve ili vie tabela
b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
Saetak tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
Spojevi d) nije nita od prethodnog
Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u
3. Jednakovredni spoj je
odredbi FROM, zajedno s vrstom spoja. Treba takoe zadati i uslov koji opisuje na
koji nain bi tabele trebalo da budu spojene. a) skup svih moguih kombinacija redova iz dve ili vie tabela
Operator zarez i rezervisane rei JOIN, INNER JOIN i CROSS JOIN deluju na isti b) skup kombinacija redova iz dve ili vie tabela koji su logiki povezani
na in, tj. kombinuju zadate tabele tako da omogue traenje podataka u svim e) skup redova iz jedne tabele kojima su dodati odgovarajui redovi iz druge
tim tabelama. tabele, a gde to nije mogue, rezultujui red je popunjen vrednostima
NULL na mestima gde bi bili podaci iz druge tabele
Lev i desni spojevi omoguavaju pronalaenje redova u jednoj tabeli koji nemaju
odgovarajue redove u drugoj tabeli. d) nije nita od prethodnog
106 Poglavlje 7 Sloeniji upiti u s1eaecem poglaVlJU

4. Korelirani podupit se tako zove zato to uspostavlja korelaciju izmeu Vebe


a) redova razliitih 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 izmeu upita oznaenih sa 5.1 i 5.2 u nastavku teksta j e sledea select client.clientiD, name
from client left join assignment
a) nema razlike on client . clientiD = assignmen t. clientiD
b) uitavaju razliite podatke where employeeiD is NULL;
e) uitavaju iste podatke ali je verovatno da e se levi spoj (upit 5.1) bre 3.
select clientiD, name
ui tavati
from client
d) uitavaju iste podatke ali je verovatno da e se podupit (upit 5.2) bre where not exists
ui 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 sledeem poglavlju
Upit 5.2: U poglavlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT",
select e.name, e.employeeiD razmatraemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.
from employee e
where not exists
(select *
from assignment
where employeeiD e. employeeiD) ;

Vebe
1. Napiite upit koji prikazuje imena zaposlenih i njihove strune kvalifikacije.
2. Napiite upit koji pomou operatora LEFT JOIN formira listu klijenata za koje
nijedan od zaposlenih nije obavio nijedan posao.
3. Upit iz vebe broj 2 napiite tako da koristi operator EXISTS.

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

MYSQL SADRI IROK OPSEG UGRAENIH OPERATORA I FUNKCIJA koji mogu biti
korisni pri pisanju upita. Veina je namenjena upotrebi i odredbama SELECT i WHERE.
Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi
GROUP BY. Ve smo koristili osnovne operatore za poreenje i funkcije count () i
max (). U MySQL-u je na raspolaganju veliki broj ugraenih funkcija. U ovom pogla-
vlju razmotriemo najkorisnije meu njima. Ovu knjigu nismo zamislili kao referentni
prirunik za MySQL-ove funkcije, ve samo pokuavamo da predoimo sliku funkcio-
nalnosti koja je na raspolaganju.
Razmotriemo sledee teme:

Operatori
Funkcije za upravljanje tokom izvravanja
Funkcije za rad sa znakovnim vrednostima
Numerike funkcije
Funkcije za rad s datumima i vremenima
Funkcije za konverziju tipova podataka
Druge funkcije
Funkcije za upotrebu u odredbama GROUP BY.

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

Uporedite to sa sledeim upitom:


uovom poglavlju koristiemo komandu SELECT bez navoenja tabela u njoj.
Komanda SELECT moe se upotrebiti kao jednostavan kalkulator. N a primer, ako select NULL IS NULL;
za date +--- - ----- - - - --+
se lect 2+2; l NULL IS NULL l
+--------------+
dobiete rezultat
l l
+-- ---+ +--------------+
l 2+2 l l row in set (0.00 sec)
+-- ---+
Ovaj primer istie ono to smo napomenuli u poglavlju 6, a to je da morate opre-
4 l
+- ----+ zno korisiti operatore za poreenje ukoliko se meu podacima moe pojaviti i NULL.
1 row in set (0.42 sec) Druga injenica koju bi trebalo da zapamtite jeste da se u veini sluajeva , pri pare-
Moete izvravati izraze koji ne sadre imena tabela i u kojima moete zadavati irok enju vrednosti znakovnog tipa u MySQL-u ne pravi razlika izmeu malih i velikih
opseg matematikih i drugih operatora i funkcija. Izraun~:ranje 2+2 je ~aista trivijalno, slova. Ako elite da se znakovne vrednosti porede tako da se ipak pravi razlika izmeu
ali to svakako ne vai za izvravanje matematikih operaciJa u komandi SELECT. Na malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,
primer, to vam omoguava da uradite finansijsku analizu vrednosti u tabelama i da select * from department where name='marketing';
zatim prikaete rezultate u obliku izvetaja. Ovaj upit e pronai re 'marketing' bez obzira na to kako je napisana, a rezultati
U svim MySQL izrazima moete zadavati zagrade da biste upravljali redosledom izgledaju ovako:
kojim se izraunavaju pojedini delovi izraza, na isti nain 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: aritmetiki, za poreenJe vrednosti Ako je potrebno razlikovanje malih od velikih slova, dodajte rezervisanu re
i logiki . Operatore smo ukratko ve opisali u poglavlju 6, "Korienje upita u binary, na sledei nain:
MySQL-u". Sada emo ih detaljnije razmotriti.
select * from department where name = binary 'marketing';
Ovako napisan upit ne uitava nijedan red iz baze podataka employee:
Aritmetiki operatori v

MySQL podrava uobiajene aritmetike operatore koje biste ocekivali: sabiranJe(+), Empty set (0.18 sec)
oduzimanje (-), mnoenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL. Posle ovog uvoda, moemo prei na operatore za poreenje. Najee se koriste
operatori navedeni u tabeli 8.1.
Operatori za poreenje vrednosti . .
N ajvanije to bi trebalo da zapamtite ~vezivs~ ope;atorima za poreenJe vr:~nosu Tabela 8.1 Operatori za poreenje
j este sledee : izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL, Operator Znaenje
uvek daje NULL. To vai i za poreenje NULL s NULL:
Jednako
se lect NULL=NULL; != ili <> Razliito od
< Manje od
+-- -- - -- - -- - +
l NULL=NULL l <= Jednako ili manje od
+-------- - - -+ > Vee od
NULL l >= Jednako ili vee 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 izvravanja komandi

poreenje
Tabela 8.1 Operatori za (nastavak) Funkcije za upravljanje tokom izvravanja komandi
Operator Znaenje Najpre emo razmotriti grupu funkcija za upravljanje tokom izvrava~a komandi.
n BETWEEN min AND max Poreenje da li se n nalazi u opsegu vrednosti od min do max. Meu njima su najkorisnije IF i CASE, koje deluju slino iskazu if, odnosno switch
n IN (skup vrednosti) Pripadnost skupu vrednosti koji se moe zadati u obliku liste ili case iz veine 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 moe upotrebiti i za NULL. Kada se
pored e dve vrednosti NULL, rezultat je l (true). Ako izraz el ima vrednost true, funkcija IF vraa 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. moemo zadati sledei upit:
select name, if(job='Programmer', "nerd", "not a nerd")
Logiki operatori from employee;
MySQL podrava sve uobiajene logike operatore koji povezt~u delove izraza. Ovaj upit daje sledee rezultate:
Logiki izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga,
+---------------+--------------------------------------------+
MySQL tumai kao true (istinito, tano) svaku vrednost razliitu od nule i razliitu od l name l if(job='Programmer', "nerd", "not a nerd") l
NULL. +---------------+--------------------------------------------+
Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugaiji l Ajay Patel nerd
od onog to biste oekivali. Tabela 8.2 prikazuje logike operatore. l Nora Edwards nerd
l Candy Burnett not a nerd
l Ben Smith not a nerd
Tabela 8.2 Logiki operatori
+---------------+--------------------------------------------+
Operator Primer Znaenje 4 rows in set (0.00 sec)
AND ili && n && m Logiko I. Tabela istine izgleda ovako: Funkcija CASE ima sledee mogue prototipe (prema MySQL-ovoj dokumentaciji):
true&&true = true CASE vrednost
false&&bilo ta = false WHEN [vrednost-za-poreenje] THEN rezultat
Svi ostali izrazi svode se na NULL. [WHEN [vrednost-za-poreenje] THEN rezultat .. . ]
Logiko 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 Logiko NE. Tabela istine izgleda ovako:
[ELSE rezultat]
!true = false END
!false = true
Ovu funkciju moete upotrebiti da biste izdvojili jednu vrednost iz skupa od ~ih
!NULL = NULL
nekoliko. Primera radi, pogledajte sledei upit:
XOR n XOR m Logiko iskljuivo 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 ugraenih 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 poreenje znakovnih vrednosti
assignment. Datumi iz prethodnog veka oznaavaju se sa "archived", datumi iz pret- Osim operatora jednakosti, u MySQL-u postoji i vie drugih funkcija za poreenje
hodne godine oznaavaju se sa "old", dok se svi ostali datumi oznaavaju kao dve znakovne vrednosti:
"current". LIKE: Poreenje s dokerskim znacima.
RLIKE: Poreenje s regularnim izrazima.
Funkcije za rad sa znakovnim vrednostima STRCMP: Poreenje znakovnih vrednosti, slino funkciji strcmp () u jeziku C.
MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funk- MATCH: Tekstualno pretraivanje.
cije za obradu znakovnih vrednosti i funkcije za poreenje znakovnih vrednosti.
U ovom odeljku objasniemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretrai-
Verovatno ete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.
vanje je na raspolaganju samo u My ISAM tabelama. Vie informacija o tome nai 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- Poreenje s dokerskim znacima pomou 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 traimo nazive jednake rei 'research', ve nazive koji bilo
conv(n, izvorna_baza, Pretvara broj n iz baze izvorna_baza u broj baze gde sadre re 'research'. Rezultati su sledei:
nova_baza) nova_ baza. (Moda vas je iznenadilo to to je ova funkcija
navedena meu 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) Vraa ukupan broj znakova sadranih u s.
+---------------+------ --------------------+
load file Vraa sadraj datoteke ime_ datoteke kao jedan niz l row in set (0.04 sec)
(ime_ datoteke) znakova.
Funkcija LIKE podrava dva naina poreenja s dokerskim znacima. Znak za pro-
locate (igla,plast_sena, Vraa poetnu poziciju niza znakova igla u nizu
cenat (%), upotrebljen kao u navedenom primeru, utvruje poklapanje s grupom zna-
pozicija) plast_sena. Traenje poinje od pozicije pozicija.
kova bilo koje duine (ukljuujui i nula). To znai da se izraz '%research%' poklapa
lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova.
sa svakom znakovnom vrednou koja sadri re research. Imajte u vidu da se pri
quote (s) Preslikava niz znakova s u oblik pogodan za smetanje u bazu
poreenju znakovnih vrednosti obino ne pravi razlika izmeu malih i velikih slova,
podataka. To podrazumeva uokvirivanje znakovnog niza
polunavodnicima i umetanje obrnute kose crte. kao to je objanjeno u prethodnom delu ovog poglavlja.
replace(izvor, nai, Vraa niz znakova izvor u kojem je podniz nai zamenjen Stariji dokerski znak je podvlaka U, kojim se utvruje 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) Vraa soundex oblik izvornog niza znakova s. Soundex oblik
znakovne vrednosti predstavlja nain na koji znakovna Poreenje s regularnim izrazima pomou funkcije RUKE
vrednost treba da se izgovara na engleskom jeziku . Na primer, Funkcija RL IKE omoguava poreenje znakovnih vrednosti s regularnim izrazima.
ponekad je lake pronai ime osobe ako se trai sound ex oblik Regularan izraz je ablon koji opisuje opti oblik znakovne vrednosti. Uslovi koje
a ne kako je ime napisano . bi trebalo da ispunjavaju znakovni nizovi koje traimo, opisuju se posebnom notaci-
substring(s, poetak, Vraa ukupno znakova iz niza s, poev od poetak. jom. Razmotriemo ukratko tu notaciju.
ukupno) Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To znai da se ablon
trim (s) Uklanja poetne i zavrne beline iz niza znakova s. (Pomou 'cat' poklapa s reju 'cat'. Meutim, poklapanje vai i za catacomb i the cat
funkcije l trim () moete ukloniti samo poetne beline, a
sat on the mat'. ablon 'cat' pronalazi niz znakova cat na svim mestinu
funkcija rt rim () uklanja zavrne beline.)
unutar veeg niza znakova.
116 Poglavlje 8 Upotreba MySQL-ovih ugraenih tunkciJa u komano1 ::,tLtLI
Numerike funkcije

Ako elite da ablon pronalazi samo re 'cat', onda ga morate izmeniti u '"'cat$'. . Regularni izrazi mogu biti veoma moni, ali i veoma sloeni. Ako vam treba vie
Znak karet ("') znai "fiksni poetak niza znakova"; drugim reima, niz znakova koji pnmera i opirniji opis sintakse, na Webu ete nai mnogo dobrih tekstova na tu
traimo mora da poinje reju 'cat'. Znak za dolar($) znai "fiksni kraj niza zna- temu.
kova"; drugim reima, niz znakova koji traimo mora da se zavrava reju 'cat'.
Prema tome, ablon '"'cat$' prihvata samo re 'cat' i nita drugo. Poreenje nizova znakova pomou funkcije STRCMP()
U regularnim izrazima podrani su i dokerski znaci, isto kao u funkciji LIKE. ~a .funkciju s:RCMP (). ~ MySQL-u vae iste konvencije kao i u drugim programskim
Meutim, dokerski znak je drugaiji. Postoji samo jedan - taka (.) - koji odreuje JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako:
poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvruje poklapanje s STRCMP(sl, s2)
'cat', 'bat', 'mat' itd. a funkcija vraa sledee vrednosti:
Dovoljan je samo jedan dokerski znak jer se u traenom nizu znakova moe zadati
i ponavljanje znakova (ukljuujui i dokerske znakove) odreen broj puta.
o ako su nizovi znakova jednaki
Kada iza nekog znaka postavite specijalni znak *, to znai da se prethodni znak -l ako je sl maqji od s2 - ~ ako po redosledu sortiranja sl dolazi ispred s2
moe pojaviti nula ili vie puta. Na primer, ablon 'n*' prihvata ' ', 'n', 'nn', 'nnn' l ako je sl vei od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2
itd. Znaci se mogu grupisati izmeu zagrada, tako da ablon ' (cat)*' prihvata ' ', Rezultati narednih upita izgledaju ovako:
'cat', 'cat cat', 'catcatcat' itd. Mogua je i upoteba dokerskih znakova, pa
mysql> select strcmp ('cat , cat ) ;
ablon ' . * ' prihvata neogranien broj znakova, to praktino znai svaki niz znakova. +- ---------------------+
Slino tome, znak plus(+) znai da se znak ili niz znakova ispred njega moe poja- l strcmp ('cat', 'cat') 1
viti jedanput ili vie puta, a upitnik (?) znai jednom ili nijednom. Moete zadati i +- ---------------------+
opseg vrednosti, tako da ablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i l o l
+- ---------------------+
'catcatcatcat'.
l row in set (0.42 sec)
Osim pojedinanih znakova i nizova znakova, moete zadavati i skupove znakova,
koji se piu izmeu uglastih zagrada. Na primer, ablon ' [a-z] ' prihvata bilo koje mysql> select strcmp('cat', 'dog');
pojedinano slovo, dok ablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g - -------------- -------+
broja znakova. l strcmp( 'cat', 'dog') 1

I najzad, postoji vie klasa znakova, koje su zapravo unapred definisani skupovi +- ---------------------+
uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumeriki znak.
l -1 l
1- ---------------------+
Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL l row in set (0.00 sec)
podrava 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
dei upit:
l -- -------------------+
select * from department where name rlike 'an'; l l l

Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadre 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 oekivali, pod uslovom da ste zadali odgovarajui skup znakova kada ste
42 Finance 11:tprav1h tabelu.
128 l Research and Development l
129 l Human Resources l
+---------------+------- ------- --------- ---+ Numerike funkcije
3 rows in set (0.00 sec)
l'.1bela .8.4
..
prikazuje
" ,
nekoliko korisnih numerikih 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 ugraemh tunKCIJa u KomanOI ;:,tLtLI
118

Funkcije za rad s datumima i vremenima


Tabela 8.4 Numerike funkcije
Tabela 8.5 prikazuje nekoliko najkorisnijih funkcija za rad s datumima i vremenima.
Funkcija Svrha Zahvaljujui MySQL-ovoj orijentisanosti na analizu podataka, skup funkcija za rad
Vraa apsolutnu vrednost n, a to je vrednost bez predznaka. s datumima i vremenima veoma je bogat. Naredni spisak daleko je od potpunog.
abs (n)
Vraa vrednost n zaokruenu navie na najblii ceo broJ.
ceiling (n)
Vraa vrednost n zaokruenu nanie na najblii ceo broj. Tabela 8.5 Funkcije za rad s datumima i vremenima
floor (n)
Ove dve funkcije dele n sa m. Funkcija di v vraa celo brojni rezultat, Funkcija Namena
mod (n, m) i div
a funkcija mod () vraa celo brojni ostatak deljenJa.
adddate(datum , INTERVAL Ove funkcije slue za sabiranje i oduzimanje datuma. Vrednosti
Vraa n podignuto na stepen m. .. n tip) i subdate (datum, zadatoj parametrom datum dodaju, odnosno od nje oduzim~u
power (n, m)
Vraa sluajno generisan broj u opsegu o~ O do l. Parametar n mJe . INTERVAL n tip) period zadat pomou rezervisane rei INTERVAL. Morate zadati
rand(n)
obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za g~nensanJe i koliinu n i tip te koliine.
pseudosluajnih brojeva. ~Za istu vrednost n prosleenu funkciJI rand Parametar tip moe imati vrednost SECOND, MINUTE, HOUR,
generie se ista pseudoslucaJna vrednost.) DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude
Vraa n zaokrueno na najbliu celobrojnu vrednost. Ako zadate izraeno u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR
round (n[, d])
i parametar d, n vrednost se zaokruuje na d dectmalruh mesta. ('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'),
Vraa kvadratni koren od n. DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s').
sqrt (n)
Ove funkcije su zaista korisne, ali poto je gotovo nemogue
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),
moraete da ih potraite u MySQL-ovoj dokumentaciji.
zbunjujue je sledee: dok se mod moe napisati u obhku
curdate(), curtime(), Ove funkcije vraaju tekui datum, tekue vreme, odnosno
mod(9, 2) now() tekuidatum i vreme.
ili date_format(datum, Pomou ovih funkcija moete 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 sledeem 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 '. Poto je spisak moguih
funkcija di v moe se napisati samo kao formata prilino dugaak, detaljnije informacije potraite 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
nee raditi ve e izazvati sintaksnu greku. zadajete parametrom tip. Na primer, ako zadate YEAR, funkcija
d i div u MySQL-u daje sledee 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 tekui 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 ugraenih funkcija u komandi ~tltCI

Rezultat je sledei: 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 najee koriene 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 Izraunava vrednost izraza izraz zadati broj puta, Ova funkcija
programu, to moda nee biti najpogodniji oblik prosleivanja datuma. Unixov for-
(broj, izraz) uvek vraa nulu - njena svrha je da meri vreme potrebno za
mat timestamp nije razumljiv oveku, ali su vrednosti zadate u tom formatu potpuno izraunavanje izraza i prikae dobijena vreme.
kompatibilne sa API funkcijama drugih programskih jezika. encrypt(s[,zrnce]) ifruje vrednost s pomou 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 vaem sistemu Qer imate, na primer,
Windows), funkcija vraa rezultat NULL.
YEAR_MONTH) ) ;
found_rows () Daje podatak o ukupnom broju redova koji bi ui tao poslednji upit
generie rezultat neupotrebljiv za oveka ali direktno upotrebljiv u drugom program-
kada ne bi sadrao 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 () Vraa 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 kljua u drugu tabelu.
1 row in set (0.01 sec) md5 (s) Vraa 128-bitni he ulaznog niza znakova s u MDS formatu. Ako
piete aplikaciju koja uva imena korisnika i lozinke, to je prepo-
ruljiv oblik skladitenja lozinki u bazu podataka.
Funkcije za konverziju tipova podataka Algoritmi za ifrovanje podataka imaju ogranien vek upotreblji-
Postoje samo dve funkcije za konverziju tipova podataka, cast () i convert (), koje vosti. Budui da snaga raunara neprekidno raste, neophodni su i
daju isti rezultat, ali se sintaksa malo razlikuje. Ove funkcije omoguavaju konverziju sve snaniji algoritmi za ifrovanje podataka. MDS se zasad smatra
tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer) prilino sigurnim.

u drugi (na primer, char). password(s) Izraunava ifrovan oblik za lozinku zadatu parametrom s. To nije

Prototipovi ovih funkcija su sledei: 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 preporuuje se.
Funkcija cast () podrana je u ANSI standardu, a funkcija convert () podrana je
u ODBC standardu.
Parametar tip moe imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED
Fukcije za upotrebu u odredbi GROUP BY
Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad
(INTEGER) i UNSIGNED (INTEGER).
Veina konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba; naziVaJU grupne ili agregatne funkcije. Moete 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 obrauju kao pripadnici jedne grupe. To smo ve upo-
trebili u upitima kao to je sledei:
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 ugraenih funkcija u komandi SELI::CI
Odgovo1

Ove funkcije se obino primenjuju na grupe podataka , kao u sledeem primeru: 3. Koju biste od sledeih 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 sledeih funkcija poziva MySQL kada interno ifruje lozinke svojih
Tabela 8.7 Funkcije za rad s grupama podataka korisnika?
Funkcija Namena a) password()
avg (kolona) Vraa prosek vrednosti sadranih u koloni kolona . b) encrypt ()
count(kolona) Vraa ukupan broj vrednosti u koloni kolona. e) rodS()
min (kolona) Vraa najmanju vrednost u koloni kolona. d) sha()
max (kolona) Vraa n;Uveu vrednost u koloni kolona.
5. Ako u komandi SELECT upotrebite grupnu funkciju a ne zadate odredbu GROUP
std (kolona) Vraa standardni otklon za vrednosti sadrane u koloni kol ona.
a) to je sintaksna greka
sum (kol ona) Vraa zbir vrednosti sadranih u koloni kolona .
b) cela tabela se obrauje kao jedna grupa
e) ceo skup rezultata se obrauje kao jedna grupa
Saetak d) svaki red se obrauje kao jedna grupa
MySQL prua izbor aritmetikih i logikih operatora, kao i operatora za pere-
enje vrednosti. Pri upotrebi operatora morate naroito obratiti panju na
mogunost pojave vrednosti NULL jer u tom sluaju rezultati nee uvek biti
Vebe
kakve oekujete. l. Napiite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad
MySQL prua bogat izbor funkcija za rad s vrednostima znakovnog i numeri nog mesta 'Programmer', treba da se prikae 'Analyst 1 Programmer'.
kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije . 2. Napiite upit koji u kolonu department dodaje novu slubu iji je naziv Property
Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama Services. Zatim napiite 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 slubi. Upotrebite funkciju last_insert_id (} da
cije deluju na sve vrednosti u koloni tabele. biste dobili identifikator nove slube.
3. Napiite upit koji uitava najnoviji posao iz tabele assignment. Savet: upotrebite
grupnu funkciju max () .
Pitanja
l . Koji se od sledeih operatora ne mogu upotrebiti za ispitivanje da li je odreena
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 ugraen ih funkcija u komane11 ~tLtLI

Vebe

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 sledeem poglavlju
Ovo poglavlje zavrava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi
9 Tipovi tabela u MySQL-u
tabela i transakcije u MySQL-u", razmotriemo pojedine maine baze podataka koje
MySQL podrava i posebne mogunosti koje one pruaju. 10 Upotreba transakcija u InnoDB tabelama
9
Tipovi ta bela u MySQL-u

u OVOM POGLAVLJU RAZMOTRIEMO TIPOVE TABELA koje su na raspolaganju


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

zbog neeg (na primer, prestanka napajanja) prvi upit izvrio do kraja, ali ne i drugi. MyiSAM tabele su uvele sledea poboljanja:
U takvim sluajevima bilo bi neuporedivo bolje da se izvre ili oba upita, ili nijedan, Prenosivost tabela. Tabele smeten e na disk ili na druge medije mogu se prene ti na
jer baza podataka mora uvek biti u usklaenom stanju. drugi raunar na kojem radi MySQL, bez obzira na platformu. To ne vai za
Tabele koje podravaju transakcije omoguavaju da za date da je odreena grupa ISAM tabele.
upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do Podrka za veoma velike tabele. Veliina ISAM tabela je ograniena na 4 GB.
kraja, a ako to nije mogue, baza podataka mora da je po11iti (engl. roll back), odnosno MyiSAM omoguava da tabela bude velika onoliko koliko to dozvoljava ope-
da se vrati u stanje u kojem je bila pre poetka transakcije. rativni sistem. Budui da e to biti vano samo nekim korisnicima, moraete
Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10, paljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi
"Upotreba transakcija u InnoDB tabelama". sistemi za rad s datotekama ograniavaju veliinu datoteka na najvie 2 GB.
U MySQL-u se mogu koristiti sledei tipovi tabela: (Imajte u vidu da to ogranienje moete zaobii ako upotrebite MERGE tabele.)
ISAM Efikasnije iskorienje prostora na disku. Manji su rascepkanost i praznine na disku.
MyiSAM Manja ograni{enja klju{eva. ISAM tabele podravaju najvie 16 kljueva po tabeli,
InnoDB a podrazumevana maksimalna duina kljua je 256 bajtova. My ISAM tabele
BerkeleyDB (BDB) podravaju 64 kljua po tabeli, a podrazumevana maksimalna duina kljua 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 objasniemo pojedinano, ali najvie prostora posveti-
bi da ozbiljno razmislite o njihovoj konverziji u My ISAM. Napor koji treba uloiti je
emo najee upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB
veoma mali, a prednosti su znaajne.
podravaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne ine.
U ovom poglavlju objasniemo i posebne mogunosti koje pruaju My ISAM tabele,
a to su komprimovane tabele i tekstualno pretraivanje. Celo poglavlje 1O posveeno je MyiSAM tabele
posebnim mogunostima maine za skladitenje InnoDB. Mnogi ljudi godinama koriste MySQL ne znajui da moe da radi i s tabelama drugog
tipa. Razlog je to to se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a.
My ISAM tabele omoguavaju veoma brz pristup podacima ali ne podravaju
ISAM tabele transakcije. One obezbeuju visoke performanse u mnogim situacijama, ak i kada
ISAM tabele su ukljuene u MySQL samo radi podrke starijim aplikacijama. Budui
projektant napravi odreene greke, a u rukanu strunog administratora mogu da
daje njihova funkcionalnost u potpunosti odrana MyiSAM tabelama, neemo ih
podre i veoma obimne i/ili veoma optereene baze podataka.
detaljno razmatrati. Planirano je da budu uklonjene iz budue 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 moete dodati sledei red
ISAM tabele omoguavaju brz pristup podacima ali ne podravaju transakcije. Vei
deo onoga to emo rei o My ISAM tabelama vai i za ISAM tabele, pri emu za sta- type=MyiSAM;
rije ISAM tabele postoji vie ogranienja. i dobiete
isti rezultat.
MyiSAM tabele mogu biti jedne od sledee tri vrste: dinamike, statike ili kompri
movane.Tabela automatski postaje dinamika ili statika u zavisnosti od definicija njenih
kolona. Komprimovane tabele moete praviti samo runo, pomou alatke myisampack.
IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U IVIYI.li'IIVI liiUCIC

Tabele iji su redovi fiksne duine automatski se prave kao statike, dok se tabele s KomprimovanjeMyiSAM tabela
redovima promenljive duine prave kao dinamike tabele. Po emu moemo utvrditi Iako tabele nastaju kao statike ili dinamike bez vaeg izriitog zahteva (ali kao rezultat
da li tabela ima redove fiksne ili promenljive veliine? odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste
Tip podataka char i svi numeriki tipovi su fiksne veliinc . Veli ina kolona tipa komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji
varchar, text i b lob menja se u zavisnosti od sadraja. Tabela ije su sve kolone tipa pack_isam, njena verzija iskljuivo za ISAM tabele, ukoliko ih koristite.)
char ili numerikog tipa, bie statika, ali tabela koja sadri barem jednu kolonu tipa Mada se komprimovanje na prvi pogled ini korisno, trebalo bi da ga primenjujetc
varchar, text ili blob bie dinamika. samo za neke aplikacije jer se komprimovane tabele mogu samo itati. Ako treba da
U odeljku "Tekstualno pretraivanje My ISAM tabela", napraviemo tabel u koju izmenite strukturu komprimovane tabele, ili da aurirate podatke u njoj, ili da joj
emo nazvati article. To e biti dinamika tabela zato to sadri kolonu tipa varchar dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajue izmenc
i kolonu tipa text. Prostor na disku koji e biti potreban za skladitenje svakog reda i zatim ponovo komprimujete tabelu.
tabele zavisie od tekuih podataka u poljima tabele. Postupak komprimovanja koji obavlja alatka myisampack ini kombinacija pravog
Statika tabela prua vie prednosti. Pretrauje se bre od dinamike ili komprimo- komprimovanja (Hafinanovim kodom) i vie optimizacija iji je cilj saimanje kolona,
vane tabele. Baza podataka moe veoma lako uitati zapis pronaen na osnovu indeksa na primer, konverzijom postojeih tipova podataka u manje, i konverzijom sadraja
kada se svaki zapis nalazi na odreenom pomaku od poetka datoteke. Tabela se veoma kolona u nabrajanja . Budui da se svaki zapis komprimuje zasebno, dekomprimovanje
lako smeta u ostavu (ke). Manja je verovatno a nepovratnog oteenja podataka u pojedinanog zapisa je relativno jednostavno. Na sporijim ureajima za skladiteqje
sluaju ozbiljnog kvara sistema- alatka za popravku tabela obino uspeva da restaurira podataka trajanje operacije dekomprimovanja moe ak biti i zanemarljivo u pare-
sve redove osim oteenog. enju s trajanjem uitavanja podataka s diska.
Nedostatak statikih tabela jeste to to se pri umetaqju stvarnih podataka u kolone
fiksne veli ne gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite uko- Tekstualno pretraivanje MyiSAM tabela
liko se veliina vaih podataka ne razlikuje previe. Na primer, to vai za imena i pre- Jedna od mogunosti koju zasad pruaju samo My ISAM tabele jeste tekstualno pretra-
zimena ljudi. Meutim, cena e vam moda biti previsoka ako se podaci veoma ivanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba pronai
mnogo razlikuju po veliini. Ako smatrate da e prezimena zaposlenih imati uvek vrednost jednaku traenoj, ali esto se trae rei ili nizovi znakova unutar blokova tek-
maqje od 80 znakova, moda neete eleti da nepotrebno rasipate po 75 znakova svaki sta. U takvim sluajevima tekstualno pretraivanje je korisnije.
put kada se neko preziva Peri ili Jovi. Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno
Za dinamike tabele potrebno je sloenije upravljanje unutar samog MySQL-a. pretraivanje:
Posao keiranja, uitavanja ili popravljaqja zapisa nije tako jednostavan za mainu za create table article (
skladitenje. Razlog je delimino to to je veliina tabele promenljiva, ali i to to tabela articleiD int not null auto increment primary key,
postaje rascepkana (fragmentirana).Ako je zbog promene sadraja red postao vei, deo title varchar(255),
podataka e ostati na izvornom mestu, a deo e biti smeten u novi blok unutar dato- body text,
fulltext (title,body)
teke.To znai da se ne moe garantovati da segment datoteke koji je operativni sistem ) ;
u itao u ke sadri sve delove reda. Osim toga, oteenje tabele moe biti tee popra-
vljivo jer ako se izgube blokovi podataka ili veze izmeu njih, ne moe se lako utvrditi Naredni upit uitava sve zapise koji sadre re 'merger :
koji delovi kojim redovima pripadaju. select title
from article
Da biste popravili ili defragmentirali My ISAM tabelu, moete s komandne linije
where match (title,body) against ('merger');
upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opir-
nije objanjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje Mogua su i sloenija pretraivanja. Naredni upit uitava zapise koji sadre bilo
baze podataka, ali bez popravljanja, moete upotrebiti MySQL-ovu komandu OPTI- koju re iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.
MIZE TABLE. (To je opirnije 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 panju na to da uitavamo zapise koji sadre barem jednu od navedenih


U engleskom jeziku, rei kao to su 'the', 'and', 'then' i 'soon' neophodne su, ali
rei. U ovom sluaju ne traimo nizove znakova niti zapise koji sadre sve navedene
najee nisu korisni pojmovi za traenje. U MySQL-u postoje standardne liste takvih
rei. Pomou modifikatora IN BOOLEAN MODE, koji emo objasniti u nastavku teksta,
rei (za engleski j ezik) , a moete i sami sastaviti takve liste za tekstove na drugim
mogu se zadati obe vrste pretrage istovremeno. . , govornim jezicima koje indeksirate.
Rei acquire' i acquis i tions' morali smo da navedemo odvojeno zato sto
Budui da je tekstu~no pretraivanje veoma sloen posao, vano je imati na umu
MySQL zasad jo ne podrava pretraivanje od korena (engl. stemming). Tehni~a pre-
injenicu da postoje ozbiljna ogranie!* u pogledu performansi. Kada MySQL-ove
traivanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe.
tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse tekstu~nog
Ona omoguava da sistem prepoznaje da odreeni skup rei ima zajedniki koren.
pretraivanja osetno se pogoravaju. U manjim aplikacijama to ne bi treb~o da pred-
Na primer, 'acquire' je koren drugih rei kao to su 'acquire s', 'acquired' 1
stavlja problem, ~i imajte tu injenicu na umu kada pravite sloenije aplikacije.
'acquisition'.
Rei koje su este meu podacima ne koriste se pri pretraivanju.Ako vaa tabela
Za svako otkriveno poklapanje izraunava se koeficijent povezanosti s traenim
sadri tekstove objavljene u biltenu vae kompanije Acme PTY Ltd., verovatno e
pojmom (engl. relevance value), a rezultati se automatski sortiraju po opadaju.oj vred-.
nmogi tekstovi u zaglavlju sadrati re 'Acme'. Pretraga po toj rei e verovatno gene-
nosti tog koeficijenta. Ako elite, moete pogledati i koeficijente povezan os tr za svaki
risati mnogobrojne rezultate, koji ipak nee biti upotrebljivi. Ako 50% ili vie zapisa
uitani zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki
sadri odreenu re, smatra se da ta re nema vrednosti za izraunavanje koeficijenta
zapis koji ima koeficijent nula nije ni po emu povezan s traenim pojmom i zato se ne povezanosti.
uitava.

select title, match (title,body) Logiko tekstualno pretraivanje


against ('merge acquisition acquire takeover') Pri pretraivanju moete imati vei stepen kontrole ako upotrebite modifikator IN
as relevance BOOLEAN MODE.
from article;
Naredni upit e ui tati samo zapise koji sadre re 'linux' i izraz "Open source",
Obratite panju na to da relevance nije rezervisana re, ve samo alijas za . ali ne i re 'desktop'. Rei 'Java' i 'Oracle' nisu obavezne, ali kada se odreuje
match(title,body) against ('merge acquisition acquire takeover').Zad~r koeficijent povezanosti, re 'Java' poveava rang zapisa, a re 'oracle' smanjuje
smo je samo zato da bi rezultati bili lake itljivi. rang zapisa. Redosled traenih rei u nizu znakova ili u zapisu nije bitan.
Korisniji je sledei upit, koji prikazuje naslove i koeficijente povezanosti uitanih nele ct title
dokumenata. Budui da imamo uslov MATCH u odredbi WHERE, rezultati e biti sorti- from article
rani, a redovi koji se ne odnose na traeni pojam bie 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 logiko pretraivaqje
takeover'); ()pcrator Znaenje
Postoje odreene rei
koje se ne mogu traiti. Da bi se poboljale performanse, Ova re je obavezna.
odreene rei su iskljuene iz indeksa ili se zanemaruju pri pretraivanju.
Ova re ne treba da se pojavi u rezultatima.
Kratke rei se ne indeksiraju. Standardno se zanemaruju i sve rei koje sadre manje
Ova re je manje vana.
od etiri slova. Na nekim instalacijama, kao to je Slashdot.org, to je ozbiljan problem,
Ova re je vanija.
poto su troslovni akronimi esto vaan deo sadraja tehnikih tekstova.To ogranie-nje )
( Grupie rei u podizraz.
moete zaobii ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU
vrednost, ali onda morate ponovo generisati sve indekse. Ova re se moe pojaviti u rezultatima ali smanjuje rang zapisa.
U indeksima za tekstualno pretraivanje moete zadati nebitne rei (engl. stop words). Dokerski sufiks. Na primer, merge nee pronai i merger, ali merge* e
pronai i merge i merger. Moe se upotrebiti samo na kraju rei za prctragu.
Nebitna re je bez semantike vrednosti. To su uglavnom rei koje su vane za sasta- ll ll
vo je izraz. Pronalazi samo identian sadraj, u istom redosledu .
vljanje reenice, ali za koje je malo verovatno da e biti vane za sadraj teksta.
--------------------
BerkeleyDB (B DB) tabele
134 Poglavlje 9 Tipovi ta bela u MySQL-u

Iako je razvijen odvojeno od veeg dela MySQL-a, InnoDB se moe koristiti pod
Za logiko pretraivanje nije neophodno da postoje indeksi za tekstualno pretrai-
jednakim uslovima dve vrste licence.
vanje. Tako se mogu pretraivati i neindeksirane tabele, ali je postupak veo~a spo~.
Mnoge opsene i veoma poseene Web lokacije koje koriste MySQL, kao to su
Jo jedna mala razlika izmeu tekstualnog pretraivanja i logikog p~etr_a_lvanJa jeste
Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l
to to se pri logikom pretraivanju zanemaruju rei koje se esto poJaVlJUJU _me~u
finance. yahoo. com), koriste mainu InnoDB. Naroito je pogodna za obradu velikih
podacima. U tom sluaju ne vai pravilo 50%. Ako pretraujemo tekstove obJaVlJene
koliina podataka, velikom brzinom i u okruenju koje podrava transakcije.
u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno uitao gotovo sve
InnoDB je jedan od najbrih sistema na svetu koji podrava transakcije, ali po cenu
redove, dok bi rezultat upita iza njega bio prazan skup.
izvesnih rtava. Pri veini upotreba, My ISAM e biti bri, ali razlika najee nee biti
select title from article tako znaajna.
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 nai ete na www. innodb. com.
where match (title,body) against ('Acme');
BerkeleyDB (BDB) tabel e
lnnoDB tabele Druga mogunost koju imate kada za MySQL birate mainu za skladitenje koja podr-
Sada emo razmotriti InnoDB tabele. InnoDB je maina za skladitenje koja je brza i ava transakcije jeste BerkeleyDB (obino se skrauje na BDB). BDB se moe nabaviti
podrava transakcije. Njene mogunosti transakcione obrade su toliko vane da emo od kompanije Sleepycat software (www. sleepycat. com) . Ova maina se koristi za trans-
njihovoj primeni posvetiti celo naredno poglavlje. akcionu obradu u MySQL-u ree nego InnoDB. Mada je BDB maina ve due vreme
InnoDB table omoguavaju na tritu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj
Transakcionu obradu.Videti poglavlje 10. dokumentaciji stoji da je kvalitet usklaenosti s MySQL-om nivoa "gama". To znai da
j e pouzdanost bolja od verzije beta, ali postoje odreeni problemi. Ne zaboravite, u
Zakiju{avanje podataka na nivou reda. To znai 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.Vema drug1h .
maina za skladitenje (osim BDB-a) primenjuje zakljuavanje podataka na mvou koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".
BDB primenjuje zakljuavanje podataka na nivou stranice, usled ega su perfor-
cele tabele, tj. kada jedan proces aurira jedan red tabele, cela tabela nije dostupna
manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite vei
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, poto se to
spoljni kljuevi nee raditi s tabelama drugog tipa.
ionako preporut~e) . U stvari, primarni klju e automatski biti napravljen ako ga
Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je sami izriito 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 nain skla- to s drugim tipovima tabela za koje se indeksi uvaju u obliku b-stabala. Posledica je
ditenja podataka. Dok My ISAM smeta svaku tabelu u zasebnu datoteku, InnoDB sporije sekvencijalno uitavanje redova tabele (to se primenjuje, npr. kada bezuslovno
smeta sve tabele i indekse u tabelarni prostor, to znai da se delovi jedne tabele mogu u itavate sve redove tabele ili izvravate upite u kojima su indeksi neupotrebljivi).
nalaziti u vie datoteka. Zahvaljujui tome, InnoDB moe raditi s veoma obimnim Osim toga, BDB tabele zauzimaju vie mesta na disku.
tabelama za iju veliinu ne vae ogranienja koja namee operativni sistem. Meutim, Vano ogranienje BDB tabela jeste to da ne moete po meri ti postojee podatke
imajte u vidu da u poreenju s MyiSAM tabelama,jedna InnoDB tabela zauz1ma na drugo mesto na disku. Razlog je to to se zajedno s podacima tabele skladiti i apso-
znatno vie prostora na disku za skladitenje istih zapisa. .. . , . lutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate oba-
Celo naredno poglavlje, 10, posveeno je upotrebi ovih speclJalmh mogucnost1 vezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih neete moi da
JnnoDB-a. pokrenete bazu podataka.
Podeavanje InnoDB-a zahteva odreeni napor. Osnovnu ~onfiguracij~ opisali :~10
u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr-
nijl! u poglavlju 12",Podeavanje 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 sadraj je unija (UNION) tekueg sadraja sve tri tabele. Osim toga, zadali smo last
MERGE tabele predstavljaju vet nain zaobilaenja ogranienja maksimalne veliine (poslednja) kao vrednost opcije INSERT_METHOD. To znai da e nov red koji unesemo
datoteka koja namee operativni sistem. Poto se svaka MyiSAM tabela smeta u u ovu MERGE tabel u biti fiziki smeten u poslednju tabelu u grupi, u ovom sluaju,
zasebnu datoteku, veliina tabele je ograniena na maksimalnu veliinu datoteke koju log2003Mar. Ostale mogunosti su FIRST (podaci se umeu u prvu tabelu u grupi) ili
operativni sistem dozvoljava. To se moe zaobii pomou MERGE tabele,j:r one NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).
omoguavaju da se u upitima vie My ISAM tabela obrauju kao Jedna log1cka tabela. Tako smo formirali tabelu s kojom moemo da radimo na uobiajeni nain i koja
Pogledajmo primer. Listing 9 .l sadri kod koji formira MERGE tabel u od tn prividno sadri sve podatke iz svih tabela u grupi. Ako izvrimo upit
tabele dnevnika promena. select * from logs;
Listing 9.1 A MERGE Table Example dobiemo sledee 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 vano 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 drugaije od naina na koji obino rade primarni kljuevi. Njihove vrednosti
logts datetime, obino moraju biti jedinstvene, ali poto MERGE tabela upravlja istovremeno s tri
entry char(255)); skupa primarnih kljueva, nipoto nije iskljueno da postoji vie od jednog reda koji
insert into log2003Feb values sadre istu vrednost primarnog kljua, 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 moemo izvravati upite na uobiajeni nain. Meutim, komande DROP,
logts datetime, ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se vie
entry char(255)); izvriti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE)
insert into log2003Mar values ipak moete izvriti ukoliko MERGE tabela trenutno nije otvorena. Moete je zatvoriti
(NULL, '2003-03-01', 'first mar entry');
pomou komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon

create table logs komande FLUSH moete izvriti i bilo koju od navedenih komandi, ali mi smo ustanovili
(logid int auto increment primary key, da to nije uvek sasvim tano. Na primer, u vreme pisanja ove knjige, ako se pomou
logLs datetime, komande DROP izbrie jedna od tabela u grupi, automatski se brie i sama MERGE
ntry char(255)) tabela. Ako je potrebno da neku od navedenih komandi izvrite nad jednom od tabela
ype merge u grupi, najbolje je da prethodno izbriete MERGE tabel u i da je zatim ponovo napra-
Ullion (log2003Jan, log2003Feb, log2003Mar)
insert_method = last; vite. Brisanje MERGE tabele ni na koji nain ne utie na njene komponente niti na
podatke u njima.
U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan, Tabele koje ine MERGE tabelu moete komprimovati pomou alatke myisam-
lo~2003Fcb i log2003Mar. MERGE tabele se esto primenjuju za beleenje promena, pack. To je naroito korisno u sluajevima kao to je na primer u kojem skladitima
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 budui 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 ''''lkc
.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 podrava transakcije.
HEAP tabele su izuzetno brze i cele se uvaju u memoriji. Brzina se postie zahvalju- MyiSAM podrava komprimovanje tabela.
jui upotrebi heiranih indeksa. ":eliina ~yiSAM tabela je ograniena
na maksimum koji dozvoljava operativni
Nedostatak uvanja cele tabele u memoriji jeste, naravno, to da u sluaju problema
s1stem, al1 se to ogranienje moe zaobii pomou MERGE tabela.
s napajanjem raunara, podaci iz HEAP tabele nestaju zauvek. Meutim, tabele tog
Datoteke u koje su smetene My ISAM tabele prenosive su izmeu razliitih ope-
tipa su savrene za uvanje privremenih podataka.
rativnih sistema.
Tabelu tipa HEAP moete napraviti na sledei nain:
Jedna tabela moe imati najvie 64 kljua a svaki moe sadrati najvie 1024 bajta.
create table testHeap
(id int not null primary key,
data char(lOO)) lnnoDB
type=heap InnoDB tabele podravaju transakcije.
max_rows = 100; InnoDB podravaju zakljuavanje na nivou redova.
Kao to vidite, tip tabele zadali smo kao HEAP. Osim toga, primenili smo i dobro
Ne postoji teorijska gornja granica veliine tabele jer jedna tabela moe biti
praktino pravilo ograniavanja maksimalnog broja redova u tabeli. Ako vaa HEAP smetena u vie datoteka.
tabela previe naraste, lako se moe dogoditi da vam ponestane memorije. Maksimalan
InnoDB omoguava dosledno uitavanje redova bez zakljuavanja u komandama
broj redova u HEAP tabeli moe se zadati u konfiguracionoj opciji
SELECT.
max_heap_table_size.
HEAP tabele imaju sledea ogranienja: InnoDB tabele su prenosive izmeu razliitih operativnih sistema.
InnoDB tabele zauzimaju vie prostora na disku od MyiSAM tabela.
Nisu podrane kolone tipa AUTO_ INCREMENT.
InnoDB tabele podravaju spoljne kljueve .
Nisu podrani tipovi podataka BLOB i TEXT.
U HEAP tabelama ne mogu se traiti redovi na osnovu poetnog dela indeksa.
BDB
(Ako ne znate ta tano ovo znai, vie informacija o indeksiranju nai ete u
Kao i InnoDB tabele, BDB tabele podravaju transakcije. BDB tabele ree se
poglavlju 19.) koriste u MySQL-u od InnoDB tabela .
Indeksi se mogu koristiti pri pretraivanju redova tabele samo u upitima koji u
BDB podrava zakljuavanje podataka na nivou stranice.
uslovima za pretragu sadre operatore = ili <=>.
BDB tabele nisu prenosive.

Saetak MERGE
MySQL podrava est tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE MERGE tabele omoguavaju da se vie My ISAM tabela tretira kao jedna
i HEAP. logika tabela, zahvaljujui emu se zaobilazi problem najvee dozvoljene
Samo tabele tipa InnoDB i BDB podravaju transakcije. veliine MyiSAM tabela .

Samo MyiSAM tabele podravaju tekstualno pretraivanje i indeksiranje.


HEAP
HE~ t~bele se u celini uvaju u memoriji i njihova se veliina mora ograniiti
ISAM
ISAM je zastareli tip tabela, zamenjen tipom My ISAM. da b1 se Izbegla prevelika potronja memorije .
ISAM tabele imaju ogranienu veliinu od najvie 4 GB. ~o~aci ~meteni u HEAP tabelu nisu trajni i gube se u sluaju prestanka napa-
JanJa racunara .
ISAM tabele nisu prenosive izmeu dva sistema.
HEAP tabele su superbrze, pod uslovom da imate dovoljno fizike memorije u
Jedna tabela moe imati najvie 16 kljueva, a svaki moe sadrati 256 bajtova
koju ete ih smestiti.
(znakova).
I lEA l' tabele ne podravaju kolone tipa AUTO_INCREMENT, TEXT i BLOB.
140 Poglavlje 9 Tipovi tabela u MySUL-u u ~1euecem poglaVlJU

Pitanja Vebe
1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi opera- Za ovo poglavlje nema formalnih vebi, ali bi bilo korisno da vebate 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 pretraivanje. 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 sledeem poglavlju
b) MERGE U sled eem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraemo ta
e) InnoDB ta no znai pojam transakcija, zbog ega su transakcije tako vane i kako se one pri-
menJUJU u InnoDB tabelama.
d) nijedan od prethodnih
4. Potrebno nam je tekstualno pretraivanje. Za tu namenu pogodne su tabele tipa
a) MyiSAM
b) InnoDB
e) BDB
d) HEAP
S. Pogledajte sledei upit za tekstualno pretraiva~e:
select title
from article
where match (title,body)
against ('+php +pdf pdflib >tutorial -reference'
IN BOOLEAN MODE);
Koja od sledeih tvrdnji o ovom upitu nije tana?

a) Teina traene rei 'tutorial' je poveana.


b) Rang rezultata koji sadre re 'reference' bie povean.
e) Rezultati pretrage moraju sadrati re 'ph p' .
d) Rezultati pretrage koji sadre re 'pdfl ib' bie rangirani vie od onih
koji je ne sadre.
10
Upotreba transakcija
u lnnoDB tabelama

u OVOM POGLAVLJU BAVIEMOSE transakcijama u MySQL-u. U


merima koristiemo tip tabela InnoDB, ali gotovo sve to bude reeno
praktinim pri-
vaie podjed-
nako i za BerkeleyDB tabele.
Razmotriemo sledee teme:

ta je transakcija
Upotreba transakcija u MySQL-u
InnoDB-ov model transakcije i usklaenost s ACID pravilima

ta je transakcija?
U ovom poglavlju, prvo moramo razjasniti ta je transakcija. U kontekstu sistema za
upravljanje bazama podataka, transakcija je niz povezanih komandi koje se moraju
obraivati kao nedeljiva celina. Drugim reima, sve to treba da bude uraeno u trans-
akciji mora se uraditi u celini, ili ne sme nita uraditi. Ovaj koncept je poznat kao
nedeljivost (engl. atomicity). Kae se da je transakcija atom obrade jer se ne moe razbiti
na manje delove - obrauje se u celini ili se uopte ne obrauje.
Ovaj koncept ima vane posledice kada se razmatra pristup podacima u okruenju s
vie korisnika, procesa i niti izvravanja (engl. threads) istovremeno, a vaan je i za obna-
vljanje podataka nakon kvara. Savremenim raunarima esto pristupa vie korisnika
istovremeno. Na njihovim raunarima obino je aktivno vie programa u isto vreme,
a esto koriste i programe kao to je softver za Web server koji formiraju vie istovreme-
nih procesa ili niti izvravanja. Svakom od tih korisnika, programa, procesa ili niti
izvravanja moe biti neophodan pristup serveru baze podataka.
Vie niti izvravanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako
doe do greke, pri obnavljanju podataka baza podataka mora zavriti otvorene trans-
akcije. To znai da se baza podataka mora vratiti u stanje u kojem je bila pre poetka
..JI.d j\. ll dllltU\l.ljtll
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

transakcije, ili mora da izvri celu transakciju do kraja. Uglavnom je bolje izgubiti celu Ukoliko dva klijentska programa izvravaju parove ovakvih upita istovremeno,
transakciju koja se sastoji od meusobno povezanih izmena nego doi u stanje deli- rezultati e zavisiti od toga koji se u kom trenutku izvrio. Ako smo pomou ovih
mino unetih izmena iji rezultat moe biti neusklaenost sadraja baze podataka.
upita pokuali da upiemo uplatu od 500 dolara, a drugi klijentski program je pomou
Ovaj koncept se moe izraziti formalno, ali je verovatno najbolje da na primeru naredna dva upita pokuao da uplati 1 OO dolara, konano stanje rauna moe biti 11 OO
shvatite o emu se tano radi. Recimo da imate vrlo jednostavnu (ali potencijalno dolara ili 1500 -a nijedno od toga nee biti taan rezultat.
veoma vanu) bazu podataka u kojoj se uvaju podaci o prometu na bankovnim rau # najpre uitavamo tekue stanje na raunu

nima. Za svaki raun postoje barem podaci o identifikatoru rauna i tekuem stanju. select balance from account where number = 2;
# upit daje rezultat od 1000 dolara
Tabelu bankovnih rauna, accounts, moemo napraviti sa sledeom 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 suaju problem moe lako reiti.
number int not null auto increment primary key,
balance float Ako izmene zadamo kao relativne a ne kao apsolutne, postae nedeljive jedinice i reili
type = InnoDB; smo problem. Naredni upit e davati ispravne rezultate, bez obzira na to da li se u isto
Verovatno vas nee iznenaditi nain na koji emo otvoriti tri nova rauna pomou vreme izvravaju i drugi upiti:
s l edei 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 moe je prekinuti
insert into account (balance) values (1000.0); druga komanda, niti se moe izvriti samo delimino. Izvrie se cela, ili e u sluaju
insert into account (balance) values (2000.0); greke cela biti ponitena.
Poto dosad nita nije moglo da krene ba naopako, trebalo bi da rezultati budu sle- Sloeniji sluajevi su malo tee shvatljivi. Pogledajte naredni par upita ija je svrha
dei podaci: prenoenje iznosa od 1000 dolara sa rauna 2 na raun 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 vano da se oba upita izvre da
l l l o l
1000 l
bismo dobili smislene rezultate. Trebalo bi da nakon izvravanja upita iznos novca u
l 2 l
3 l 2000 l sistemu bude isti kao pre izvravanja upita. Novac treba da bude prebaen s jednog
l
+--------+---------+ rauna na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako doe

Ako nita unapred ne odreujemo u vezi s brojevima rauna koji se generiu u do prekida napajanja izmeu izvravanja prvog i drugog upita, podaci vie nee biti
koloni tipa auto-increment, nevaan je redosled kojim ete izvriti ove upite. Sasvim je usklaeni.

nebitno da li ete ih izvriti istovremeno s tri interaktivna klijentska raunara i ne U jednostavnim sluajevima, problem se moe zaobii tako to se oba upita zdrue
moete znati koji e upit biti izvren prvi. u jednu SQL komandu. U ovom primeru moemo napisati sledei upit:
To esto nije tano kada se izvravaju sloeniji upiti ili grupe upita . Pogledajte update account as source, account as dest
naredne dve komande koje uplauju SOO dolara na raun broj 2: set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000
# najpre uitavamo tekue stanje na raunu where source.number = 2 and dest.number = l;
select balance from account where number = 2;
ll upit daje rezultat od 1000 dolara Poto 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 izvri ili da se uopte ne izvri.
\lpdate account set balance = 1500 where number= 2; Ne moramo da brinemo da li e server prestati da radi tokom izvravanja nekog dela
Ova dva upita su meusobno povezana i moraju se izvriti zajedno. Ako klijentski operacije koju smo zahtevali.
programi s drugih raunara mogu da izmene stanje na ovom raunu izmeu nae pro- U ovom sluaju "stradala" je jedino razumljivost upita. Ovako kombinovan upit je
vere stanja i naeg aurira~a stanja, moe se dogoditi da ne dobijemo rezultate koje slabije razumljiv i tee se otkrivaju greke nego u prvoj verziji koju smo naveli.
SiliO oekivali.
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 sluajevima nee biti mogue zdruivanje svih povezanih upita u jedan Podeavanje automatskog potvrivanja transakcije
kao u navedenom primeru.Jedino reenje u takvim sluajevima, ukoliko elite razu- U MySQL-uje standardno ukljueno automatsko potvrivanje transakcija (reim rada
mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi autocommit). Svaki upit koji pokrenete, automatski se izvrava u okviru vlastite
oznaite kao transakciju, time obavetava te bazu podataka da je to povezan i nedeljiv transakcije. Moete zamisliti da se sve odvija kao da ste izriito zadali komande START
skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvriti 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 moete izvriti kao jednu transakciju kao to su sledei
pomou sledeih 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

izvrava 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;
Vana osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu commit;
zavrene i potvrene (tj. izmene unete u bazu podataka). Nijedna druga nit izvravanja s tart transaction;
(proces) ne moe da ita neusklaene podatke iz tabele ili tabela dok se ne zavri update account set balance balance + 1000 where number l
commit; '
postupak auriranja koji ste zapoeli.
Druga prednost transakcija jeste to da se delimino izvrene transakcije mogu Ukoliko upiete
ponititi. Ako transakciju ponitimo pre nego to je potvrdimo (engl. commit), sve s tart transaction;
izmene koje su nainili upiti koji ine transakciju bie ponitene.
nita se nee dogoditi dok ne upiete i
U naem primeru prenoenja novca na drugi raun, ako dodamo komandu SELECT
da bismo proverili da ne skidamo vie novca sa izvornog rauna nego to ga ima na commit;
njemu, moemo upotrebiti rezervisanu re ROLLBACK ukoliko elimo da ponitimo Automatsko potvrivanje transakcija moete iskljuiti pomou komande SET na
sledei nain:
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 zakljuili, sledea komanda vraa MySQL u reim 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 kae da je stanje na raunu broj 2 negativno! Poto je promenljiva autocommi t lokalna za sesiju, izmena reima rada vai samo za
ll bolj e da ponitimo promenu upite koje pokree tekua sesija, dok je ta sesija aktivna.
ro llba ck;
Ako iskljuite automatsko potvrivanje transakcija, nije potrebno izriito zadati
Komanda ROLLBACK prekida transakciju i ponitava sve izmene nainjene od poetka komandu START TRANSACTION da biste zapoeli transakciju. Nipoto ne zaboravite da
transakcij e. Transakcija koja je bila ponitena umesto da bude potvrena ne ostavlja povremeno izdate komandu COMMIT da biste izmene koje ste nainili trajno preneli u
nikakav trag na podacima. Budui da delimini rezultati nisu bili vidljivi iz drugih bazu podataka.
lt .msa kcija , konano stanje baze podataka isto je kao da transakcija nije ni bila zapoeta. Bez obzira na to da li je reim autocommit ukljuen ili iskljuen, u odreenim slu-
ajevima se izmene koje nainite automatski potvruju (i prenose u bazu).Ako koristite
tip tabela koji ne podrava transakcije, kao to je My ISAM, sve izmene koje nainite
Upotreba transakcija u MySOL-u
odmah se prosleuju 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 moete grupisati komande izmeu komandi START TRANSACTION i COMMIT, ali to
upotrebiti tip tabela koji podrava transakcije- to moe biti InnoDB ili BDB. Postoje
nee imati nikakvog uticaja ako tabela ne podrava transakcije. Moete ak upotrebiti
Lt l' !i it c sintakse koje daju isti konaan rezultat.
i komandu ROLLBACK. Time neete izazvati greku, ali u tabeli koja ne podrava trans-
Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Moda ete
akcije, ta komanda prosto nee imati nikakvog efekta ni na ta to ste izmenili.To moe
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 uitava te podatke na server
l ;tka koju imate, ali uglavnom se preporuuje sintaksa START TRANSACTION, budui 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 podravaju transakcije, postoje akcije (osim izriitog izdavanja Blokada niskog prioriteta bie 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. Meutim, ako je server veoma opte-
zakljuavanje podataka, time ete implicitno potvrditi sve zapoete upite. reen, takva situacija se moda nikad nee dogoditi.
Verovatno neete esto runo upravljati blokadama na ovakav nain, ali postoje
Zakljuavanje podataka izvesni razlozi zbog kojih biste to ipak uinili. Ako imate aplikaciju koja treba da obez-
Druga mogunost da iskoristite deo prednosti transakcija jeste da runo zakljuavate bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu-
i otkljuavate tabele. ajevima, moe biti isplativije da koristite brze tabele koje ne podravaju transakcije i da
Ako zaista elimo da primer koda za deponovanje novca na bankovni raun napi- runo postavljate blokade da biste reili problem nemogunosti transakcione obrade.
eme s dva odvojena upita, to bi izgledalo ovako: Jo jedan est sluaj u kojem ete izdavati komande LOCK TABLES jeste kada
lock tables account write; direktno manipuliete MySQL-ovim datotekama s podacima. Na primer, ako elite da
select balance from account where number = 2; obezbedite da sadraj datoteka na disku ostane usklaen i nepromenjen dok pravite
update account set balance = 1500 where number = 2; njihove rezervne kopije, morate zakljuati te datoteke.
unlock tables; Najvanije to treba da zapamtite u vezi sa zakljuavanjem podataka jeste da morate
Komanda LOCK TABLES pokuava da zakljua sve tabele koje navedete da bi tekua to pre ukinuti sve blokade koje ste postavili inae e drugi sistemi i korisnici morati
nit izvrenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobaa sve da vas ekaju. Imajte u vidu da neki poslovi za ije obavljanje ete postavljati blokade,
blokade koje je tekua nit postavila. Postupak deblokade tabela vrlo je jednostavan. kao to su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri-
Ukoliko ste zakljuali tabel u, imajte u vidu da je morate to pre osloboditi da biste to lino dugo.
manje ometali druge niti. Zakljuavanje tabela je sloenije pitanje.
Sve tabele koje vam trebaju morate zakljuati istom komandom. U prethodnom
prim eru zahteva se zakljuavanje samo jedne tabele, ali ako nameravate da pristupate
Transakcioni model lnnoDB
grupi tabela istovremeno, ili ak razliitim alijasima iste tabele, morate ih sve navesti u Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-vie
istoj komandi, na primer: iste ciljeve ali uz primenu razliitih pristupa problemu. Da bi izolovao transakcije
jedne od drugih, InnoDB primenjuje zakljuavanje podataka na nivou reda tabele. To
lock tables account write, account as a read, othertable low_priority
znai da se razliite transakcije mogu odvijati nad sadrajem iste tabele u isto vreme,
write;
pod uslovom da samo itaju tabelu ili da ne menjaju iste redove kada upisuju podatke.
Poto komanda LOCK TABLES oslobaa sve blokade koje ste pre nje postavili, ako Nepotvrene izmene spreavaju da druge niti pristupaju samo redovima na koje
pokuate da grupiete blokade koje su vam potrebne za vie komandi, sve prethodne deluje tekua transakcija, ali ne i celoj tabeli. Zahvaljujui toj osobini, InnoDB obezbe-
blokade bie ukinute a blokada e vaiti samo za poslednju komandu u grupi. uje visoke performanse uz prednosti koje biste oekivali 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 usklaenost s gru-
radi upisivanja podataka i ne moete dozvoliti da druge niti pristupaju tabeli u isto pom pravila ACID.
vreme kad i vi, blokada za pisanje e spreiti da bilo koja druga nit ita tabelu ili pie
u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da itate tabelu, nema Usklaenost sa ACID pravilima
nik:lkvc tete ako dozvolite da i druge niti itaju tabelu u isto vreme. Blokada za itanje Vaan pojam iz terminologije baza podataka koji jo nismo definisali jeste ACID. To je
sprcbva druge niti da piu u tabel u samo dok je vaa nit blokira. akronim od engleskih rei Atomicity, Consistency, Isolation i Durability (nedeljivost,
nlokada za pisanje moe se zadati sa opcijom low_priority (nizak prioritet). U sva- usklaenost, izolovanost i trajnost). Mnogima smeta injenica da pri korienju
kon! sistemu koji omoguava blokiranje tabela, ukljuujui i MySQL, neophodna su MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele,
pr.1v1Ll koja odreuju ko e u sluaju sukobljenih zahteva moi prvi da postavi blokadu. MySQL je usklaen sa ACID pravilima.
MySQL obino daje vei prioritet zahtevima za blokade radi pisanja da bi omoguio da Atomicity (nedeljivost) znai da je svaka transakcija nedeljiva celina. U bazu poda-
mncnc uskladitenih podataka budu obavljene to pre. Ako vam takvo ponaanje ne taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U sluaju
odgov:mt, moete zahtevati blokadu za pisanje niskog prioriteta kao to smo uradili spoljne greke, jasno je da bi bilo savreno kada bi postupak obnavljanja baze podataka
"' tabel u othertable u prethodnom primeru. Meutim, postoji zakoljica. Kad god bio u stanju da dovri sve transakcije koje su bile zapoete u trenutku greke; meu
:t.illtcvatc blokadu tabele, moe se dogoditi da morate saekati da ona bude odobrena. tim, prihvatljivo je i da te transakcije budu ponitene.
l ransakciOni model lnnoDB
Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Nivo izolovan osti serializable je savren gledano iz ugla usklaenosti i robusnosti


Consistency (usklaenost) znai 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 "meu
se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego
stanja" u kojima podaci nisu potpuno usklaeni. Osim toga, trebalo b1 da baza pvodataka
to b.u~e dozvoljeno sledee itanje istog podatka. Transakcije ne moraju da se uvek
spreava operacije koje naruavaju usklaenost podataka. Ako u baz1 podataka :uvate
?dVIJaJU bez meusobnog preplitanja da bi se dobio privid serijalizovanih transakcija
bankovne raune 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 raun koji pripada nepostojeem klijentu, niti bi trebalo dozvoliti brisanje
podatke u isto vreme, one e biti serijalizovane. Poto u tom sluaju mora doi do
klijenta iz tabele klijenata ukoliko u tabeli rauna ima rauna koji mu pripadaju ....
z~klju.avanja podataka i ekanja na njih, kombinovano s obavezom ispitivanja i pred-
Isolation (izolovanost) znai da transakcije ne deluju jedna na drugu dok se odviJaJU.
vianp koje se transakcije meusobno prepliu, konaan 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 nain transakcione obrade. Ako elite da radite s tim
nosti to nije uvek tako, ali se pomou blokada moe postii takav priv1d. U zav1snost1
nivoom izolovan osti, komanda je sledea:
od naina podeenosti baze podataka i opcija koje upotrebite, u praksi ete imati raz-
liite nivoe izolovanosti. (Opirnije objanjenje nai ete u sledeem odeljku.) se t transaction isolation level serializable;
Durability (trajnost) znai da izmene koje je transakcija nainila a prosleene su bazi Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka
podataka, treba da postanu trajne. Ovaj uslov se moe lako ispuniti u jednostavn~~ transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadraj k;o na
programu, ali u sloenom sistemu za upravljanje relacionim bazama podataka, kojl poetku transakcije. Garantuje se da je itanje reda ponovljivo, tj. da se iz istog reda
zakljuava podatke i odrava vie verzija istih podataka u isto vreme, problem se pret- svaki put uitavaju isti podaci. Ako na poetku transakcije pozovete
vara u pravo "minsko polje". Osim toga, trajnost znai i to da bi u sluaju kvara trebalo sel ect * from account where number=l;
da postoji mogunost povratka baze podataka u tekue stanje. Ako se pres~~nak napa-
a zatim isti upit ponovo izvrite kasnije u transakciji, oba puta dobiete isti rezultat.
janja, kvar diska ili druga katastrofa dogodi izmeu trenutka u kojem J~ klljentski pro-
Meutim, moete dobiti i ono to se zove jm1tomski podaci (engl. phantom reads). Moe
gram poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI
se dogoditi da druga transakcija koja se zavri pre vae doda nove redove u tabelu.Ako
mogunost da se, pomou kombinacije rezervnih ko~ija baze podat~ka 1 dnev~1ka . dvaput izvrite isti upit koji sadri odreeni uslov, kao sledei
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 zapoete ali ne i potvrene.
Ako koristite Inn oD B tabele (ili BerkeleyDB tabele), MySQL je usklaen sa ACID moe se dogoditi da pri drugom itanju dobijete nove redove - fantomske redove -
pravilima. Nedeljivost je obezbeena upotrebom sinta~se za trans.a~cije. Transakcije i kojih nije bilo prvi put.
spoljni kljuevi obezbeuju usklaenost podataka. Mozete podes1~1 mvo 1Zolovanost1 Trebalo bi da u praksi vrlo retko naiete na fantomske podatke u MySQL-u.
transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka ob~z lnnoDB reava problem pomou algoritma nazvanog blokiranje sledeeg kljua (engl.
beuju trajnost izmena. (Replikovanje omoguava 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 neusklaenosti.) Verovatno ve znate da InnoDB primenjuje zakljuavanje podataka na nivou redova .
~ad~ se transakcija odnosi na odreeni red tabele, taj red se zakljuava da bi transakcija

Izolovanost transakcija bila Izolovana od drugih. Osim zakljuavanja redova na koje se transakcija odnosi,
InnoDB tabele mogu da se rade s etiri nivoa izolovanosti transakcija. Redosledom od ,tlgoritam blokiranja sledeeg kljua blokira i razmake izmeu redova koje nae u
najjaeg ka najslabijem, to su sledei: tndeksu. Poto se problem fantomskih podataka reava na taj nain, nivo izolovanosti
wrializ able moraete da koristite samo u malom broju sistema .
Serializable (transakcije se serijalizuju)
_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo vie
Repeatable read (podaci su ponovljivi pri svakom itanju)
nece b1t1 ~asv1m 1z~~ovane. Ako izvrite neki upit, a zatim ga kasnije u transakciji pono-
Read committed (dozvoljava se itanje podataka iz potvrenih transakcija) VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u meuvremenu izmenila
Read uncommitted (dozvoljava se itanje podataka iz nepotvrenih transakcija) podatke i prenela izmene u bazu. Ako vam ba to odgovara, komanda je sledea
Kao i u mnogim drugim sluajevima, morate napraviti kompromis izmeu robu- Hl'L transaction isolation level read committed;
snesti i performansi.
2 Poglavlje 1O Upotreba transakCIJa u lnnouts taoe1ama

Pri korienju najnieg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja- 2. Nedeljivost transakcije znai sledee:
da li su transakcije izolovane i usklaene, pa prema tome, ne kre ACID pravila, i da li
a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava
se uopte moe priati o transakcijama. U ovom reimu rada, transakcije mogu da
b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
itaju izmene koje su druge transakcije nainile a da te izmene jo nisu potvrene
(prenete u bazu podataka). To se zove itanje prljavih podataka (engl. dirty reads) i moe e) transakcije ne utiu jedna na drugu
sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da e sve aktivne niti d) izmene koje su nainile potvrene 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 znai sledee:
uncommitted, upotrebite sledeu komandu: a) se izvravaju sve operacije koje transakcija zahteva ili se nijedna ne izvrava
set transaction isolation level read uncommitted; b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti. e) transakcije ne utiu jedna na drugu
d) izmene koje su nainile potvrene transakcije treba da ostanu trajne
Tabela 10.1 Osobine nivoa izolovanosti transakcija
4. Trajnost transakcije znai sledee:
Prljavi podaci Neponovljivi podaci Fantomski podaci
a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava
Read Uncommitted Mogui Mogui Mogui
b) operacije prebacuju bazu podataka iz jednog usklaenog stanja u drugo
Read Committed Nisu mogui Mogui Mogui
e) transakcije ne utiu jedna na drugu
Repeatable Read Nisu mogui Nisu mogui Mogui (ali malo
verovatni) d) izmene koje su nainile potvrene transakcije treba da ostanu trajne
Serializable Nisu mogui Nsu mogui Nisu mogui 5. U reimu ponovljivog itanja moe se dogoditi da
a) uitate prljave podatke
Saetak b) uitate neponovljive podatke
e) uitate fantomske podatke
Transakcija je grupa SQL upita koja se obrauje kao nedeljiva celina. Izvrava se
u potpunosti ili se ponitava u potpunosti. d) nijedno od prethodnog
Standardna SQL-ova sintaksa za definisa~e transakcije izgleda ovako
start transaction;
# do work
Vebe
commit; Dokumentacija za MySQL/InnoDB sadri mnogo saveta za poboljanje performansi
sistema kada se koriste InnoDB tabele. Primenite to vei broj na svoj sistem.
ali postoji i vie drugih ekvivalentnih naina da se postigne isti rezultat.
Moete poeti od ovog mesta:
ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost,
www.innodb.com/ibman.html#InnoDBTuning
usklaenost, izolovanost i trajnost). Trebalo bi da zapamtite ta ove rei znae
inae drugi zaluenici za raunare nee hteti da razgovaraju s vama. Na serveru koji nije previe vaan za poslovanje firme, sruite MySQL dok ste
Redosledom od najjaeg ka najslabijem, nivoi izolovanosti transakcija su sledei: usred neke transakcije. Nije neophodno da gurnete kuite vrstih diskova s velike
serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u visine, niti da iupate kabi za napajanje iz utinice. Dovoljno je da prekinete rad
Inn o DB tabelama je repeatable read. MySQL-ovog procesa. Pregledajte sadraj dnevnika izmena i posmatrajte ta se dogaa
kada ponovo pokrenete server.

Pitanja
l. Ako je reim autocommit iskljuen, transakcija e biti potvrena
a) kada se izda komanda COMMIT
b) kada se zahteva blokada tabele
e) i a) i b)
d) ni u jednom od navedenih sluajeva
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 sledeem poglavlju
U poglavlju ll razmotriemo MySQL-ov sloen sistem upravljanja pravima korisnika . 11 Upravljanje pravima korisnika
Na raspolaganju je bogat izbor mogunosti za mo koju ete dati korisnicima baze
podataka. U tom poglavlju savladaete postojee opcije i naine na koje se njima 12 Podeavanje MySQL-a
upravlja. 13 Administriranje baze podataka
14 Izrada rezervnih kopija i obnavljanje podataka
15 Zatita MySQL servera
16 Replikovanje baze podataka
11
Upravljanje pravima korisnika

J EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov sloen sistem prava


korisnika. U ovom poglavlju baviemo se pravljenjem korisnikih naloga, pravima
koja su na raspolaganju i nainom na koji su ta prava predstavljena u MySQL-ovim
l<lbelama. Razmotriemo sledee teme:
Pravljenje korisnikih naloga pomou komandi GRANT i REVOKE
Nivoi korisnikih prava
Tabele prava

Pravljenje korisnikih naloga pomou komandi


GRANT i REVOKE
Prava za pristup podacima dodeljuju se korisnikim nalozima pomou komande GRANT,
n ukidaju se pomou komande REVOKE. To su standardne SQL-ove komande koje
moete izvriti na isti nain kao i bilo koju drugu komandu navedenu u ovoj knjizi. Svi
podaci o korisnicima MySQL-a i njihovim pravima pristupa uvaju se u MySQL-ovoj
bazi podataka, potpuno isto kao i podaci s kojima rade aplikacije koje ste vi napravili.
Da biste mogli da izvravate komande koji se pominju u ovom odeljku, potreban
vam je odreen nivo prava za pristup podacima. Ako ste sami instalirali MySQL,
imate pristup nalogu root, pa prema tome i odgovarajui nivo prava. Ako MySQL
koristite na raunaru koji neko drugi administrira (kao to je raunar na poslu ili iznaj-
mljeni raunar), moda nemate odgovarajui nivo prava da biste izvravali te upite.
U tom sluaju, dobiete poruku o greci nalik na sledeu:
ERROR 1045: Access denied for user: 'laura127.0.0.1' (Using pass-
word: YES)

Dodeljivanje prava
Najpre emo razmotriti komandu GRANT, koja omoguava da pravite nove korisnike
naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk-
cija mn. Pogledajte sledei primer:
gran l liU (e
158 Poglavlje 11 Up ravlj anje pravima korisn ika Nivoi prava

Ova komanda fomura nalog za korisnika ije je ime l uke kada on pokua da se pri- Korisnikovu lozinku moete izmeniti ako izdate komandu, na primer,
javi na MySQL server s raunara localhost. Tom nalogu dodeljuje lozinku (re set password for fredlocalhost = password('novalozinka');
lozinka, koju je vrlo teko pogoditi - razume se, vi ete zadati neto bolje!). Re
Da biste to uradili, morate imati pristup bazi podataka mysql.
usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znai da korisnik
Odredba WITH GRANT OPTION je specijalno pravo koje korisniku omoguava da
moe samo da se prijavi na server i nita vie. U odredbi ON zadajemo objekte na koje
svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne moete da dodeljujete
se odnose prava koja dodeljujemo korisniku. Budui 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 sluaju izlina.
gom korisniku ne moete dodeliti pravo koje sami nemate.
Opti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledei:
Odredbu WITH moete upotrebiti i da biste po satu ograniiti broj izvrenih 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 znai da nema ogranienja.
ON {ime_tabele l * l *.* l ime_baze.*}
TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka'] Odredba REQUIRE omoguava da zahtevate da se korisnik prijavljtije iskljuivo
[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ] putem zatiene veze . Da biste mogli daje koristite, moraete da podesite MySQL na
[REQUIRE odgovarajui nain. To emo podrobnije razmotriti u poglavlju 15, "Zatita MySQL
NONE l servera " .
[{SSLI X509}]
[CIPHER nain_ifrovanja [AND]]
[ISSUER davalac_sertifikata [AND]] Nivoi prava
[SUBJECT subjekt]]
[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l Prava koja moete dodeliti pomou komande GRANT dele se u dve osnovne kategorije:
MAX_UPDATES_PER_HOUR # l prava za obine 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
saznaete u narednom odeljku . Neka prava su globalna (odnosno, vae za sve baze Prava za obine korisnike pobrojana su u tabeli 11.1.
podataka na serveru), dok druga vae samo za odreene objekte (baze podataka, tabele
Ta be la 11 .1 Prava za obine korisnike
ili pojedine kolone tabela).
Pravo Zn aenje
U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete.
To moe biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim CREATE Korisniku je dozvoljeno pravljenje tabela.
tabelama (oblik ime_baze. *). Umesto imena objekta, moete 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 brie redove iz tabela.
vae samo za tekuu otvorenu bazu podataka. Ako nije otvorena nijedna baza poda- EXECUTE Korisniku je dozvoljeno da izvrava 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 umee 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 zakljuava tabele.
napraviti. U ovoj odredbi moete zadati vie od jednog korisnika te imena raunara s SELECT Korisniku je dozvoljeno da uitava redove.
kojih se mogu prijavljivati, na primer, fredlocalhost. Ako imate tekoa 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 raunara s kojeg se prijavljujete. Ime MySQL-ovog korisnikog naloga ne mora UPDATE Korisniku je dozvoljeno da aurira 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 moe sadrati najvie 16 znakova. ne moe da radi nita drugo.
Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova
lozinka postojeem korisniku. Prava za administratore
Korisnici mogu da menjaju svoje lozinke pomou komande: U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 .
seL password = password('novalozinka'); Neka meu njima moete dodeliti i odreenim korisnicima, ako procenite da bi to bilo
ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obine korisnike.
.............. ,., ......
Poglavlje 11 Upravljanje pravima korisnika

Pravo pristupa odreenoj tabeli. Dodeljuje se tako to se navede ime te tabele


Tabela 11.2 Prava za administratore u komandi GRANT:
Pravo Znaenje grant select on department to fred;
ALL Korisnik ima sva prava osim WITH GRANT OPTION. Prava pristupa odreenoj 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:
moete dodeliti korisnicima koji imaju dovoljno strunog znanja, ali grant select (employeeiD) on employee to fred;
budite oprezni pri tome jer se moe (zlo)upotrebiti i za promenu
sadraja tabela prava. Kada utvruje da li korisnik ima pravo da izvri odreeni posao, MySQL kombi-
DROP Korisniku je dozvoljeno da brie tabele. Ovo pravo moete dodeliti nuje pomou 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 sadraj druge datoteke. Ovo pravo takoe moete dodeliti
korisnicima u koje imate dovoljno poverenja. Pazite se korisnika Upotreba komande REVOKE
koji pokuavaju da proslede podatke u datoteku koju slobodno Komanda REVOKE suprotna je komandi GRANT i slui za ukidanje prava koja korisnik
izaberu, kao to je /etc/passwd ili slina datoteka! ima. Na primer:
PROCES S Korisniku je dozvoljeno da prikae listu svih procesa- tj. da vidi sve revoke all on employee.* from fred;
tekue procese koje MySQL izvrava.
RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda Opti oblik komande revoke izgleda ovako:
ima vie namena. U nastavku ovog poglavlja razmotriemo REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l
komandu FLUSH PRIVILEGES, a komandom FLUSH baviemo 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 sutini iste kao u komandi GRANT i omoguavaju uki-
REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na danje odgovarajuih prava.
zavisnom serveru.Vie informacija o tome nai ete u poglavlju 16.
SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin
shutdown.Vie informacija o tome nai ete u poglavlju 13. Tabele prava
SUPER Korisniku je dozvoljeno da se prijavljuje na server ak i kada je s Podaci koje menjate pomou komandi GRANT i REVOKE uvaju se u bazi podataka koja
MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih se zove mysql. Umesto pomou komandi GRANT i REVOKE, tabele u toj bazi podataka
veza i moe da izvrava komande CHANGE MASTER, KILL (thread) ,
moete me~ati i direktno, ukoliko tano znate ta treba da uradite. Osim toga,
mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.
podatke iz tih tabela moete i da uitavate da biste lake reili 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 sadraj tih tabela menjate direktno, morate izdati komandu
Postoji jo jedno pravo koje se zove REFERENCES. Rezervisano je za buduu upo- flush privileges;
trebu i mada ga moete dodeljivati, zasad nema nikakvog efekta. da bi izmene poele da vae.
U bazi podataka mysql nalazi se est tabela:
Utvrivanje ukupnih prava user tables_priv
Pomou komande GRANT moete dodeliti prava na etiri nivoa: db columns_priv
Globalna prava koja vae za sve baze podataka na serveru. Zadaju se pomou 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 skladite se podaci koji se tiu funkcija koje korisnici piu, ali to je tema koja
Prava koja vae samo za odreenu 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 utvruje da li imate pravo pri- Tabela db
stupa bazi podataka. Svih pet tabela se koristi kada se utvruje imate li pravo da U ovoj tabeli uvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela
izvrite odreenu komandu. se sastoji od sledeih kolona:
Kolone za opseg vidlj'ivosti Na osnovu njihovog sadraja, MySQL utvruje koji
Tabela user red treba uitati. Ako imate razliita pravila za razliite raunare, ostavite polje
Tabela user sadri podatke o globalnim pravima korisnika. host prazno, a u tabeli host dodajte odgovarajuu grupu redova da biste obezbe-
Ova tabela ima sledee kolone: dili detaljnije podatke. Ovoj grupi pripadaju sledee kolone:
Kolone za opseg vidljivosti Na osnovu sadraja ovih kolona utvruje se koji red Host
treba uitati. Ovoj grupi pripadaju sledee kolone: Db
Host: Ime raunara s kojeg korisnik uspostavlja vezu User
Kolone za prava Njihov sadraj odreuje koja sve prava ima kombinacija Host,
user: Ime korisnika
Db i User. Ove kolone takoe mogu sadrati samo vrednosti Y ili N. Kolone za
Password: Korisnikova lozinka, u formatu ifrovanom pomou funkcije
prava su sledee:
PASSWORD ()
Select_priv Create _pri v
Kolone za prava Svaka kolona odgovara jednom globalnom pravu i moe
sadrati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo- Insert _pr iv Drop_pri v
balno pravo). Ovoj grupi pripadaju sledee 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 pretrauje tabelu host kad god naie na prazno polje u tabeli db. Takvo
Alter_pri v Create_tmp_table_priv
ponaanje ne moete zadati komandom GRANT, ali moete ga runo podesiti. Tabela
Create_priv Lock_tables_priv ima sledee kolone:
Drop _pr iv Execute _pr iv
Kolone za opseg vidljivosti Na osnovu njihovog sadraja, MySQL utvruje koji
Grant _pri v Repl_slave_priv
red treba u itati. Svaki red u ovoj tabeli sadri podatke o jednoj bazi podataka
References _pri v Repl_client_priv kojoj se pristupa s jednog raunara. Ovoj grupi pripadaju sledee kolone:
Reload_priv Host
Kolone za uspostavljanje zatiene veze Odgovaraju podacima koji se zadaju Db
u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju sledee kolone: Kolone za prava Njihov sadraj odreuje koja sve prava ima kombinacija Host i
ssl_type Db. Ove kolone takoe mogu sadrati samo vrednosti Y ili N. Kolone za prava su
ssl_cypher sledee:
x509_issuer Select _pri v Create _pri v
x509_subject Insert_priv Drop_pr iv
Kolone za ograniavanje upotrebe resursa Sadre podatke o eventualnim ogranie Update_priv Grant_priv
njima upotrebe odreenih resursa koje zadajete na kraju komande GRANT. Ovoj
Delete_priv Create_tmp_table_priv
grupi pripadaju sledee kolone:
Index_pr iv Lock_tables_priv
max_questions
Alter_pri v
max_updates
max_ connections
ou-.
Sa ela

Tabela tables_priv Saetak


U tabeli tables_priv uvaju se podaci o pravima koje korisnici imaju za pojedine
tabele. Ova tabela ima sledee kolone:
GRANT i REVOKE
Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U
Komanda GRANT omoguava da korisniku dodelite prava pristupa ili da napravite
ovom sluaju imamo i kolonu Table_name, koja sadri podatke o tabeli na koju
nov korisniki nalog. Format komande je sledei:
se pravo odnosi. Kolone za opseg vidljivosti su sledee:
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 sledee kolone: [{SSLI X509}J
[CIPHER nain_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 moe sadrati MAX_UPDATES_PER_HOUR # l
MAX_CONNECTIONS_PER_HOUR #JJ
jednu iz skupa sledeih vrednosti: Select, Insert, Update, Delete, Create,
Drop, Grant, References, Index i Al ter. Komanda REVOKE ukida prava dodeljena korisniku. Format komande je sledei:
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. Moe sadrati jednu iz skupa sledeih vrednosti: Select, Insert, Update ON {ime_tabele l * l *.* l ime_baze.*)
i References. Ako je ova kolona prazna, MySQL e potraiti u tabeli FROM ime_korisnika [, ime_korisnika ... ]
columns_priv detaljnije podatke o tome ta jeste a ta nije dozvoljeno
u kolonama tekue tabele. Prava
Prava se mogu dodeljivati korisnicima pojedinano.
Tabela columns_priv Ovo su prava namenjena obinim korisnicima:
U tabeli columns _pri v uvaju se podaci o pravima korisnika za pojedine kolone. CREATE LOCK TABLES
Tabela ima sledee kolone:
CREATE TEMPORARY TABLES SELECT
Kolone za opseg vidlj"ivosti Na osnovu njihovog sadraja, MySQL utvruje koji DELETE SHOW DATABASES
red treba uitati. Ovoj grupi pripadaju sledee 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. Moe sadrati jednu iz skupa sle- DROP SHUTDOWN
deih 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 sledeem po!Jiavl u

Tabele prava 5. Podatak u koloni tables_priv.table_priv


Podatke o korisnikim 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 odgovarajui red u tabeli columns_priv
U tabeli db uvaju se podaci o pravima za pojedine baze podataka.
U tabeli host uvaju se podaci o tome kojoj se bazi podataka s kojeg raunara Vebe
moe pristupati.
l. Napiite komandu GRANT koja pravi korisniki nalog bill, ija je lozinka
U tabeli tables _pri v uvaju se podaci o pravima za pojedine tabele.
secret i kome je dozvoljeno da uitava podatke iz tabele department, aurira ih,
U tabeli columns_priv uvaju se podaci o pravima za pojedine kolone dodaje u tabelu i brie iz ~e.
u tabelama.
2. Napiite komandu REVOKE koja ukida prava tog korisnika.

Pitanja Odgovori
l . Pravo GRANT OPTION omoguava korisniku da
a) uitava podatke iz datoteke Pitanja
b) drugima dodeljuje prava koja sam ima l. b
e) se prijavljuje na server, ali nita vie 2. e
d) izdaje komandu FLUSH 3. d
2. Pravo USAGE omoguava korisniku da 4. a
a) uitava podatke iz datoteke 5. a
b) drugima dodeljuje prava koja sam ima
e) se prijavljuje na server, ali nita vie Vebe
d) izdaje komandu FLUSH l.
grant select, update, insert, delete
3. Pravo RELOAD omoguava korisniku da on employee.department
a) uitava podatke iz datoteke to billlocalhost
b) drugima dodeljuje prava koja sam ima identified by 'secret';
2.
e) se prijavljuje na server, ali nita vie
revoke select, update, insert, delete
d) izdaje komandu FLUSH on employee.department
4. Pravo FILE omoguava korisniku da from bill;
a) uitava podatke iz datoteke
b) drugima dodeljuje prava koja sam ima U sledeem poglavlju
e) se prijavljuje na server, ali nita vie U sledeem poglavlju, "Podeavanje MySQL-a", razmotriemo mnogobrojne opcije
d) izdaje komandu FLUSH za podeavanje MySQL-a.
12
Podeavanje MySOL-a

U OVOM POGLAVLJU nadovezujemo se na kratak uvod u podeavanje MySQL-a iz


poglavlja l, "Instaliranje MySQL-a". Razmotriemo razne opcije za podeavanje
MySQL servera, s posebnim osvrtom na internacionalizovanje servera.
Obradiemo sledee teme:

Podeavanje MySQL-ovih konfiguracionih opcija


Konfiguracione opcije za vie servera na istom raunaru
Internacionalizovanje

Podeavanje MySQL-ovih konfiguracionih opcija


Kao to ste iz dosadanjeg itanja ove knjige saznali, mnogi programi za rad s MySQL-
-om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji,
ali u mnogim sluajevima moete ih zadati i u obliku datoteke opcija. U istoj datoteci
opcija moete zadati vrednosti opcija za komandne linije vie programa za rad s
MySQL-om, kao to su mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack.
Prednost upotrebe datoteke opcija jeste to to vam omoguava da na jednom
mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL
podrava i upotrebu zasebnih datoteka opcija koje vae za ceo server i za pojedinane
korisnike.
Reenje s datotekama opcija naroito je pogodno kada upravljate s vie servera.
Ako svi serveri imaju istu konfiguraciju, to je est sluaj kada se primenjuje replika-
vanje, moete koristiti istu konfiguracionu datoteku za svaki server.
Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada emo ih ponovo
razmotriti, ali opirnije. Datoteku ili datoteke opcija nai ete u direktorijumima
navedenim u nastavku teksta.
Kada je MySQL instaliran na Windowsu, datoteku opcija moete smesti ti u sistem-
ski direktoriju m Windowsa i nazvati je my. ini, a moete je smesti ti i u kore nski
din:ktorijulll diska na koji je instaliran server (na primer, C :\) i nazvati my. cnf. To j~:
glob.dn.t d.tlnlt~ .1 opcija tj. vrednosti opcija u njoj vah 1'<1 sve korisnike serv~.:r,t
ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll upnJA
170 Poglavlje 12 Podeavanje MySQL-a

Kada je MySQL instaliran na Unixu, moete imati jednu globalnu datoteku opcija, Na isti nain kao to zadajete opcije za pojedine programe, moete zadati i grup11
po jednu datoteku opcija za svaki MySQL server instaliran na raunaru i po jednu opcija [client], koje e vaiti za sve programe.
datoteku opcija za svakog korisnika. (Na jednom fizikom raunaru moe raditi Redovi koji poinju znakom # su komentari .
istovremeno vie MySQL servera, to je objanjeno u nastavku ovog poglavlja.) Postoje tri oblika sintakse za zadavanje vrednosti opcija:
Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija Moete navesti ime opcije koju elite da ukljuite; na primer:
za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za log-bin
pojedine korisnike nalaze se u matinom direktorijumu svakog korisnika. Imajte u Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.
vidu da imena datoteka opcija za korisnike imaju prefiks taku- tj. ime datoteke je Moete 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
Moete navesti ime opcije i do deli ti joj vrednost pomou sintakse set -vari a-
sintakse za tu vrstu datoteka. Njen sadraj ponovo prikazujemo u listingu 12.1.
ble; na primer:
Listing 12.1 Primer datoteke opcija my.cnf set-variable = innodb_log_buffer_size=BM
Trei oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Poto
[mysqld]
# binarno beleenje i beleenje sporih upita ete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da

log-bin znate ta on znai. Na primer, to je sluaj s primerom datoteke my. cnf, koju
log-slow-queries smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija
za lnnoDB.
# podeavanje za InnoDB tabele
# ovo je osnovna datoteka opcija predloena u dokumentaciji. Neke opcije koje odreuju kako e se koristiti datoteke opcija vae za sve programe:
# Datoteke za podatke treba da omogue --no-defaults znai da nema datoteka opcija iji bi sadraj trebalo uitati.
# skladitenje podataka i indeksa.
# obezbedite dovoljno slobodnog - -print-defaults prikazuje sve vrednosti opcija koje vae za tekui program.
# prostora na disku. --defaults-file=/putanja/do/datoteke nalae programu da koristi zadatu
innodb_data_file_path = ibdatal:lOM:autoextend datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena
# podesite veliinu rezerve za bafere na
konfiguracije.
# so-so% koliine memorije
# na raunaru --defaults-extra-file=/putanja/do/datoteke uitae navedenu datoteku
set-variable = innodb_buffer_pool_size=70M nakon uitavanja globalne datoteke opcija, ali pre uitavanja datoteka opcija za
set-variable = innodb_additional_mem_pool_size=lOM pojedinane korisnike.
# podesite veliinu dnevnika na priblino
# 25% veliine rezerve za bafere Opcije za mnoge programe koje moete podesiti pomou 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 triemo najvanije i najkorisnije opcije za komandnu liniju programa MySQL server.
# podesite .. flush_log_at_trx_commit
# na o ako moete 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 predoi najee koriene opcije
za mysqld. Svaka opcija se moe 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: prilino je dugaka) dobiete ako na komandnoj
[mysqld] liniji otkucate
To znai da su opcije navedene iza ovog reda namenjene programu mysqld. Ako mysqld --help
elite da zadate opcije za drugi program, navedite njegovo ime na poetku grupe
opcija. Imc mora biti napisano unutar uglastih zagrada.
1/2 Pog lavlje 12 Podeavanje MySQL-a

Evo nekoliko korisnih opcija: innodb_additional_mem_pool_size=lOM


Ova opcija odvaja memoriju koja e sluiti za smeta~e MySQL-ovih internih
ansi: Pokree server u reimu kompatibilnosti sa standardom ANSI. U tom slu-
struktura podataka. Ako MySQL- u ponestane ove vrste memorije, poee da
aju, MySQL prihvata samo sintaksu koja je u skladu sa standardom ANSI-99 SQL.
upisuje upozorenja u dnevnik greaka .
basedir: Zadaje kerenski direktorijum instalacije ukoliko elite da server radi innodb_log_file_size=20M
u nestandardnom direktorijumu.
Ova opcija podeava veliinu 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: Ukljuuje binarno beleenje u dnevnik izmena. Moete zadati ime in_group; podrazumevana vrednost je 2 i preporu uje se.
i direktorijum datoteke dnevnika izmena. innodb_log_buffer_size=8M
log-error: Ukljuuje beleenje greaka. Moete zadati ime i direktorijum dato- Ova opcija podeava veliinu bafera u koji sc upisuje dnevnik izmena pre nego
teke dnevnika greaka. to se upie na disk.
log-slow-queries: Ukljuuje beleenje sporih upita. innodb_flush_log_at_trx_commit=l
port: Zadaje TCP prikljuak na kojem server oslukuje. Podrazumeva se Ako ovoj opciji zadate vrednost 1, to znai da se sadraj dnevnika izmena iz
prikljuak broj 3306. bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponaanje.
user: Zadaje ime korisnikog naloga pod kojim MySQL server treba da radi. Kada je ova opcija podeena na vrednost nula, dnevnik se upisuje i prenosi na
disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upi-
Tokom ovog poglavlja razmotriemo jo nekoliko drugih opcija, a to emo uraditi suju u dnevnik kad god potvrdite transakciju, ali se sadraj bafera prazni i upisuje
i u poglavlju 17, "Optimizovanje MySQL Servera". na disk jedanput svake sekunde.Vrednosti o ili 2 poboljavaju performanse, ali
verovatno ne treba da objanjavamo koliko je to rizino.
Opcije za lnnoDB Postoje i druge konfiguracione opcije za InnoDB. Vie informacija o tome nai
U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na eteu MySQL-ovoj dokumentaciji.
InnoDB. Komponentu InnoDB moete koristiti i ako ne zadate izriito vrednosti za
te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sle-
dee opcije:
Konfiguracione opcije za vie instalacija
innodb_data_file_path = ibdatal : lOM:autoextend na istom raunaru
Ova opcija opisuje MySQL-u gde da smeta podatke kojima upravlja InnoDB. esto je korisno omoguiti da vie MySQL servera radi na istom raunaru. Na pri-
Za razliku od My ISAM tabela koje su smetene svaka u svojoj datoteci, InnoDB mer, korisnici dobavljaa Internet usluga mogu imate vlastite instalacije. Ovu odliku
tabele se uvaju u deljenom prostoru za tabele, koji se moe sastojati od jedne ili MySQL-a koristimo kada elimo da polaznicima kursa o MySQL-u omoguimo da
od vie datoteka. U ovom primeru nalaemo MySQL-u da sve InnoDB podatke svako podeava svoj server.
smeta u istu datoteku ije je ime ibdatal, a poetna veliina 10 MB automatski Za svaki server koji pokreete morate zadati razliite vrednosti sledeih opcija za
se poveava (u koracima od po 8 MB) kada se prostor za tabele popuni. mysqld:
Opti format ove opcije je port: Svaki server mora oslukivati na drugom TCP prikljuku.

imedatoteke : veliina [; imedatoteke:veliina; .. . ] [ :autoex- socket: Na Unixu, svaki server mora koristiti drugu datoteku utinice. Na
tend [:max: veliina]] Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server
Opcija autoextend omoguava da se veliina prostora za tabele poveava prema koristi. U oba sluaja, vrednost opcije socket mora biti razliita za svaki server.
potrebama. Opcija max omoguava da zadate maksimalnu veliinu do koje dato- shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti
teka moe 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 podeava veliinu 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 vea,
Opcije za beleenje podataka u dnevnike izmena: Ako zadate vrednost bilo koje
to bolja- omoguava manje direktnih pristupa disku . Koliko ete memorije
opcije koja se odnosi na datoteke dnevnika, za svaki server moractc da zadatl~
odvojiti za rezervu bafera zavisie od toga da li na serveru ima i drugih aplikacija 1h 111-1i direktorij um za datoteke dnevnika.
i kmisnik.l, ali i ml koliine memorijl' s kojo111 raspolaete.
1 14 Poglavlje 12 Podeavanje MyS UL-a

Jednostavan nain da to postignete jeste da opciji basedir dodelite razliitu vred- Sintaksa datoteke poinje imenom programa izmeu 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 poinju znakom ll. Sv.d.;,1
razliiti. Toplo preporuujemo da svaki server ima svoj direktorijum data, tako izbe- opcija moe se zadati u obliku opcija, opcija=vrednost, ili set-variabl
gavate razne neprijatnosti. opcija=vrednost.
Opcija --defaults-fileje veoma korisnajer omoguava da se svaki server Listu svih opcija za program mysqld moete dobiti pomou komande mysqlcl
pokrene s razliitim skupom podrazumevanih vrednosti opcija (ili da se svaki server --help.
instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija). Vie MySQL servera moe raditi na istoj maini u isto vreme, pod uslovom da
Vano je da zapamtite sledee: kada na istom raunaru radi vie 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 razliite brojeve TCP prikljuka, utinica i datoteka dnevnika.
qladmin, morate zadati server s kojim treba da se poveu. U takvim situacijama moe
U datoteci opcija moete zadati podrazumevani skup znakova i jezikih pravila
biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u
koja e vaiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola .
kojoj ete zadati odgovarajui broj TCP prikljuka- tako korisniku omoguavate da
Jezika pravila odreuju redosled sortiranja.
automatski uspostavi vezu sa svojim serverom.

lnternacionalizovanje Pitanja
l. Opcija --no-defaults za mysqld znai
Postoje dve opcije za mysqld koje omoguavaju da se zada podrazumevani skup zna-
kova i jezikih pravila. Skup znakova je skup simbola koji se moe koristiti na serveru. a) ne vae podrazumevane vrednosti, ve samo vrednosti zadate u datoteci
Jezika pravila odreuju nain na koji se parede nizovi znakova iz tog skupa- ime se opcija
odreuje i redosled sortiranja- to zavisi od govornog jezika. b) ne uitavati nita iz datoteka opcija
Podrazumevani skup znakova moete zadati pomou opcije --default -charac- e) uitati vrednosti samo iz globalnih datoteka opcija
ter-set. Svakom skupu znakova pridruen je i podrazumevani skup jezikih pravila, d) nijedno od prethodnih
ali moete zadati i neki drugi pomou opcije --default-collation option. Ako
2. Opcija za Inn oD B koja podeava veliinu prostora za tabele je
kombinacija skupa znakova i skupa jezikih pravila nije ispravna, mysqld e prikazati
a) innodb_buffer_pool_size
poruku o greci.
Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup b) innodb_data_file_path
jezikih pravila latinl_swedish_ci. Taj skup znakova se takoe oznaava kao IS0- e) innodb_log_buffer_size
-8859-1 West European. Jezika pravila latinl_swedish_ci odreuju 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 podeava veliinu bafera za podatke je
(Moda niste znali da za rei napisane istim slovima vae razliita pravila sortiranja u a) innodb_buffer_pool_size
razliitim jezicima.) Postoje i jezika pravila koja se mogu pridruiti skupu znakova
b) innodb_data_file_path
latinl koja opisuju kako se sortira tekst na nemakom, danskom i norvekom jeziku.
Vie informacija o skupovima znakova koje MySQL podrava, naroito ako vas e) innodb_log_buffer_size
z~nima ba odreeni skup, potraite u MySQL-ovoj dokumentaciji. d) nijedna od prethodnih
4. Kada vie servera radi na istom raunaru, nUe neophodno da sledei elementi
budu odvojeni:
Saetak
a) datoteke dnevnika
MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,
b) TCP prikljuci
mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack
podravaju upotrebu zajednikih datoteka opcija. e) utinice
Opcije moete podesiti tako da vae na globalnom nivou, na nivou pojedina d) klijentski programi
nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.
~G Poglavlje 12 Podeavanje MySOL-a

S. ta je od sledeeg tano?
a) Jedan skup jezikih pravila moe se pridruiti samo jednom skupu znakova.
b) Jedan skup jezikih pravila moe se pridruiti svakom skupu znakova.
e) Jednom skupu znakova moe se pridruiti samo jedan skup jezikih pravila.
d) Nijedno od prethodnih.
1
Vebe Administriranje baze podataka
Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj raunar. Podesite sistem
tako da imate i tekuu i stariju verziju servera koje rade na istom fizikom raunaru
Pokuajte da uspostavite vezu sa obe verzije. .

Odgovori
Pitanja
u OVOM POGLAVLJU RAZMOTRIEMO uobiajeneposlove koji su neophodni za
upravljanje MySQL-ovom bazom podataka. To obuhvata sledee aktivnosti:
l. b Pokretanje i sputanje srevera
2. b Prikazivanje podataka o serveru i bazama podataka na njemu
3. a Podeavanje serverskih promenljivih
4. d Unitavanje niti
S. a Pranjenje ostava
Analiziranje tabela
U sledeem poglavlju Pregledanje datoteka dnevnika izmena

U sledeem poglavlju, "Administriranje baze podataka", razmotriemo uobiajene Mada prvenstveno objanjava poslove koje treba da obavlja administrator baze
t svakodnevne poslove odravanja koje treba obavljati u MySQL-ovoj bazi podataka.
podataka, ovo poglavlje opisuje i jedan vaan skript, mysqladmin, koji omoguava da
automatizujete neke od tih poslova.
Zadavanjem odgovarajuih parametara, skript mysqladmin se moe upotrebiti za
obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja nai ete
njihov spisak.
U ovom poglavlju razmotriemo i upotrebu skriptova mysqlshow i mysqlcheck, te
SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.

Pokretanje i sputanje MySQL servera


Kao to smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server ete naj-
verovatnije podesiti tako da se automatski pokree zajedno sa operativnim sistemom.
Meutim, postoje situacije u kojima ete morati da spustite, pa da ponovo pokrenete
server jer je dolo do greke.
Ve smo objasnili kako se pokree MySQL server. Nain na koji ete to uraditi
zavisi od vaeg operativnog sistema, sadraja standardnih putanja i opcija koje ste
izabrali kada ste instalirali MySQL server. Na Linuxu, server moete pokrenuti
pomou komande

/t Lc/lnit ,d/ mysqld start


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

ali samo ako imate kopiju izvrne datoteke mysqld u direktorijumu koji se podrazu-
meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraete da
zadate tanu putanju. Vie informacija o tome nai ete u poglavlju l. Server moete
pokrenuti i pomou skripta
safe_mysqld
Ovaj skript najpre pokuava da automatski odredi odgovar~ue opcije za pokre- 1'1-0Yidosn..,
~o ...
.......
........ toc~
Locd~~Sys;t~

tanje MySQL-a, a zatim pokree MySQL s tim opcijama.Ako skript nije na vaoj (alecb ..... ..
~'- '"""""'
Lout5o,ostem

podrazumevanoj putanji, moraete 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 mogunosti. Moete izdati loadJNe. ... Stted
l'rl;wlcle$p . . Stted ............- "..,
Locals-,.tem
LCIUIISyod:em
komandu ........ """""-
Crut
Mlnoqei: ...
5tted
....... Loct/Sysl:.-!1
LQ(also,stem
/etc/init.d/mysqld stop
ili
PnNidest ...
~t

ENbletrl ...
...
Stttd .........
.........
.........
"""-
Net.-lo.S ...

,....
lCIUIISerw;

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

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

.....
5lted

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


Loul System
"._

Razume se, moete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je
J~W~eoet:e ...
fNtllessu .. .
Stt..:l
....... Loul Sylt. .

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

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

sputanja servera.
Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji
nain da pokrenete bilo koji servis jeste da otvorite Control Panel i preete u 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 (sputanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao to je
prikazano na slici 13.1. (Poto je ovo ekranska slika iz Windowsa XP Professional, sadraj
vaeg ekrana e se moda malo razlikovati, to zavisi od verzije operativnog sistema.) Kao i veinu skriptova koji se pokreu s komandne linije, skript mysqlshow moete
Server moete spustiti i pomou skripta mysqladmin za Linux, na opisani nain. pokrenuti s parametrom -u kojem sledi ime korisnikog naloga, i parametrom -p,
kojim se prosleuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate
mysqlshow --help
Prikazivanje podataka o serveru i bazama podataka
prikazaese lista svih opcija na raspolaganju.
na nJemu Jedna od njih omoguava da zadate ime baze podataka da biste prikazali podatke
Skript mysqlshow i SQL-ova komanda SHOW pruaju vam, kao administratoru, puno samo o odreenoj 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. sledeem obliku, prikazae se lista tabela u toj bazi podataka:

mysqlshow -u ime_korisnika -p ime_baze


Prikazivanje podataka o bazama podataka
Skript mysqlshow prikazuje podatke o bazama podataka. Ako ga pokrenete bez para- Ako na kraj ovog reda dodate i parametar --status, dobiete detaljnije podatke
metara, na sledei nain: o tabelama. Isprobajte to na bazi podataka employee, na sledei nain:
mysqlshow mysqlshow -u imekorisnika --status employee

prikazae se lista baza podataka u koje vam je dozvoljen pristup pod vaim tekuim Rezultati su malo tee itljivi zbog dugakih redova, ali se za svaku tabelu prika-
korisnikim nalogom. Rezultat je isti kao kada zada te zuju podaci o maini za skladitenje podataka koja se koristi, koliini podataka u tabeli,
tekuoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci
show databases;
o skupu znakova koji vai za tabelu.
u programu mysql ili u nekom drugom korisnikom interfejsu.
l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'-- - - ..,._"_,.._. .,,.,_. r----~---- -''l "'
l tlU

Podatke o bazi podataka i stanju servera moete pribaviti i pomou SQL-ove Vrednosti veine serverskih promenljivih moete zadati u konfigur a<:tonoj datoteci,
komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre- na komandnoj liniji kada pokreete server ili dinamiki, unutar MySQL ,t, ponto u
balo da ve znate da izdate komande kon1ande SET. Podeavanje servera opisano je u poglavlju 12",Podeavanjc MyS(~J .t'',
a upotreba komande SET opisana je u nastavku ovog poglavlja.
show databases;

Prikazivanje podataka o procesima


show tables; Koji su sve procesi aktivni na serveru moete videti ako unutar MySQL-a izdate sle-
da biste prikazali podatke o bazama podataka i tabelama u njima. Meutim, komanda deu komandu:
SHOW ima veliki broj drugih opcija koje moete iskoristiti. show processlist;
Na primer, zadajte Prikazae se podaci barem o upitu koji ste upravo poslali (show processlist).
show columns from ime_tabele; Iste podatke moete dobiti i s komandne linije, ako zadate
da biste dobili iste podatke kao pomou komande DESC. Slino tome, moete zadati mysqladmin -u imekorisnika -p showprocesslist
show table status
da biste dobili iste podatke kao pomou skripta mysqlshow --status.
Prikazivanje podataka o dodeljenim pravima
Koja su sve prava dodeljena odreenom korisniku moete saznati pomou sledee
komande
Prikazivanje statusa servera i vredn..asti serverskih promenljivih
Da biste dobili podatke o !l!!rveru i nainu na koji radi, pogledajte status servera i vred- show grants for imekorisnika@imeraunara;
nosti serverskih promenljivih Rezultat je izraen u obliku komande GRANT pomou koje moete zadati drugom
Da biste saznali kakav je tekui-sta~us MY_SQL-a, moete izdati komandu korisniku ista prava kao tekui korisnik. Na primer,
SHOW STATUS mysql> show grants for root@localhost;
unutar MySQL-a, ili komandu na mom sistemu daje sledee rezultate:
mysqladmin -u imekorisnika -p -extended-status +--------------------------------------------------------------------+
na komandnoj liniji. l Grants for root@localhost l
+--------------------------------------------------------------------+
Time ete dobiti veu koliinu statistikih podataka o tome ta se sve dogaalo na l GRANT ALL PRIVILEGES ON* * TO 'root'@'localhost' WITH GRANT OPTION!
serveru od trenutka pokretanja. Moe vas zanimati da pogledate vrednosti svih pro- +--------------------------------------------------------------------+
menljivih ije ime poinje s com_*- na primer, promenljiva com_ select pokazuje l row in set (0.40 sec)
koliko je server izvrio komandi select. Moete se podsetiti i koja sve prava postoje ako zadate
Ovo su neke od najzanimljivijih vrednosti:
show privileges;
threads_connected: Broj otvorenih i aktivnih veza izmeu korisnika i servera.
Time ete prikazati spisak svih prava koja postoje u sistemu.
slow_queries: Ukupan broj upita koje je server izvrio i ije je izvravanje trajalo
due od granine vrednosti zadate u serverskoj promenljivoj long_query_time. Prikazivanje sistemskih podataka o tabelama
Ti upiti se belee u dnevnik sporih upita (Slow Query Log). Sporim upitima Saznaete koji se sve tipovi tabela mogu koristiti u sistemu ako zadate
baviemo se vie 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 odreenu tabelu
Da biste videli vrednosti serverskih promenljivih, moete 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 nain kao komanda FLUSH. Na primer, moete
dobiete sledei 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 nai ete u
TYPE=InnoDB CHARSET=latinl MySQL-ovoj dokumentaciji.
(Obratite panju na to da su, za svaki sluaj, imena ko~ona napisa~:. izmeu polu-
navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada
smo napravili tabel u).
Datoteke dnevnika
MySQL odrava vie datoteka dnevnika koje mogu biti korisne. Budui da beleenje
u veinu tih datoteka dnevnika nije ukljueno u standardnoj konfiguraciji servera,
Podeavanje serverskih promenljivih .. . . to ete morati sami da uinite. Svaki dnevnik se aktivira pomou opcije zadate na
Komanda SET omoguava da zadajete vrednosti serverskih promenljlVlh - koje ste komandnoj liniji pri pokretanju servera ili pomou komande set.
mogli da vidite pomou komande show variables. Sintaksa komande izgleda ovako: Moete odravati sledee dnevnike:
set promenljiva=vrednost; Dnevnik greaka (engl. Error log): tu se belee sve greke nastale pri radu servera.
Na primer, moete 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. Moete je smestiti i u neki drugi direktorij um, koji morate navesti u
Time se ukljuuje bezbedno auriranje podataka (isto se postie 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 koristiemo esto kada budemo dosh do opt1m1zovanp servera u Dnevnik upita (engl. Query log): tu se belee svi upiti koji se izvravaju u sistemu.
poglavlju 17 ",Optimizovanje MySQL Servera". Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku
pomou opcije log=imedatoteke.

Dnevnik izmena (engl. Binary log): tu se belee rezultati svih upita koji menjaju
Unitavanje niti . podatke. Ovaj dnevnik zamenjuje nekadanji 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
omoguava da vidite koje se sve niti izvravaju na serveru. Izmeu ostalog, komanda moete aktivirati i zadati direktorijum za njegovu datoteku pomou 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.rava "celu vecnos: ih klljentskl pro-
Dnevnik sporih upita (engl. Slow query log): tu se belee svi upiti ije izvravanje
gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande
traje due od vremena zadat og u promenljivoj long_query_t ime. Ovaj dnevnik
kill id_procesa; moete aktivirati i zadati direktorijum za njegovu datoteku pomou opcije
log-slow-queries=imedatoteke
Pranjenje ostava v . . ,
Svi navedeni dnevnici, osim dnevnika izmena, obine su tekstualne datoteke.
MySQL koristi pri radu grupu internih ostava (keova), koje m.ozete 1spra~mt1 pom~cu Sadraj dnevnika izmena moete videti pomou komande
komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno mysqlbinlog logfile
izmenili sadraj tabela prava, te izn1.ene e poeti da vae u celom sistemu tek kad izdate
Upotrebu dnevnika sporih upita razmotriemo u poglavlju 19.
komandu: Poto veliina datoteka dnevnika raste, trebalo bi da ih ciklino zamenjujete dru -
flush privileges; gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te
Druga esta upotreba komande FLUSHjeste pranjenje bafera za upite: koji formira grupu datoteka za ciklinu upotrebu.
(lush query cache;
Time ete defragmentirati bafer za upite, ime se poboljavaju performanse.
R4 Poglavlje 13 Administriranje baze podataka

Ako koristite neki drugi operativni sistem, stare datoteke dnevnika moete runo Vrednosti serverskih promenljivih moete zadati pomou konlalhh
premestiti na bezbedno mesto a zatim naloiti MySQL-u da zapone upisivanje u menlj iva=vrednost;.
novu datoteku dnevnika, pomou sledee komande Listu aktivnih niti moete prikazati pomou komande show proceoo l l t 1 1 11
mysqladmin flush-logs moete unititi pomou komande kill id_procesa.
Ostave se prazne pomou komandi FLUSH i RESET.
Opcije za skript mysqladmin Brzinu upita u kojima se spajaju tabele moete poveati pomou komandl" 111,
Za skript mysqladmin postoje mnogobrojne, manje ili vie korisne opcije. lyze table ime_tabele; .
Neki poslovi, kao to je pravljenje i brisanje baza podataka, mogu se obaviti MySQL belei podatke u dnevnik greaka, dnevnik upita (svi upiti), dnevnik
pomou SQL-ovih komandi ili pomou skripta mysqladmin:
izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti ije izvrava liJI'
mysqladmin create databasename traje due nego to je zadato upromenljivoj long_query_time).
mysqladmin drop databasename
Skript mysqladmin se esto upotrebljava za prikazivanje podataka o serveru i Pitanja
njegovom. tekuem stanju. Podatak moe biti bilo ta u opsegu od vrlo jednostavnog, 1. Koji su od sledeih dnevnika standardno aktivni?
npr. "Da li server radi?'' (ping), do neeg 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 greaka
Da biste saznali da li server uopte radi, zadajte sledee:
d) dnevnik izmena
mysqladmin ping
e) svi prethodni
Da biste saznali koja je verzija softvera za MySQL server instalirana na raunaru,
2. SQL-ova komanda SHOW moe se upotrebiti za prikazivanje
zadajte sledee:
a) liste svih baza podataka na serveru
mysqladmin version
b) liste svih tabela u odreenoj bazi podataka
Da biste prikazali kratak ili dugaak opis statusa servera, zadajte sledee:
e) liste svih kolona u odreenoj tabeli
mysqladmin status
d) svega prethodnog
mysqladmin extended-status
3. Skript mysqladmin moe se upotrebiti za
Da biste prikazali listu aktivnih niti na serveru, zadajte sledee:
a) uitavanje prava nakon izmena da bi se obezbedile da izmene ponu da
mysqladmin processlist
vae
Ako se prikae lista procesa (niti), neeljene niti moete unititi na sledei nain:
b) prikazivanje tekueg statusa servera
mysqladmin kill idl,id2,id3 ... e) sputanje i pokretanje servera
Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte sledee: d) zatvaranje i ponovno otvaranje datoteka dnevnika
mysqladmin variables e) sve prethodno

Saetak Vebe
Server se moe pokrenuti pomou skripta mysqladmin, pokretanjem izvrne Aktivirajte sva etiri dnevnika. Poto izvrite vie upita, pregledajte sadraje dnevnika .
datoteke mysqld, ili pomou Windowsove alatke Services manager. Ako nemate pristup veoj bazi podataka, moda neete postii da se neto upie u
Server se moe spustiti pomou komande mysql. server stop ili pomou dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .
skripta mysqladmin shutdown .
Komanda mysqlshow omoguava prikazivanje podataka o tekuoj bazi ili
o MySQL serveru .
186 Poglavlje 13 Administriranje baze podataka

Odgovori
Pitanja
l. e
2. d
3. e
Izrada rezervnih kopiJ
U sledeem poglavlju
U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objanjavamo izradu
i obnavljanje podatak
rezervnih kopija baza podataka i ta treba uraditi kad neto krene naopako.

u OVOM POGLAVLJU RAZMOTRIEMO


se one mogu preneti na drugi raunar
KAKO SE prave kopije baze podataka, bko
i kako se podaci obnavljaju kada neto krene
naopako.
Obradiemo sledee 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 moete initi i radi
replikovanja baze podataka ili prelaska na drugi raunar.
Rezervnu kopiju MySQL-ove baze podataka moete napraviti na etiri naina:
Pomou skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj.
datoteku koja sadri sve SQL komande koji su neophodne da biste obnovili
tekue stanje baze podataka.
Pomou skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript
direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.
Sami direktno napravite obinu kopiju datoteka s podacima. Time zapravo runo
radite ono to skript mysqlhotcopy radi. Ako se opredeli te za ovu mogunost,
moraete da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da
zakljuate tabele da biste obezbedili da podaci u njima ostanu meusobno uskla
eni. Poto skriptovi mysqldump i mysqlhotcopy prazne ostave i zakljuavaj u
tabele umesto vas, oni su bezbednije reenje .
Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne
koptjt :tadatc tabele ili grupe tabela.
188 Poglavlje 14 lzraaa rezervnih Koplja 1 oonaviJanje poaataKa ILiaUO 1\..L\..1 VIlli l "VtJIJU t VVIIU"IJUIIJ'- t-'vuu .. uou.o ,.....,,,,._..._ _ _.._,, ..... .,_ ,,, , - , . - --..-

Objasniemo redom sve navedene mogunosti. hours float default NULL,


Ako je izrada rezervnih kopija od kljune vanosti, imajte u vidu da se za vreme tog PRIMARY KEY (clientiD,employeeiD,workdate)
TYPE=InnoDB CHARSET=latinl;
postupka korisnicima spreava pristup podacima. Zbog ega? Da bi se napravila uskla-
ena kopija stanja baze podataka, baferi tabela moraju se isprazniti a tekui sadraj Dumping data for table 'assignment'
tabela mora ostati nepromenjen dok traje kopiranje. To se moe obezbediti zakljuava
njem tabela (u veini sluajeva) ili iskljuivanjem servera iz upotrebe (to se ne prepo-
ruuje), ali u oba sluaja pristup bazi podataka nee 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 reenje problema jeste replikovanje. Jedan od zavisnih servera moete iskljuiti -01-20' ,8.5);
iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju UNLOCK TABLES;
svoje uobiajene 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
pomou skripta mysqldump
Najuobiajeniji nain izrade rezervnih kopija baze podataka jeste pomou 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 sadri sve SQL komande clientiD int(ll) NOT NULL auto_increment,
name varchar(40) default NULL,
potrebne za rekonstruisanje tekueg stanja baze podataka. address varchar(lOO) default NULL,
Tipian 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 grupie 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, dobiete rezultu- Dumping data for table 'client'
juu datoteku iji e sadraj 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 moete da rekonstruiete na drugom raunaru ako uradite
departmentiD int(ll) NOT NULL default '0',
sledee:
PRIMARY KEY (employeeiD)
TYPE=InnoDB CHARSET=latinl; l. Napravite bazu podataka sa odgovarajuim imenom na ciljnom raunaru.
2. Uitate ovu datoteku pomou komande
mysql -u imekorisnika -p < backup.sql
Dumping data for table 'employee'
Skript mysqldump ima vie opcija koje moete upotrebiti. U ovom sluaju zadali
smo --opt, koja grupie sledee opcije:
/*!40000 ALTER TABLE employee DISABLE KEYS */;
LOCK TABLES employee WRITE; --quick: Nalae MySQL-u da podatke upisuje direktno u datoteku, umesto da
INSERT INTO employee ih prethodno upie u memorijski bafer (to je standardni nain rada).Time se
VALUES postupak kopiranja ubrzava.
(6651, 'Ajay Patel', 'Programmer',128),
--add-drop-table: Nalae MySQL-u da ispred svake komande CREATE TABLE
(7513, 'Nora Edwards', 'Programmer',128),
(9006, 'Candy Burnett', 'Systems Administrator',128), u rezultujuoj 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 rezultujuoj datoteci.
UNLOCK TABLES;
/140000 ALTER TABLE employee ENABLE KEYS */; --extended- insert: Nalae MySQL-u da koristi sintaksni oblik s vie redova da
bijednom komandom INSERT uneo vie zapisa u tabelu. Na primer, u listingu to
izgleda ovako:
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 pomou ove datoteke ponovo formirate bazu podataka i njen Ovaj skript se pokree na sledei nain:
sadraj, postupak e biti bri nego kada zadate niz pojedinanih komandi INSERT. mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum
--lock-tables: Nalae MySQL-u da zakljua sve tabele pre nego to zapone
Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn
izradu datoteke slike stanja. je sigurno da negde imate i izvrnu datoteku perl. Ukoliko imate Windows, morale
Imajte u vidu da opcija --opt (koja znai optimizovati) optimizuje vreme potrebno instalirati Perl da biste mogli da koristite ovaj skript. Ako ga jo nemate, moete p rl'
za rekonstruisanje baze podataka pomou 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 moe biti prilino spor. www.activestate.com/Products/ActivePerl
Evo jo nekoliko korisnih opcija:
Datoteke koje pravi skript mysqlhotcopy identine su kopije datoteka baze poda
--databases: Omoguava da zadate vie 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: Nalae 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- Runa izrada rezervnih kopija i obnavljanje podataka
sane rei MySQL-a (ili onima koje u budunosti mogu postati rezervisane rei), Umesto skripta mysqlhotcopy, moete i sami runo uraditi sve to taj skript radi. To
ova opcija nalae MySQL-u da svakom imenu kolone pridrui i ime tabele kojoj podrazumeva pranjenje bafera, zakljuavanje tabela i kopiranje datoteka s podacima
kolona pripada. u odredini direktorij um, pri emu tabele moraju biti zakljuane.
-d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog To znai da morate otvoriti novu sesiju na MySQL serveru. Moete najpre izdati
sadraja. To je veoma korisno kada testirate baze podataka ili ih instalirate na komandu LOCK TABLES da biste zakljuali sve tabele za koje nameravate da napravite
druge raunare. rezervne kopije:
lock tables
Prednosti skripta mysqldump jesu u tome to se jednostavno upotrebljava i auto-
employee read,
matski reava problem zakljuavanja tabela umesto vas. department read,
Meutim, ima i nekoliko nedostataka. Prvi je to to skript zakljuava tabele: kada client read,
skript pokrenete na serveru, korisnicima spreavate pristup tokom vie sekundi ili ak assignment read,
minuta, to zavisi od veliine tabela. Ako planirate izradu slike stanja na serveru koji se employeeSkills read;
ne replikuje, trebalo bi da pokuate da taj postupak obavite u vreme manje opteree Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju posta-
nosti sistema da ne biste previe ometali korisnike. Ako u svako doba dana imate velike vljate, READ ili WRITE. Za izradu rezervnih kopija obino je dovoljna blokada tipa
koliine podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi nain READ. To znai da druge niti (otvorene veze sa serverom) mogu neometano da itaju
izrade rezervnih kopija. tabele ali ne mogu nita da menjaju u njima dok traje postupak kopiranja.
Drugi nedostatak je sledea injenica: poto skript mysqldump za svoj rad koristi Zakljuavanje tabela je vano u ovakvim situacijama jer kopiranje moe da potraje
MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript prilino dugo. U naem primeru baze podataka employee, bilo bi veoma nezgodno da
mysqlhotcopy ne zavisi mnogo od MySQL servera, ve se pri svom radu obraa nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbrie
direktno sistemu datoteka na raunaru. sve zaposlene iz neke slube, a zatim izbrie i samu slubu. Rezultat bi bio neusklaena
kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojeoj slubi.
Izrada rezervne kopije i obnavljanje baze podataka Sledei korak je izdavanje komande FLUSH TABLES:
pomou 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 moete
datoteke baze podataka, umesto da uitava podatke preko veze koju uspostavi sa serve-
kombinovati s prethodnim pomou sledee komande:
rom. On se povezuje sa serverom da bi ispraznio bafere tabela i zakljuao tabele, ali
budui da komunicira sa sistemom datoteka na raunaru i ne izvrava upite na serveru, flush tables with read lock;
trebalo bi da bude neto bri od skripta mysqldump. Sada moete zapoeti kopiranje datoteka s podacima.Veoma je vano da vaa sesija
(u kojoj ste zakljuali tabele i ispraznili njihove bafere) ostane otvorena tokom celog
I!J4 PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka O O-' -- O --- .-e...._.....,_____

postupka jer e tako blokade koje ste postavili biti odrane. Kada zatvorite tu sesiju, Korisno je da pregledate tu listu pre nego to ponovo izvrite upite ev1dclllll.lll
tabele e biti osloboene. u dnevniku jer neke meu njima moda neete ele ti da izvrite. Mogue je d.1 \l
Kada zavrite kopiranje, trebalo bi da oslobodite tabele: zbog loe osmiljenog 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 moete obnoviti Na primer, imali smo sluaj da je program er zadao upit nalik na sledei
iz kopija na isti nain kao da ste kopije napravili pomou tog skripta. update user set password='password';
Jasno je da kada obnavljate tabelu, ne biste eleli da se ovakav upit ponovo izvri
Izrada rezervni h kop ija i ob navljanj e podataka pomou 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
moete postii i pomou 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 vano da je
Rezervnu kopiju MyiSAM tabele moete napraviti na sledei nain: testirate ili, tanije reeno, 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 paljivo razmotriti kada analizirate rizike
sledeem primeru: ' i odluujete o tome ta ete raditi. Gde ete tano smestiti datoteke rezervnih kopija
backup table tl to 'c:/putanja/do/kopije'; da bi bile na drugom fizikom disku? Kako ete obezbediti da rezervna kopija ostane
Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM neoteena na udaljenoj lokaciji gde je uvate? Ako donesete odgovarajue odluke

tabela. Tabela se automatski zakljuava tako da bude dozvoljeno samo itanje i pravi se na osnovu ovih pitanja i ponete da pravite rezervne kopije u redovnim vremenskim
njena kopija. razmacima, nema razloga da brinete da li e te kopije biti upotrebljive. Ukoliko resta-
Moete zadati i listu imena tabela razdvojenih zarezima; meutim, u tom sluaju se urirate bazu podataka kao vebu, moete otkriti eventualne probleme pre nego to
tabele zakljuavaju i kopiraju jedna za drugom.Ako elite da podaci u svim navedenim postanu nereivi.
tabelama budu meusobno usklaeni, izdajte najpre komandu LOCK TABLES (pogle- Izuzetno vaan element pri instaliranju MySQL-a, kao i za postupak obnavljanja
dajte prethodni odeljak, "Runa izrada rezervnih kopija i obnavljanje podataka") . podataka, jeste da ukljuite beleenje izmena u dnevnik izmena. Taj dnevnik stan-
Da biste iz rezervne kopije obnovili tabelu, izdajte sledeu komandu: dardno nije aktivan, ali je neophodan za dovoenje res ta urirane baze podataka u
poslednje ispravno stanje.
restore table tl from 'c:/tmp';
Rezultat e biti uspean samo ako tabele koje obnavljate ne postoje u tekuoj bazi
podataka. Ako ve imate tabel u sa istim imenom, morate je prethodno izbrisati Proveravanje i popravljanje tabela
komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE. Proveravanje da li su tabele oteene, deo je standardnog postupka odravanja tabela
Komanda RESTORE takoe deluje samo na MyiSAM tabele. a deo je i postupka restauriranja baze nakon katastrofalne greke, na primer, u sluaju
prekida napajanja raunara .
Restauriranje podataka iz dnevnika izmena U MySQL-u postoje tri naina da proverite ispravnost tabela: pomou komande
l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo esto se deava da korisici CHECK TABLE, pomou skripta myisamchk (ili isamchk) i pomou skripta mysql-
dodaju nove podatke i auriraju postojee nakon izrade poslednje rezervne kopije. check.Tabele u kojima otkrijete problem moete popraviti pomou komande REPAIR
U tom sluaju se stanje baze podataka moe restaurirati iz rezervnih kopija na jedan TABLE ili takoe pomou skripta myisamchk (ili isamchk) ili mysqlcheck.
od na ina opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve Kada razmatrate koju ete mogunost primeniti, trebalo bi da imate u vidu sledeih
i;-mene nainjene nakon izrade rezervne kopije. nekoliko injenica. Komande CHECK i REPAIR moete izdati iz samog MySQL-a, dok sc
Tc izmene se uvaju u dnevniku izmena (engl. binary log), to ga ini izuzetno druge mogunosti mogu primeniti samo s komandne linije. Komande CHECK i REPAIR
va7n im . Listu izvrenih operacija moete u itati iz dnevnika izme na pomou 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 izvui e vas iz neprilika u koje ste
Bolje je da spustite server pre nego to pokrenete jedan od tih skriptova, ali ako je moda upali. Za program myisamchk takoe vai da se ne sme pokrenuti dok se server
neophodno, moete i zakljuati tabele. Ako te skriptove pokrenete za tabele s kojima jo koristi. Bezbednije je da ga spustite.
u isto vreme moda rade druge MySQL-ove niti, podaci se mogu otetiti. Komande Najjednostavniji nain 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
Razmotriemo redom navedene alatke. Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smetena
MyiSAM tabela.
Proveravanje i popravljanje tabela pomou komandi CHECK i REPAIR Ovaj program prikazuje podatke o praktino svim moguim grekama do kojih
Ispravnost tabele moete proveriti pomou komande CHECK TABLE, kao u ovom moe doi.Ako vam se ini da ne uspeva da rei va problem, pokuajte da ga pokrenete
primeru: sa opcijom -m. Standardno ponaanje je da progran1 ispituje da li su indeksi oteeni;
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 omoguava i ispravljanje otkrivenih greaka. Tako se moe ispra-
Trebalo bi da dobijete rezultat nalik na sledei (ako je sve u redu): viti velika veina greaka do kojih dolazi u MyiSAM tabelama. Program myisamchk
moete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u sledeem primeru:
+---------------------+-------+----------+----------+
l Table l Op Msg_type Msg_text l l l
myisamchk -q -r tabela
+---------------------+-------+----------+----------+ Ako je rezultat neuspean, napravite rezervnu kopiju datoteke s podacima a zatim
l employee.department l check l status l OK
pokuajte potpuno obnavljanje tabele:
+---------------------+-------+----------+----------+
l row in set (0.00 sec) myisamchk -r tabela
Moe se pojaviti i poruka Table is already up to date, koja takoe znai da je Ako i to bude bezuspeno, pokuajte opciju --s af e- recover, koja ispravlja neke
sve u redu. greke koje opcija -r ne moe da ispravi:
Ako se pojavi bilo kakva drugaija poruka, to znai da imate problem pa pokuajte myisamchk --safe-recover tabela
da popravite tabel u. To moete uiniti pomou komande REPAIR TABLE (ako je u
Program myisamchk ima veliki broj moguih opcija, koje ete videti ako na
pitanju MyiSAM tabela) na sledei nain:
komandnoj liniji otkucate myisamchk bez parametara.
repair table tl;
Ako se postupak popravljanja zavri uspeno (ili ako popravljanje zapravo nije ni Proveravanje i popravljanje tabela pomou alatke mysqlcheck
bilo poptrebno), trebalo bi da dobijete rezultat nalik na sledei: Program mysqlcheck moe 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 pomou alatke mysqlcheck proverili tabele baze podataka, pokrenite je
+- --------+--------+----------+----------+ kao u sledeem 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 moete navesti imena tabela koje elite da proverite, ali ako
Ako se pojavi poruka drugaija od OK, komanda REPAIR nije delovala i morate da nita ne zada te, bie proverene sve tabele u bazi podataka (to je korisna odlika). Ako
upotrebite moniju alatku myisamchk. se sve zavri bez greaka, trebalo bi da dobijete rezultate nalik na sledee:
employee.assignment OK
Proveravanje i popravljanje tabela pomou alatke myisamchk employee.client OK
U ovom poglavlju razmotriemo samo alatku myisamchk a zanemariemo alatku employee.department OK
employee.employee OK
isamchk. Ako jo radite sa ISAM tabelama, predlaemo 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 ounaviJHIJt: flUUCILCIII.d
U ~II::Ut:l:t:m poglaVlJU l'

Opcijom --databases moete zadati listu baza podataka koje treba proveriti, 2. Trebalo bi da runo zakljuate tabele pre nego to
a opcija --all-databases ini da se proveravaju sve baze podataka na serveru. a) zaponete runu izradu rezervne kopije
Programu mysqlcheck moete zadati opciju -r da bi popravio sve oteene
b) pokrenete skript mysqldump
MyiSAM tabele na koje ie.
e) pokrenete skript mysqlhotcopy t' J
d) nijedno od prethodnog
Saetak 3. Koji se tipovi tabela mogu proveravati pomou komande CHECK
TABLE?
a) InnoDB i MyiSAM
Izrada rezervnih kopija
b) samo MyiSAM
mysqldump pravi datoteku slike stanja koja sadri SQL komande.
e) MyiSAM i BDB
mysqlhotcopy kopira datoteke baze podataka u odredini direktorijum.
d) InnoDB i BDB
BACKUP TABLE kopira datoteku tabele u odredini direktorijum.
4. Koji se tipovi tabela mogu popravljati pomou komande REPAIR TABLE?
Rezervne kopije moete napraviti i runo, tako to zakljuate tabele, ispraznite
a) InnoDB i MyiSAM
njihove bafere a zatim napravite kopije datoteka baze podataka.
b) samo MyiSAM
Restauriranje podataka e) MyiSAM i BDB
Izvrite komande iz datoteke slike stanja napravljene pomou skripta mysqldump. d) InnoDB i BDB
Vratite kopije datoteka koje ste napravili pomou skripta mysqlhotcopy ili 5. Ako je rezultat komande CHECK TABLE poruka Table is already up
to date
runo. a) morate upotrebiti komandu REPAIR TABLE
Pomou komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili b) komanda CHECK TABLE ne podrava mainu baze podataka
komandom BACKUP TABLE. e) tabela je dobra
Ponovo izvrite sve operacije evidentirane u dnevniku izmena nakon izrade d) nijedno od prethodnog
poslednje rezervne kopije.

Proveravanje i popravljanje tabela Vebe


Proverite stanje tabela pomou 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 pomou 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) zakljuati tabele i isprazniti njihove bafere
5. e
e) i a) i b)
d) nijedno od prethodnog
U sledeem poglavlju
U sledeem poglavlju",Zatita MySQL servera", saznaete kako da izbegnete najee
bezbednosne propuste.
15
Zatita MySQL servera

U OVOM POGLAVLJU razmatraemo opte probleme zatite o kojima bi trebalo da


vodite rauna kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se
objasne i najsitniji detalji, prilaemo spisak najvanijih preporuka o tome ta ne treba
raditi. Obradiemo sledee teme:
Kako sistem prava korisnika deluje u praksi
Zatita korisnikih naloga
Zatita instaliranih datoteka
Filtriranje podataka koje alju korisnici
Drugi saveti

Kako sistem prava korisnika deluje u praksi


U poglavlju ll",Upravljanje pravima korisnika", objasnili smo pravljenje korisnikih
naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo
poglavlje poinjemo opisom naina na koji MySQL server primenjuje prava koja
dodelite korisnicima.
Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL
utvruje da Ji je korisniku uopte dozvoljeno da uspostavlja veze sa servera m. Tome
slui tabela user u bazi podataka mysql. MySQL trai u toj tabeli red koji sadri kori-
sniko ime i lozinku koje ste zadali te ime raunara s kojeg pokuavate da se poveete
sa serverom. Ako ne nae odgovarajui red, nee vam dozvoliti da uspostavite vezu.
Budui da kolona host tabele user prihvata i dokerske znake, kombinacija kori-
sniko ime/ime raunara moe se nalaziti u vie redova te tabele. MySQL odreuje
koji je red najvaniji za utvrivanje identiteta tako to prvo ispituje redove koji sadre
konkretna imena raunara. Na primer, ako tabela sadri red za korisnika test koji se
prijavljuje s raunara localhost i red za korisnika test koji u koloni host sadri % (to
znai bilo koji raunar), MySQL uzima u obzir red koji sadri ime raunara localhost.
202 Poglavlje 15 Zatita MySQL servera Zatita instaliranih datoteka

Imajte u vidu da dva reda mogu sadrati razliite lozinke. To moe biti uzrok velike redove u tabeli user. Tamo e nai kombinacije laura% i (anonymous) localhost.
zabune. (Primer takve situacije pogledaemo u odeljku "Brisanje anonimnih naloga", Budui da MySQL daje prvenstvo redovima koji sadre konkretna imena raunara,

u nastavku ovog poglavlja.) uzima red (anonymous) localhost. Kao to vidite, iako je laura navela svoje kori-
Drugi korak se odvija kada pokuate da izvrite odreene upite ili komande. Pre sniko ime, u ovom sluaju ono ne slui niemu! Za anonimne naloge nije potrebno

izvrenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno zadati korisniko ime. Anonimni nalog verovatno ima drugaiju lozinku od naloga
izvravanje upita koji ste poslali. korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako
Ako je za upit koji pokuavate da izvrite potrebno globalno pravo - npr. kao za prijavljuje ne mora da zada lozinku).To znai da e laura, kada pokua da se pod svo-
komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr- jim korisnikim imenom i lozinkom prijavi s raunara localhost, dobiti poruku
avanju upita u odreenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik Access Denied (pristup nije dozvoljen) bez oiglednog razloga.
ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to Najbolji nain da izbegnete tu vrstu problema jeste da izbriete anonimne naloge
pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju i zaboravite da oni uopte postoje.
se utvruje da li moda ima pravo pristupanja odreenim tabelama i kolonama.
Opasna prava
MySQL ima veoma detaljan sistem prava korisnika, to je opisano u poglavlju ll.
Zatita korisnikih naloga Morate vrlo paljivo razmotriti kome ete dodeliti neka od tih prava. Budite veoma
Postoji nekoliko optih bezbednosnih principa koji vae i za upravljanje korisnikim oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.
nalozima na MySQL serveru. Razmotriemo ih u narednom odeljku. Pravo FILE omoguava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta
komanda moe se zloupotrebi ti za menjanje sadraja datoteka na serveru (kao to je
Zadavanje lozinke za korisniki nalog Root datoteka za lozinke, /etc/passwd) ili ak za menjanje datoteka baza podataka, ime se
Kada zavrite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte zaobilazi sistem prava pristupa.
lozinku za tog korisnika pre nego to ponete da koristite MySQL za bilo ta drugo Pravo PROCESS omoguava korisnicima da izdaju komandu SHOW PROCESSLIST.
osim iskljuivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako Tako u svakom trenutku mogu videti koji se sve upiti izvravaju, to im omoguava da
se moe prijaviti na va server i raditi s vaim podacima ta god pocli.To gotovo nikad dou do poverljivih podataka o drugim korisnicima.
nije prihvatljiva situacija. Ako jo niste zadali lozinku, uinite to odmah. Pravo WITH GRANT OPTION omoguava korisnicima da svoja prava dodeljuju dru-
gim korisnicima. Ako znate kakve mogu biti posledice tog prava, moete 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-
korisniko 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 ugraena
raunar, to omoguava uspostavljanje veza sa udaljenih raunara). Ti nalozi stan- je jaa zatita lozinki i mehanizma prijavljivanja.
dardno nemaju lozinke. Ako piete aplikaciju koja skladiti imena i lozinke svojih korisnika (ne korisnika
Verovatno ste ve shvatili zbog ega, ali ipak izriito preporuujemo da izbriete te MySQL-a), nemojte ih ifrovati pomou funkcije PASSWORD ().Umesto nje, prepo-
naloge. To moete uraditi na sledei nain: ruujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objanjene u pogla-

delete from user where User=''; vlju 8",Upotreba MySQL-ovih ugraenih funkcija u komandi SELECT".
delete from db where User='';
Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispra-
Zatita instaliranih datoteka
znili tabele prava. Osim zatite MySQL-ovih korisnikih 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. Naveemo neko
korisnik pokua da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili
liko preporuka koje moete primeniti na svoj sistem.
nalog ije je ime laura i koji sme da se prijavljuje s bilo kojeg raunara(%); kada
1 ura pokua da se prijavi s raunara localhost, MySQL server trai odgovarajue
Drugi savet l :ICI
Poglavlje 15 Zatita MySQL servera

Nemojte pokretati mysqld pod nalogom Root . . Drugi saveti


Ovo se preporuuje na Linuxu i drugim operativnim sistemima srodrum sa Umxo~1. Razmotrili smo sistem prava pristupa, obradili korisnike naloge, opisali datoteke u
Nemojte pasti u iskuenje da pokrenete MySQL server (program mysqld) pod .kon_- sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zatita
snikim nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce vae mree (to bi verovatno trebalo da vas brine im imate bilo kakvu vezu sa spolj-
raditi samo MySQL server. Tako ete ograniiti prava pristupa koja e MySQL server nim svetom), MySQL omoguava da se prenoenje podataka zatiti pomou protokola
imati u sistemu datoteka. SSL. Trebalo bi da razmotrite i fiziku zatitu ureaja.

Pristup datotekama i prava upotrebe u operativnom sistemu Upotreba SSL veza


Nema svrhe da troite vreme na pravilno podeavanje prava korisnikih naloga za pristup Ako elite da spreite da neko zlonameran "njuka" pakete podataka koje razmenjuju
MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu. N~ophodno MySQL server i klijenti, podesite MySQL za uspostavljanje zatienih veza pomou
je da korisnicima ograniite p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a protokola SSL (Secure Sockets Layer).
naroito 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 raunaru 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, moe da naprav1 koplje ssl i obavite odreena podeavanja 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 sledee opte bezbednosne mere: reprodukovali.
Samo ovlaeni i pouzdani korisnici treba da imaju pravo da pokreu mysqld. To Poto obavite neophodna podeavanja, pomou komande GRANT zahtevajte da se
pravo moete dodeliti jedino korisnikom nalogu koji ste napravili iskljuivo za korisnici prijavljuju putem SSL veza ili da imaju odgovarajue sertifikate. Evo jedno-
stavnog primera upotrebe komande GRANT:
mysqld .
Samo ovlaeni 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 odluujete od programa do programa.
Ova komanda pravi (ili menja) korisniki nalog testuser, ija je lozinka pass-
Samo ovlaeni i pouzdani korisnici treba da imaju pristup u MySQL-ov direk-
word. Taj korisnik moe da se prijavljuje na server samo putem SSL veza. Moete
torijum data. Ako server radi pod korisnikim nalogom mysql, tom nalogu je
zahtevati da se na taj nain prijavljuju svi korisnici servera ili moda samo korisnici
neophodan pristup u direktorijum data. Poto nijednom drugom konsmku to
koji se prijavljuju sa udaljenih raunara.
nije neophodno, najbolje da im zabranite pristup tamo.

Fizika zatita instalacije


Filtriranje podataka koje korisnici alju . Opta preporuka glasi: ako ste se ve potrudili da paljivo podesite korisnike 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 izvri odreene provere. Kako cete to tacno obav1t1, zav1s1 od . putem SSL veza, najbolje je i da fiziki zatitite instalaciju. Ako postoji mogunost da
razvojne platforme s kojom radite, ali pogledajmo primer koji objanjava zbog ega b1 neko obori server zato to se sapleo o njegov kabi za napajanje, ili ako neko moe da
ttd)nlo da proveravate ulazne podatke. v . v . ukrade podatke tako to odnese ceo raunar, imate ozbiljan problem. Fizika zatita se
Problem se moe pojaviti ak i pri neemu tako jednostavnom kao sto je unosenje esto zaboravlja, naroito u malim i srednjim kompanijama.

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


Moda manje iznenauje kada je u pitanju Windows, ali ak i inae bezbedni Unix/
pmslcdite direktno MySQL-u, problem e nastati zbog apostrofa u prez1menu O Leary. Linux sistemi postaju ranjivi kada se zanemari fizika zatita. Na primer, na Linuxu je
u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokuavaju da unesu postupak izmene lozinke korisnikog naloga root trivijalno jednostavan kada imate
MySQL-ove komande putem korisnikog interfejsa vae aplikacije ili Web obrazaca. fiziki pristup raunaru. Naravno, kada neko podacima moe da pristupa kao korisnik
Postupak kojim ete proveriti prihvatljivost ulaznih podataka zavisi od programskog root, moe da menja koje god hoe podatke u MySQL-ovim bazama podataka .
.JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji ete nai nekoliko optih
pn:poruka za veliki broj programskih jezika.
~OG Poglavlje 15 Zatita MySQL servera

2. Koja se tabela prva pretrauje kada se utvruje da li je korisniku dozvoljeno d,1


Saetak izvri odreeni upit?
Sistem prava pristupa a) user
Korak 1: Provera da li korisnikraunar ima pravo pristupa s lozinkom koju je b) host
zadao. e) db
Korak 2: Provera svakog upita da bi se utvrdilo da li korisnik raunar ima d) tables_priv
odgovarajue pravo. Najpre se pretrauju tabele user i host, zatim db, a onda 3. Ako MySQL pronae u tabeli user vie redova koji sadre isto ime korisnika,
tables_priv i columns _pri v. koji red uzima za proveru identiteta korisnika?
MySQL daje prednost redovima u tabeli User koji sadre konkretna imena a) Red koji sadri najodreenijeime raunara .
raunara. b) Red koji sadri najneodreenije ime raunara.
e) Svaki red koji sadri tanu lozinku.
Bezbednosne preporuke
d) Nijedno od prethodnog.
Obavezno zadajte lozinku za MySQL-ov nalog root.
4. Koja od sledeih prava verovatno ne bi trebalo da dodeljujete korisnicima?
Izbriite anonimne naloge; oni omoguavaju pristup neovlaenim korisnicima
a) FILE
i mogu da spree pristup regularnim korisnicima.
b) PROCESS
Veoma paljivo razmotrite kome ete dodeliti prava FILE, PROCESS i WITH
GRANT OPTION.
e) WITH GRANT OPTION
Lozinke koje se koriste samo za pristup aplikacijama ifrujte pomou funkcija d) Sva prethodna
MOS () ili CRYPT () a ne pomOU funkcije PASSWORD () . S. Koji je korisniki nalog pogodan za mysqld?
Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban a) Nalog s vrlo ogranienim pravima
korisniki nalog s vrlo ogranienim pravima koji ete upotrebljavati samo za b) Root
mysqld. e) a) ili b)
Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s ogranie d) Ni a) ni b)
nim pravima.
Korisnicima ograniite pristup programima i skriptovima prema potrebama.
Drite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome
Vebe
Pomou primera podeavanja 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
Ukljuite upotrebu SSL veza ako su potrebne ifrovane veze.
N e zanemarujte fiziku zatitu MySQL servera! Pitanja
l. d
Pitanja 2. a
l . Koj a se tabela u bazi podataka mysql pretrauje kada se utvruje 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 Zatita MySQLservera

U sledee m poglavlju
U poglavlju16",Replikovanje baze podataka", saznaete kako se dva servera ba~a .
podataka mogu podesiti da rade sa istim podacima. Time se rasporeuje opterecenJe,
poveava robusnost sistema i olakava izrada rezervnih kopija podataka.
16
Replikovanj e baze podataka

J EDNA OD VEOMA KORISNIH MOGUNOSTI KOJE PRUA MYSQL jeste replika-


vanje. Izmeu ostalog, replikovanje omoguava da iste podatke uvate na vie servera .
To moete raditi iz vie razloga,_npr. da biste postigli bolje performanse, poveali
pouzdanost sistema ili da biste lake pravili rezervne kopije baze podataka. Osim toga,
moete se opredeliti za replikovanje kao reenje kada elite da raspodelite optereenje
baze podataka na vie servera koje ve imate, umesto da nabavite jedan (nov) jai server.
Replikovanje baze podataka moe obezbediti otpornost sistema na greke (engl.
Ja~lt tolerance). Ako se glavni server pokvari,jedan od zavisnih servera moete tretirati
kao njegovu kopiju i odmah ga proglasiti za glavni server.
U sistemima gde se veina operacija svodi na itanje podataka, a ne na pisanje, tepli-
kovanje moe da pobolja performanse jer se izvravanje upita raspodeljuje na vie rau
nara. Ukupno optereenje sistema moete pokuati da smanjite tako to izvravanje
upita rasporedi te na vei broj manje optere enih raunara, a druga mogunost je da
pokuate da smanjite saobraaj u mrei tako to svaki upit usmerite na geografSki naj-
blii server. Ako su upiti koji se izvravaju u vaoj bazi podataka uglavnom prilino jed-
nostavni, ak i jednostavan algoritam koji ciklina rasporeuje optereenje moe biti
efikasno reenje. Ako neki upiti zahtevaju sloenu obradu, verovatno ete morati da
osmislite sloenije algoritme koji e rasporeivati optereenje ve na nivou aplikacije.
Druga primena replikovanja jeste izrada rezervnih kopija baze podataka. Kao to
smo napomenuli u poglavlju 14",Izrada rezervnih kopija i obnavljanje podataka",
izrada rezervne kopije obimne baze podataka moe da potraje prilino dugo. Kada
koristite replikovanje, moete spustiti zavisni server i napraviti kopiju njegovih poda-
taka bez ometanja korisnika glavnog servera.

Principi replikovanja
Replikovanje se moe odvijati u vie oblika. U MySQL se koristi usmerena veza glavni-
-zavisni server.Jedan od servera je glavni (engl. master).Jedan ili vie servera tretiraju sc
kao zavisni (engl. slaves) od odreenog glavnog servera. Glavni server odreuje koji sc
podaci uvaju u sistemu, dok zavisni serveri pokuavaju da preslikaju njegov sadr,j.
IV

Postupak replikovanja oslanja se na sadraj dnevnika izmena na glavnom serveru. 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 izvren na serveru od adresi nai ete dokumentaciju s matricom verzija glavnih i zavisnih servera koje
po etka beleenja 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 izmeu zavisnih servera, ili ak izmeu glavnog
i zavisnih servera. To se postie najee ugradnjom odgovarajue logike u aplikacije.
Podeavanje sistema za replikovanje
Vano je imati u vidu da kada ponete da replikujete bazu podataka koja ve sadri U veini sistema u kojima se primenjuje replikovanje koristi se vie raunara pove-
podatke, dnevnik izmena moda nee biti potpun. Budui da beleenje izmena u dnev- zanih u jednu internu mreu. Ako imate raun are povezane putem javnog Interneta,
nik standardno nije ukljueno, podaci koje ste uneli u sistem moda nisu zabeleeni u paljivo razmotrite bezbednosne mere. Za poetak, obavezno proverite da li je TCP
dnevniku izmena. Kada zaponete replikovanje, svi zavisni serveri moraju sadrati pot- prikljuak koji ste odredili za MySQL dostupan kroz zatitni zid svim raunarima koji

puno iste podatke kao glavni server na poetku beleenja u dnevnik izmena.Ovu temu treba da komuniciraju sa serverom (podrazumevani broj TCP prikljuka za MySQL
ra zmotriemo detaljnije u nastavku poglavlja.
server je 3306) .
Poto zavisne servere napunite usklaenim podacima i pokrenete ih, oni usposta- Pod pretpostavkom da na svojim raunarima imate noviju verziju MySQL-a i
vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeleene u jednu ili vie baza podataka koje elite da replikujete, naredni koraci su obavezni da
dnevniku izmena glavnog servera. Jedna nit izvrenja na zavisnom serveru uspostavlja biste napravili sistem s jednim glavnim serverom i jednim ili vie zavisnih servera.
vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smetaju u
prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvrenja na zavisnom Napravite korisniki 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, preporuujemo da za poslove repE-
Budui da glavni i zavisni serveri mogu biti dostupni u razliita vremena (npr. zato
kovanja napravite korisnike naloge koji e imati samo prava neophodna za te poslove,
to se u sistem mogu dodati novi serveri ba u trenutku izvravanja upita, ili zato to je ka to smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam

mrea postala zaguena, ili je ak prestala da radi), neophodno je da zavisni serveri belee je poseban nalog na glavnom serveru, namenjen iskljuivo poslovima replikovanja.
dokle su stigli sa unoenjem izmena.Vano je da se sve transakcije 'izvre u celini i da se Ako nameravate da poetno stanje zavisnih servera generiete pomou komandi
LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, korisnikom nalogu za
izmene primenjuju pravilnim redosledom. U veini aplikacija, ako se garantuje da baza
podataka uvek prelazi iz jednog usklaenog stanja u drugo, manje je vana injenica da replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na
e se ponekad uitati podaci zastareli nekoliko sekundi ili minuta.
glavnom serveru) pravi korisniki nalog s pravima koja su potrebna alatkama za
Ako razmatrate primenu replikovanja, morate shvatiti ta se tano dogaa. Auriranje uspostavljanje poetnih veza izmeu servera:
podataka odvija se asinhrono, a ne u realnom vremenu. Poto aurirate podatke u bazi grant replication slave, reload, super, select
na glavnom serveru, upiti poslati razliitim zavisnim serverima nakon toga mogu izvesno on logs.*
to replication"%" identified by 'password';
vreme davati razliite rezultate. To se moe smatrati nedostatkom, ali prednost je u tome
to e zavisni server koji radi na prenosivom raunaru ili u nepouzdanoj mrei, sasvim (U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgo-
lepo raditi u intervalu izmeu dva auriranja s glavnog servera. vara imenu vae baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)
Poto zavrite kopiranje poetnih podataka s glavnog servera na zavisni server,
Napomena o verzijama MySOL-a korisnikom nalogu za replikovanje vie nee biti potrebna tako velika ovlaenja. Ako
l ~c plikovanje je prvi put ugraeno u jednu od novijih verzija MySQL-a (3 .23 .15), to zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlaenja kori-
z n ai da se ta mogunost jo uvek razvija gotovo sa svakom novom izdatom verzijom. snikog naloga za replikovanje nakon zavretka poetnog kopiranja, tom nalogu je
Ako nameravate da koristite replikovanje, dobro je da na svim raunarima koji u tome dovoljno samo pravo replikovanja. Naredni upit pravi korisniki nalog ije je ime
u es tvuju instalirate aurnu i istu verziju MySQL-a. replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog
Mogu e su odreene kombinacije verzija MySQL-a izmeu glavnog i zavisnih servera (kao i sa svakog drugog raunara):
servera, ali poto time samo uvodite odreen stepen nepouzdanosti, najbolje je da to grant replication slave on logs.* to replication"%" identifi e d by
izbe gavate ako je ikako mogue. Primera radi, moete naii na problem da se funkcij e, 'password' ;
kao to j e PASSWORD (),razlikuju izmeu dve verzije MySQL- a s kojima pokuavate da
radit e.
rUyli:tVIJC l0 nC~III\UVdiiJC UdLC tJUUdldl'\.
Podeavanje sistema za replikovanjr
' l .it

Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika". Za My ISAM tabele, kopiju tekueg stanja svakog zavisnog servera moete 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. Meutim, ova metoda nije posebno efikasna, naroito kad
Navedena komanda omoguava samo pristup bazi podataka logs. Ako elite da doz- imate veliku koliinu 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 zakljuae podatke na glavnom serveru do
zavretka kopiranja. Baze podataka e biti zakljuane znatno krae vreme ako kopiju
Proverite da li je glavni server podeen za replikovanje tekueg stanja napravite runo pomou komandi operativnog sistema. To vam takoe
Na glavnom serveru mora biti ukljueno beleenje izmena u dnevnik. Ako ste proitali omoguava da istom kopijom tekueg stanja glavnog servera inicijalizujete koliko god
uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e ve ukljuili dnevnik . vam zavisnih servera treba, ime skrauj ete interval u kojem je server zakljuan.
izmena jer on slui i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju- Za InnoDB tabele ne moete izdati komandu LOAD DATA FROM MASTER. Kopiju
eno beleenje izmena u dnevnik, moete izdati komandu SHOW VARIABLES. Dovoljno stanja morate napraviti runo pomou komandi operativnog sistema ili nabavite
softver i opremu koji omoguavaju izradu kopije podataka dok se server koristi .
je da zadate
Ako kopiju tekueg stanja servera pravite runo, pomou komandi operativnog
show variables;
sistema, morate se uveriti da su podaci meusobno usklaeni i aurni, tako to ete
da biste prikazali vrednosti svih serverskih promenljivih, ali za skraeni rezultat zadajte izdati sledeu komandu:
sledee :
flush tables with read lock;
show variables like "log_bin";
Time ete zakljuati tabel u i spreiti upisivanje izme na dok je ne oslobodite.
Ako je beleenje izmena u dnevnik iskljueno, dodajte opciju log-bin u datoteku Ime tekue datoteke dnevnika i pomak od njenog poetka moete dobiti pomou
opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija bie my. ini ili my. cnf, sledee 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 vaa datoteka opcija sadri barem sledee redove: Trebalo bi da dobijete rezultate nalik na sledee:

[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-
Zapiite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone
izvoljno zadali smo 1. . .
(pomak od poetka te datoteke). Ako nema podataka, umesto imena datoteke zadajte
Ako izmenite sadraj datoteke opcija, morate ponovo pokrenut1 server da bl
prazan znakovni niz, a vrednost pomaka treba da bude 4.
izmene poele da vae. Da biste napravili kopiju tekueg stanja My ISAM tabela, pomou neke alatke za
arhiviranje datoteka kopirajte sadraj direktorijuma u kojem se nalaze datoteke tabela.
Napravite kopiju tekueg stanja glavnog servera Na Unixu, zadajte neto nalik na sledee da biste napravili kopiju tekueg stanja baze
Da biste zapoeli replikovanje, obezbedite sledee: podataka logs:
potpunu i usklaenu kopiju tekueg 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 slinu alatku da biste napravili kopiju
pomak od poetka dnevnika koji odgovara tekuem stanju servera. sadraja direktorij uma C: \mysql\data \lo gs.
Taan postupak kojim ete obaviti navedene poslove moe s.e malo razli~ovati Kada zavrite kopiranje, moete ponovo dozvoliti upisivanje u bazu podataka ako
u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam izdate sledeu komandu:
.Jl! neprijatna pomisao da ete za odreeno vreme morati da zabranite pristup bazi unlock tables;
podataka.
Sloenije topologlj
214 Poglavlje 16 Replikovanje baze podataka

Tabela employee koju koristimo u celoj knjizi (kao i veina tabela koje autori kori- U ovom primeru, re server je ime raunara na kojem radi glavni server. Re
ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje replicationje korisniko ime naloga koji ste napravili za poslove replikovanja.
InnoDB tabela dok se koriste, onje savren za ovu namenu. Moe se nabaviti od firme Umesto rei password upite 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 pokree na zavisnom serveru nit koja obavlja replikovanjc,
www.innodb.com/hotbackup.html usled ega zavisni server pokuava da uspostavi vezu sa glavnim serverom i preuzme
Ako nemate takvu alatku, najbolje reenje je da ispraznite bafere baze podataka i da 1zmene.
ispraznite njene tabele pomou narednih komandi. Prvo zadajte komandu Ako ste napravili kopiju tekueg stanja pomou komandi operativnog sistema, tre-
flush tables with read lock; balo bi da pokrenete izvravanje upita koji ispituju razlike izmeu glavnog servera i
a zatim prikaite i zapiite 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 .
nain kao za MyiSAM tabele):
Ako replikujete relativno male My ISAM tabele, moete ih napraviti i popuniti
show master status; podacima pomou komande nalik na sledeu:
Bazu podataka iskljuite iz upotrebe a da je ne oslobodite, a sadraj 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 zavrite kopiranje, moete ponovo pokrenuti bazu podataka i osloboditi njene load data from master;
tabele. da biste kopirali sve tabele na zavisni server.
Kada postupak replikovanja pone da se normalno odvija, vie nee biti zgodno da
Podesite zavisne servere runo izdajete komande za podeavanje replikovanja, ak ako zbog toga retko ponovo
Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini) pokreete server. Iste podatke koje biste zadali pomou tih komandi moete uneti u
dodajte red nalik na sledei: datoteku opcija, uz malo drugaiju sintaksu.
server-id=2 Datoteka my. ini ili my. cnf na zavisnom serveru moe sadrati neto nalik na sledei:
Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka, [mysqld]
potpuno je nevano koje ete vrednosti izabrati. Ako ete imati vei broj servera, niz server-id = 2
master-host server
rastuih vrednosti je najverovatnije najbolji nain da identifikatori imaju jedinstvene
master-user replication
vrednosti. master-password password
Ukoliko koristite kopije koje ste runo napravili u sistemu datoteka, morate kopi- replicate-do-db = logs
rati datoteke na odgovarajua mesta na zavisnom server u. Ako radite s vie razliitih
operativnih sistema, vodite rauna o razlikovanju malih i velikih slova.
Nakon auriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server, Sloenije topologije
Najea pr imena replikovanja jeste rasporeivanje optereenja (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 podeen kako je opisano u prethodnim odeljcima, glavnog servera i manjeg broja zavisnih servera, ali postoje i sluajevi u kojima je
opravdana upotreba sloenijih konfiguracija.
treba da izdate sledee komande:
Ako predviate da ete imati vei broj zavisnih servera ili su vai raunari razmeteni
change master to master_host='server',
master_user='replication', na veem broju razliitih geografskih lokacija, moe biti pogodno reenje u obliku
master_password='password', hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za odreen broj
master_log_file='server-bin.000007', zavisnih servera. Jedan ili vie tih zavisnih servera igraju ulogu glavnog servera za drugu
master_log_pos=211; grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server (raunar 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 poetno podeavanje moe biti zapetljane zbog razlika izmeu sistema .
Prepon~CUJemo da koristite najsveije verzije MySQL-a koje moete nabaviti.
Neki od tih problema bie reeni kada My ISAM dobije alatku za kopiranje podataka
dok .se tabele kon~ te, kao..to postoji za InnoDB tabele. Meu mogunostima koje su
plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s vie
glavmh se:v~ra Istovremeno (engl. multimastering) radi reavanja sukoba, i mogunost
preklapanJa IZmeu ~va server~ "n~. vrue" (engl.failover) i rasporeivanje optereenja.
Zasad se o p~eklapa11Ju na vruce IZmeu dva servera i rasporeivanju optereenja
morate starati sami u svojim aplikacijama, ili moete nabaviti odgovarajuu alatku za
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 optereenje glavnog servera na najviem nivou i U .datoteci opcija P?stoji nekoliko parametara koji se tiu replikovanja ali zasad
smanjuje obim saobraaja na mrenim vezama koje vode ka tom raunaru. U zavisno- nemaJumkakvog UtiCaJa. To su opcije za podeavanje SSL veza izmeu glavnog servera
sti od odnosa izmeu broja operacija itanja i upisivanja podataka u vaoj aplikaciji, I zav1smh se~.era . Ukoliko podatke replikujete putem javne mree, postupak e tako
tako moete obezbediti dobru skalabilnost bez prevelike sloenosti sistema. biti bezbed~IJI. Ako vam tre~aju zatiene veze, zasad je jedino reenje da nabavite
Prilino jednostavno moete formirati sistem s proizvoljnim brojem zavisnih ser- odgovaraJUCI proiZvod, kao sto je Stunnel.
vera i moda ak vie glavnih servera, pod uslovom da je svaki raunar glavni server
u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite Saetak
rauna da e ponekad na odreenom serveru nedostajati najnovije izmene, ceo sistem
moete tretirati otprilike kao da je u pitanju samo jedan server baze podataka. Repl~kovanje nije pogodno za. sve situacije, ali ako imate optereenu aplikaciju s
Stvari poinju da se komplikuju kada imate cirkularne veze u kojima vie servera V~SOkJm vodnosom ,Izmeu broja operacija itanja j upisivanja podataka, to moe
primaju komande za auriranje podataka a izmene se prosleuju u vie smerova. b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.
Najjednostavnija cirkularna veza sastoji se od dva raunara koji se ponaaju i kao glavni Imajte u vidu da se izmene ne izvravaju na zavisnim serverima u isto vreme.
i kao zavisni server. Svaka izme na koju nainite na jednom raunaru prosleuje se dru- Svaka kopija tabele mora prelaziti iz jednog usklaenog stanja u drugo, ali uita
gom. Kada piete aplikacije za tu vrstu sistema, morate biti veoma oprezni. vanJe podataka sa razliitih servera moe dati zastarele rezultate dok se zavisni
Budui da se izmene unose asinhrono, moe doi do dupliranja vrednosti u poljima serveri ne auriraju.
tipa auto increment ili jedinstvenih identifikatora i do neusklaenih podataka. U nekim Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD
aplikacijama to moe 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 izmeu tabela, a zahteva se veliki TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.
protok podataka i raspoloivost za upotrebu, moda ete prihvatiti da tome rtvujete
usklaenost podataka.
Pitanja
l. Na MySQL serveru replikovanje se moe upotrebiti za
B udunost replikovanja a) punjenje podacima razvojnog servera koji e sluiti za bezbedno testiranje
Imajui u vidu sve to je reeno, moramo napomenuti da su u pitanju relativno nove novih programa na stvarnim podacima
mogunosti, koje nisu do kraja "izbruene". Kao to ste videli, postupak inicijalizovanja
b) poboljavanje performansi
novog zavisnog servera kopijom stanja glavnog servera nije ba najpraktiniji. Nije uskla-
en ni nain na koji se radi s MyiSAM tabelama i InnoDB tabelama. Tekue mogunosti
e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike
n:plikovanja u MySQL-u nisu ba najrobusnije. Ugraene su u standardnu distribuciju d) poboljavanje stepena raspoloivosti sistema
(za razliku od veine komercijalnih baza podataka) i redovno se upotrebljavaju u okru- e) sve prethodno navedeno
1cnjima gde sc obraduju velike koliine podataka.Verovatno ete uti da su meu 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 obino 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 znai da
a) su podaci uvek aurni 18 Optimizovanje baze podataka

b) serveri moraju biti povezani preko pouzdane mree, a ako jedan od servera 19 Optimizovanje upita
postane nedostupan, drugi moraju da ekaju dok se on ponovo prikljui
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 prosleuju 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 RAZMOTRIEMO NEKOLIKO MOGUNOSTIubrzavanja


MySQL servera. Podeavanje servera je opsena tema i ima izvesnih slinosti sa ezote-
rinom umetnou. Naa namera je da vam u ovom poglavlju predstavim o osnove
podeavanja servera. Obradiemo sledee teme:
Prevoenje i povezivanje koda radi vee brzine rada
Podeavanje parametara servera
Podeavanje drugih inilaca

Najvanije je imati u vidu injenicu da za sve izmene koje uvodite na serveru


u cilju njegovog optimizovanja morate primeniti iskljuivo 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 nainili zaista poboljava performanse.
Ako elite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da due
vreme Uedan sat, jedan dan ili neki prosean period) beleite upite koji se izvravaju na
serveru i da zatim te iste upite ponovo izvrite na izmenjenoj konfiguraciji servera.

Prevoenje i povezivanje koda radi poveavanja


brzine rada
U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih ver-
zija instalacionih datoteka (pomou alatke RPM na Unixu). Ako tek uite upotrebu
MySQL-a, to je svakako najjednostavniji nain, naroito ako nemate iskustva s pre-
voenjem softvera koji imate na svom raunaru, kao to je sluaj s veinom korisnika
Windowsa.
Performanse svog servera moete poboljati ako preuzmete izvornu verziju koda i
sami ga prevedete. Ukoliko imate raunar s procesorom Pentium koji radi pod opera-
tivnim sistemom Linux, postii ete primetno poboljanje performansi ako izvorni
1.22 Poglavlje 17 Optimizovanje MySQL servera t'oaesavanJe parametar. ~rrv 11

kod MySQL-a prevedete pomou prevodioca pgcc, koji optimizuje rezultujui kod Datoteka opcija my.cnf sadri toliko veliki broj opcija da ete se moda pitati
samo za procesor Pentium. (Tako dobijena izvrna datoteka nije kompatibilna sa odakle da ponete. Uz veinu 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 obino nalaze u direktorijumu support-files instalacije. U tom direktorijumu
lokacije prevedena pomou prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser- nai ete sledea etiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf,
ver moete ubrzati od 10% do 30% ako sami prevedete kod pomou odgovarajueg my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao poetnu datoteku op cijn
prevodioca i pravilno podeenih opcija- vie informacija o tome nai ete u MySQL- za svoj sistem.
-ovoj dokumentaciji. Najvaniji parametri koje treba da podesite jesu oni koji odreuju kako MySQL
Drugo poboljanje u poreenju s MySQL-ovom gotovom izvrnom datotekom troi memoriju. Za svaki server baza podataka vai pravilo "to vie memorije, to
jeste da prevedete MySQL s podrkom samo za skup (ili skupove) znakova koji name- bolje", ali je vano i da ta memorija bude na raspolaganju serveru baze podataka i da
ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugraena je se pravilno raspodeljuje izmeu njegovih procesa.
podrka za sve postojee skupove znakova. (Vie informacija o skupovima znakova MySQL odrava grupu internih bafera i ostava. Moete podesiti koliinu memorije
nai ete u poglavlju 12",Podeavanje MySQL-a" .) koja se odvaja za tu namenu. Dva najvanija parametra koja treba da podesite su
MySQL-ova dokumentacija sadri predloge o optimizovanju binarnih datoteka key_buffer_size i table_cache. Poto te bafere dele sve niti koje rade na serveru,
koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim njihovo podeavanje ima veoma veliki uticaj na performanse servera.
grupama na Internetu posveenim MySQL-u moete nai miljenja i savete u vezi .. U baferu nazvanom bafer za kljueve (engl. key buffer) uvaju se blokovi MyiSAM
s mnogim problemima specifinim za odreene operativne sisteme i prevodioce koda. indeksa. Kada aplikacija zatrai odreeni blok iz datoteke indeksa, on se uitava u taj
Arhive se nalaze na adresi bafer. Kad god se izvrava neki upit, ako se odgovarajuu blok indeksa nalazi u baferu,
http://lists.mysql.com podaci se uitavaju iz njega. U suprotnom, blok indeksa mora da se uita iz datoteke
na disku u bafer za kljueve, to je, razume se, sporije. Za bafer kljueva vai pravilo da
Ukoliko elite da se pridruite diskusijama o prevodiocima, potraite forum na adresi
to je vei, to bolje slui 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 koliinu memorije s kojom raspolaete, da li se raunar koristi
iskljuivo kao MySQL server ili slui i za druge poslove, a vana je i veliina datoteka
Podeavanje parametara servera
indeksa (tj. ukupna veliina .MYI datoteka).Jeremy Zawodny, poznati strunjak koji
Da biste optimizovali svoju konfiguraciju, pokuajte da podesite parametre MySQL
odrava servere kompanije Yahoo!, preporuuje da na raunaru koji radi iskljuivo kao
servera.
MySQL server,parametru key_buffer_size dodelite vrednost u opsegu izmeu 20% i
Podseanja radi, tekue vrednosti parametara servera prikazaete na sledei nain:
50% ukupne koliine memorije na raunaru . Ako je u pitanju deljen raunar, jasno je da
show variables;
vrednost tog parametra treba da bude manja. Ukoliko podaci vaih indeksa zauzimaju
Uticaj tekuih vrednosti parametara na konfiguraciju servera videete pomou sle- samo 20 MB, bilo bi besmisleno da veliinu bafera za kljueve podesite na 128 MB.
dee komande: Imajte u vidu i to da se bafer za kljueve koristi iskljuivo za MyiSAM tabele. Za
show status; druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno
poveate bafer za kljueve ako, na primer, radite iskljuivo sa InnoDB tabelama. U
Druga korisna alatka koja omoguava da vidite ta se dogaa na serveru jeste Perl
skript mytop, iji je autor Jeremy Zawodny. tom sluaju vaniji je parametar innodb_buffer_pool_size. U baferima za InnoDB
uvaju se i podaci indeksa i podaci tabela. (Vie informacija o podeavanju za rad sa
Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese,
~ta nje procesa, trajanje itd. Osim toga, ta alatka omoguava da prikaete detalje
InnoDB tabelama nai ete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)
MySQL-ovog procesa i vidite koji se upit izvrava. Drugi zaista vaan parametar je ostava za tabele (engl. table cache) kojom se upravlja
pomou opcije table_cache.Vrednost te opcije odreuje maksimalan broj tabela koje
Skript moete 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. Budui da je otvaranje i zatvaranje dato tc b
Sve navedene alatke omoguavaju da evidentirate izmene koje ste uneli i uinke spora operacija, te datoteke ostaju otvorene dok ne budu izriito zatvorene, server spu
koj e one imaju na sistem. ten, ili dok ukupan broj otvorenih tabela ne premai vrednost parametra table_cache.
Poglavlje 17 Optimizovanje MySQL servera

Poveanje vrednosti parametra table_cache korisno je kada na serveru imate veliki Performanse ete poboljati ako sami prevedete izvorni kod MySQI ,, 11 11 1 illi

broj tabela. Budui da va operativni sistem ograniava ukupan broj otvorenih datoteka datoteku, naroito ako imate raunar koji radi pod Linuxom ili ima JlllH l'''"
u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik moe drati otvo- Pentium.
rene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego to izme- Podesite parametre servera za bolje performanse, naroito one koje sc odnosa
nite vrednost parametra table_ cache. na potronju memorije. Velika koliina fizike memorije na raunaru uvek Jt'
Osim tih globalnih memorijskih bafera, pojedinim nitima se takoe dodeljuju korisna, ali je vanije kako se ona raspodeljuje. Evo nekoliko posebno va n ih
odreeni blokovi memorije- kao to su, na primer, bafer za sortiranje (engl. sort buffer) parametara:
i br.ifer za itanje (engl. read bulfer).Veliina tih b afera je jednaka za svaku nit, ali svaka nit key_buffer_size: Koliina memorije koja e biti odvojena za skladitenje
moe koristiti tu koliinu memorije za drugu namenu . MyiSAM indeksa.
U bafer za itanje, ija se veliina odreuje 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 sadraj ita sekvencijalnim redosledom (engl. table
read_buffer_size: Koliina memorije koja se koristi pri sekvencijalnom
sca11). to se vie podataka iz tabele moe smestiti u bafer, to e biti manji broj opera-
itanju tabela.
cija itanja sa diska; meutim, ako je vrednost tog parametra previsoka, grupa bafera
za itanje koje niti koriste moe potroiti previe memorije. Moda se seate da se u sort_buffer: Koliina memorije koja se koristi za skladitenje podataka iz
ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a veliinu muje .. tabela kada se pomou odredbe ORDER BY zahteva sortiranje podataka.
odreivao parametar record_buffer. Poboljajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo-
Bafer za sortiranje, iju veliinu odreuje parametar sort_buffer, koristi se pri trebom urnalskog sistema datoteka i brze mree izmeu klijenata i servera, te
izvravanju upita koji sadre odredbu ORDER BY, tj. slui za sortiranje podataka. Ako izmeu glavnih i zavisnih servera.

sorti rate velike koliine podataka, poveajte bafer za sortiranje, ali i za njega vai isto
upozorenje kao i za bafer za zapise. Pitanja
l. Parametar koji odreuje koliko e memorije biti odvojeno za skladitenje
Podeavanje drugih inilaca indeksa Inn oD B tabela je
Na kraju, jo nekoliko saveta koji vam mogu pomoi pri podeavanju fizike konfigu- a) key_buffer_size
racije sistema. b) innodb_buffer_pool_size
to se operativnog sistema tie, MySQL preporuuje Solaris kada elite da izvuete
e) innodb_key_buffer_size
maksimum od raunara s vie procesora. Iako postoje verzije MySQL-a za razne ope-
d) read_buffer_size
rativne sisteme, razvoj i poetno testiranje obavljaju se na Solarisu, zahvaljujui emu
bi to po logici stvari trebalo da bude najbolje optimizovana platforma. 2. Parametar koji odreuje koliko e memorije biti odvojeno za keiranje podataka
Ukoliko moete da nabavite vie diskova, poboljaete performanse ako baze poda- Inn oD B tabela je
taka rasporedite na razliite fizike diskove. U tom sluaju moete koristiti i RAID a) key_buffer_size
konfiguracije - RAID O poboljava performanse pri itanju i pisanju, a RAID l ili 5 b) innodb_buffer_pool_size
poboljavaju performanse pri itanju. Osim toga, SCSI diskovi obezbeuju bolje per- e) innodb_key_buffer_size
foJillanse od IDE diskova. d) read buffer size
Moete razmotriti i upotrebu urnalskog sistema datoteka (engl.journalingjile
3. Parametar koji odreuje koliko e memorije biti odvojeno za keiranje podataka
1ystc'111), kao to je Reiserfs ili XFS. Tako moete jo vie poboljati performanse.
My ISAM tabela je
Rnume se, znaajan boljitak moe se postii povezivanjem klijenata i servera preko
bt7C mree, to takoe vai i za glavne i zavisne servere u replikovanju.
a) key_buffer_size
b) table cache
e) innodb_key_buffer_size
Saetak d) read_buffer_size
Budui da je tema optimizovanja MySQL-a toliko opsena da zasluuje zasebnu
kii_JI~ll, obavcwo nastavite s prikupljanjem informacija i istraivanjem te oblasti.
u Poglavlje 17 Optimizovanje MySOL servera

4. Parametar koji odreuje koliko e memorije biti odvojeno za keiranje 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 vei broj niti sekvencijalno pretrauje tabele, imaete problem
b) uvek se moe dodati nov indeks, pa zato MySQL nee nikad morati da
sekvencijalno pretrauje tabele
e) time se rasipa prostor na disku
d) nijedno od prethodnog
U POGLAVLJU 17",0pimizovanje MySQL servera", opisali smo kako se server
.. podeava za optimalne performanse. U ovom poglavlju razmotriemo kako moete
Vebe optimizovati tabele baze podataka.
Eksperimentiite pomou programa za merenje performansi dok parametre navedene Standardna pravila i preporuke za strukture i normalizovanje tabela obino pobolj-
u ovom poglavlju podeavate na razliite vrednosti. Moete li pronai optimalnu avaju performanse. Postoje i drugi izbori koje moete napraviti kada projektujete
vrednost svakog od tih parametara za svoj sistem? bazu podataka, zbog kojih e konani proizvod biti bri ili sporiji. U ovom poglavlju
razmotriemo te izbore.
Obradiemo sledee 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 Poto ste proitali prethodno poglavlje o optirnizovanju servera, moete prei na opti-
mizovanje baze podataka. U narednom poglavlju baviemo se optirnizovanjem upita.
Ako ste optirnizovali server (moda ak po cenu ugradnje dodatnog hardvera), sle-
U sledeem poglavlju dei korak je da razmotrite da li se bilo koja od navedenih taaka odnosi i na va slu aj :
U sled eem poglavlju," Optimizovanje baze podataka", razmotriemo optirnizovanje
Nemam dovoljno indeksa. Uzrok broj jedan loih performansi jeste upotreba tabela
l' ll1 C baze podataka, indeksa i pojedinih tabela.
kojima nije pridruen nijedan indeks ili nema indeksa za kolone koje pretrau-
jete.To ne znai da treba imati to vei broj indeksa jer preterivanje u suprotnom
smeru moe biti uzrok sledeeg problema na listi.
Imam previe indeksa. Da bi se aurirao veliki broj indeksa, svaki put se u t:~ belu
upie nov red ili aurira postojei, a to potraje. Kada uitavate podatke, indeksi '> ll
veoma korisni. Kada upisujete nove redove, odnosno aurirate ili brit:lc pm111
jee redove, indeksi postaju problem. Kad god aurira te neki podatak, 11101 .q11 ~ ~
aurirati i indeksi, to produava obradu i poveava opteree nj e si slCill;l
ll Poglavlje 1B Optimizovanje baze podataka

Dodeljujem prava pojedinano za tabele i kolone tabela. Ako prava dodeljujete pojedi- lnd~ksiranje u cilju optimizovanja
nano za tabele ili kolone bilo kog resursa, kad god korisnik poalje upit na izvra- Uk~hko .ste pratili gr:divo i vebe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1,1
vanje, MySQL mora da utvruje koja su sve prava za tabele i kolone tabela zadata. ~adrz1 pnmarne kljuceve. To znai da imate barem po jedan indeks za svaku tnbdll
~~r MySQL automatski pravi indekse za kolone koje deklariete kao PRIMARY KEY
Struktura baze podataka nije optimalna. Postoje naini da se struktura baze podataka
1h UNIQUE. ,
projektuje tako da se upiti bre izvravaju.
~o pokuavat.e da optimizujete postojeu bazu podataka, korisno je ispitati da Ji ll'
U naredna dva odeljka razmotriemo strukture baze podataka i indekse koji omo- u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je esta greka pri projekta o

guavaju ubrzavanje rada s bazom podataka. vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi
postoje za odreenu tabelu.
Pravilni izbori pri projektovanju baze podataka Dakle, ta je indeks i emu slui?
Indeks je slian referentnoj tabeli po tome to omoguava da se brzo pronae odrc-
Postoji vie pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,
e.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaenje traene vrednosti u
doprinose poboljanju njenih performansi. To su sledei:
tOj ..kolo~l zna.tno je bre pomou 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 omoguava da se direktno pree 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 krai redovi i manje tabele, to e se one
.. . Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretrauje jedan po
Jedan red tabele dok ne pronae redove koje ste zahtevali. Zamislite da morate da
bre pretraivati. to su podaci manji, vie se redova moe keirati u memoriju. pronae:e odree~u ten~u. u ovoj knjizi tako to ete poeti od prve stranice i itati
Koristite zapise fiksne duine gde god je mogue. Ako su svi redovi tabele jed- svaku ree na sv~kOJ stran1e1. ~na tn o je bre da u indeksu knjige potraite temu koja vas
nake duine, MySQL bre pristupa redovima u sredini tabele. Da bi tabela imala zamma 1 da zat1m preete direktno na stranicu koja vam treba.
redove fiksne duine, tipovi podataka u svim kolonama moraju biti fiksne duine. U MySQL-u se po.daci indeksa uvaju u obliku b-stabala (binarna stabla); to su
To znai da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB. strukture podataka koje se vrlo brzo pretrauju.
Ako vam je neophodan tip TEXT i BLOB, moda biste mogli da denormalizujete . I~dek~i mogu o?~hvatati je~nu kolonu ili vie njih (isto kao kljuevi tabela). Pri
emu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu. IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretrauje jedno od sledeih:
Ukoliko imate iskljuivo kolone tipa VARCHAR, razmislite o tome da ih zamenite Kolona kojoj _je pri~ruen jednokolonski indeks- na primer, ako je u tabeli
kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju vie mesta ~epartments mdekmana kolona departmentiD i treba izvriti upit slian slede-
na disku, to je u suprotnosti s prvom preporukom na ovoj listi. cem: SELECT .. . WHERE departmentiD=n.
Gde god je mogue, deklariite kolone kao NOT NULL. Ako je priroda vaih Grupa kolon~ za koju postoji zajedniki indeks - na primer, ako za tabelu
podataka takva da su vrednosti NULL sasvim logine i prihvatljive, slobodno ih emplo~ee.ass1gnment postoji indeks za kolone (client ID, employeeiD work-
koristite. Meutim, imajte u vidu da zbog toga gubite malo brzine i prostora, date) 1 treba izvriti upit slian sledeem: SELECT .. . WHERE client ID=~ AND
pa zato zadajte odredbu NOT NULL gde god je mogue. employeeiD=y AND workdate=z .
Birajte tip tabela za svaku tabel u pojedinano. Tabele koje ne podravaju transak- Ko.lon~ ili grupa kolo.na koja je deo viekolonskog indeksa, pod uslovom da je to
cije (na primer, My ISAM) manje optereuju sistem i zato su bre od tabela koje levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign-
podravaju transakcije (InnoDB i BDB). MySQL podrava meanje vie tipova ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on e biti
tabela u istoj bazi podataka. Izaberite najbri tip koji je pogodan za odreeni upotrebljen u upitima sledee vrste: '
posao. (Vie informacija o pojedinim tipovima tabela nai ete u poglavlju 9, SELECT ... WHERE clientiD=x
SELECT ... WHERE clientiD=x AND employeeiD=y
"Tipovi tabela u MySQL-u" .)
Izaberite odgovarajue indekse. Ovu temu obradiemo detaljno u narednom Ali ne i u upitima nalik na sledei:
SELECT ... WHERE employeeiD=y AND workdate=z
odeljku.
U teim sluajevima, razmislite o denormalizovanju tabela da biste smanjili broj Sutina cele .~rie je u sledeem: ako predviate da e se izvravati veliki broj upita
spojeva koji se uspostavljaju u uobiajenim upitima. Budui da e zbog toga vaa ~ad kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da
baza podataka postati nona mora za odravanje, to se najee ne preporuuje. Izdate komandu CREATE INDEX da biste napravili odgovarajui indeks. Imajte u vidu
- r .. - - - .J- ---- 1 ---~-H-

Pitanja

da MySQL moe da koristi samo po jedan indeks po tabeli u upitu. Nije mogue
automatsko kombinovanje vie indeksa.
Pitanja
Ovo pitanje emo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita", 1. Koja je od sledeih tvrdnji o indeksima tana?
kada budemo doli do komande EXPLAIN. a) Indeksi zauzimaju previe prostora na disku i zato ih ne treba koristiti.
b) Ako tabeli nije pridruen nijedan indeks, upit se moe izvravati sporije.
Komanda ANALYZE TABLE e) Trebalo bi da indeksirate to vei broj kolona.
Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored kljueva u tabeli. d) Nijedna od prethodnih.
MySQL uva te podatke i koristi ih pri donoenju odluke o tome kako e spojiti 2. Kada birate tipove podataka za kolone tabele
tabele u upitu. Komanda se izdaje na sledei nain 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 duine gde god je
Komanda OPTIMIZE TABLE mogue 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 duine gde god je mogue 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 podravaju transakcije
izmeu blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su b) uvek birajte MyiSAM zato to su najbre
zapisi premeteni zato to su nakon auriranja postali vei. Te praznine su uzrok slabije e) koristite meavinu tipova, u zavisnosti od svrhe tabele
efikasnosti. d) nijedno od prethodnog
Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri- 4. Indeks nee biti upotrebljen ako se u upitu
sali vee koliine podataka, ili ako ste dodali, izbrisali ili aurirali vei broj redova pro-
a) koristi levi kraj grupe indeksiranih kolona
menljive duine. Tako ete preurediti podatke u datotekama, ponovo sortirati indekse
i aurirati statistike podatke o tabeli. b) koriste sve kolone indeksa po redosledu razliitom 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
Saetak d) koristi desni kraj grupe indeksiranih kolona
Strukturu baze podataka moete optimizovati tako to ete odabrati tipove poda- 5. Upotrebite komandu OPTIMIZE TABLE
taka manje veliine i fiksne duine, definisati odgovarajue indekse i koristiti
a) im definiete tabelu, da biste poboljali njenu strukturu
odgovarajue tipove tabela.
b) kada koristite InnoDB tabele, da biste smanjili optereenje sistema
Indeksi omoguavaju brzo pronalaenje zapisa traenih na osnovu vrednosti u
indeksiranim kolonama. e) nakon izvravanja veeg broja komandi SELECT nad tabelom
Indeks e biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona d) nakon izvravanja veeg broja komandi DELETE nad tabelom
ili kolone, ili levi kraj grupe indeksiranih kolona.
Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju slinu defrag-
mentiranju vrstog diska.
- .~ ... ~~ ---,J ----- 1"" __ _ ...........

Vebe
U kojem e od sledeih upita u bazi podataka employee biti upotrebljeni indeksi?
(Potraite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tanu strukturu
baze podataka. Ili, ako ste je instalirali na svoj raunar, pogledajte pomou komande
describe koje su sve kolone indeksirane.)
..
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 OMOGUAVA DA ANALIZIRATE upit da biste saznali za koje se vreme

from employeeSkills
izvri i kako se tano izvrava nad sadrajem baze podataka. Na osnovu tih podataka
group by skill; i poznavanja naina na koji MySQL pokuava da optimizuje upite, ponekad moete
da poboljate performanse upita. U ovom poglavlju razmotriemo sledee teme:
Ako ovi upiti treba da se esto izvravaju, koje biste dodatne indekse napravili?
Otkrivanje sporih upita
Merenje performansi upita
Odgovori Upotreba dnevnika sporih upita
Upotreba komande EXPLAIN za prikazivanje naina na koji se upiti izvravaju
Pitanja
MySQL-ov ugraeni mehanizam za optimizovanje upita
l. b
2. e Saveti o optimizovanju upita
3. e
4. b Otkrivanje sporih upita
S. d Da biste optimizovali odreenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju
najvei udeo u ukupnom vremenu izvravanja. To moete obaviti na nekoliko naina:

Vebe Posmatranjem: esto zakljuujemo daje neophodno optimizovanje zbog toga to


[ndeks se koristi samo u upitu pod takom b). se odreeni upit izvrava brzinom premorenog pua.
Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill. Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije
izvravaju.
U sledeem poglavlju Uvidom u dnevnik sporih upita: U ovaj dnevnik belee se spori upiti, kao to biste
U s ledeem (i poslednjem) poglavlju, "Optimizovanje upita", razmotriemo kako i oekivali na osnovu njegovog imena.
moete utvrditi da li se odreeni upit izvrava brzo ili sporo, i zbog ega, kao i to kako Poto identifikujete spori upit, pomou komande EXPLAIN moete saznati kako ga
reiti problem. MySQL tano izvrava da biste zatim pokuali da ga optimizujete.
Najee nije potrebno da ubrzate ba sve upite koji se koriste u aplikaciji . Obino
samo manji deo koda oduzima najvei deo ukupnog vremena izvravanja. Ukoliko
va sistem nije izuzetno optereen, besmisleno je da gubite vreme pokuavajui da
ubrzate delove aplikacije iji je udeo u ukupnom vremenu relativno mali.
upotreoa komande EXPLAIN za prikazivanje naina na koji sc upili l1vr .!Valu

Beleenje sporih upita u dnevnik moete ukljuiti pomou opcije --log- slow
Merenje performansi upita -queries=imedatoteke, koju zadate kada pokreete MySQL, ili u datoteci opcija.
Merenje performansi (engl. benchmarking) korisno je za reavanje svih vrsta problen:a
Ako ukljuite i opciju --log-long-format, bie evidentirani i svi upiti pri ijem sc
optimizovanja. Merenje performansi u ovom sluaju znai merenje vremena za koje
izvravanju ne koristi nijedan indeks. To vam moe pomoi da lake utvrdite emu
se upit izvri. Najbolje je da upit izvrite vie puta i da zatim izraunate proseno
treba da f>osvetite najvie panje pri optimizovanju.
vreme njegovog izvravanja. Budui da trajanje jednog izvravanja upita zavisi od
Zadavanjem vrednosti promenljivoj long_query_time odreujete ta je za vas
ukupnog optereenja sistema, samo jedno merenje moe dati neoekivane rezultate.
spor upit. Moete je zadati u konfiguracionoj datoteci ili pomou komande SET.
Otkriete i to da bi upit trebalo da se bre izvri kada ga pokrenete drugi put jer je
Vrednost te promenljive izraava se u sekundama.
smeten u ostavu (ke).
Dnevnik sporih upita moete itati neposredno jer je to obina tekstualna datoteka.
Razume se, moete koristiti spoljne skriptove ili programe posebno napisane tako
Moda ete smatrati korisnijim saet spisak upita koji se sporo izvravaju. Takav spisak
da isti upit izvravaju vie puta. Ako vas zanima primer takvog programa, preuzmite
moete prikazati pomou skripta mysqldumpslow (u direktorijumu scripts instalacije
distribuciju MySQL-a sa izvornim kodom i potraite programe za merenje perfor-
MySQL-a). Poto 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 moete meriti brzinu izraunavanja vrednosti bilo kojeg izraza
state. com.)
(ukljuujui i upita) pomou ugraene funkcije BENCHMARK(). Na primer:
Jedno od tekuih ogranienja MySQL-ajeste to da ne belei spore upite ije
select benchmark(lOOOOOO, 6*9); izvravanje traje manje od sekunde. Na sistemima koji obrauju relativno veliki broj
Ova komanda daje rezultate nalik na sledee: jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator e
+-------------------------+ moda eleti da zna kojim je upitima potrebno vie od desetinke ili nekog drugog dela
l benchmark (1000000, 6*9) l sekunde. To e biti obezbeeno u jednoj od buduih verzija MySQL-a.
+-------- -----------------+
o l
+-------------------------+ Upotreba komande EXPLAIN za prikazivanje naina
row in set sec)
1 (0.25
na koji se upiti izvravaju
Funkcija prihvata dva parametra: koliko puta treba izraunati vrednost izraza Komanda EXPLAIN nalae MySQL-u da "objasni" kako namerava da izvri upit. Kao
(u ovom primeru, milion puta) i izraz koji se izraunava (u ovom primeru, est puta jednostavan primer, moete zadati sledee:
deve0. .. explain
Budui da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa
select e.name, d.name
BENCHMARK () uvek vraa rezultat nula. Pri merenju nas zaista zanima za koje vreme se from employee e, department d
upit izvrio. Iz navedenog primera rezultata vidi se daje izraunavanje proizvoda 6 x 9 where e.departmentiD = d .departmentiD;
milion puta na mom raunaru trajalo etvrtinu sekunde. Kao to vidite, ispred jednog sasvim obinog upita samo smo dodali re EXPLAIN.
Funkciji BENCHMARK () moete proslediti i tekst upita, na primer: Zbog toga se upit nee izvriti,jedino e se prikazati podaci o tome kako MySQL pla-
selec t benchmark(lOOOOOOO, nira da izvri upit. Trebalo bi da se prikau rezultati nalik na sledee:
'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 tano znai? Uoljivo je da se u skupu rezultata pojavljuje po jedan red
Pomou dnevnika sporih upita moete utvrditi koji se upiti presporo IzvrsavaJU. S~nu za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim e tabele biti spo
ddiniete 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 sledee kolone: Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:
id Redni broj. Ako jedan upit sadri vie komand1 !.J EI .EC" I' - 11,1 JliiiiH:I, bd.1 ref Iz tabele e biti uitani svi redovi koji sadre vrednosti jednake vredno-
je u upit ugraen podupit- svaka komanda SELECT dobtj.l SV<~J rLdni broj . stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj
select type Vrsta komande SELECT koja se izvrava. U ve ini s lu ajeva, ova radite s kljuevima ije vrednosti nisu jedinstvene .
kolona ~adrae 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 znai da e iz
sasvim obian upit SELECT. Ako imate podupite, spoljni upit e biti oznaen tabele biti uitani svi redovi iz odredenog opsega.
reju PRIMARY a unutranji upiti bie oznaeni reima SUBSELECT ili DEPENDENT index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo-
SUBSELECT u sluaju koreliranih upita. jeva. Kada se prikae tip index, to znai da e biti pretraen ceo indeks. To je
table Ime tabele na koju se red odnosi. bolje od pretraivanja cele tabele, ali daleko je od savrenog.
type Ovo je najvanija kolona pri optimizovanju i prikazuje na koji e nain 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 kljua, to je kolona kljua koja
possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u e biti upotrebljena. Red tabele employee sadri vrednost NULL u obe navedene
upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se re kolone, to znai da nema kljua koji se moe upotrebiti i zato nee biti upotrebljen
NULL. nijedan. To je jo jedna prilino 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. izvravan, pa bismo zbog toga eleli da bude bri, napraviemo sledei indeks:
key len Duina indeksa koji je MySQL odluio da upotrebi. create index ename_did on employee(name, departmentiD);
ref Vrednost s kojom se poredi sadraj kolone kljua pri odluivanju 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 proita 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. Mnoenjem vrednosti broja redova moete 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 uitano. Time dobijate red veliine brzine izvravanja upita. 2 rows in set (0. OO sec)

Extra Ova kolona moe sadrati dodatne podatke. Na primer, komentar Promene su oigledne. U redu tabele employee sada stoji daje tip spoja index jer
using index zai da MySQL moe u potpunosti uitati rezultate upita iz jednog postoji indeks koji se moe upotrebiti. Novi indeks je naveden kao mogu klju , ali
nee biti upotrebljen. U koloni Extra stoji da e za tu tabelu biti upotrebljen indeks
od indeksa i nema potrebe da uitava podatke iz tabele.
umesto same tabele, zahvaljujui emu bi trebalo da upit bude neto bri.
Dakle, ta nam rezultati govore u ovom primeru? Najea upotreba komande EXPLAIN jeste za utvrivanje da li biste pomou bolje
Tip spoja ALL za tabelu employee znai da e biti pretraeni svi redovi te tabele. osmiljenih indeksa mogli da ubrzate upite, ali otkriete da se to moe postii i na
Razume se, to e biti spora operacija ako tabela sadri veliku koliinu podataka. U druge naine.
stvari, spoj tipa ALL je najgori mogui rezultat. Njega ete dobiti kad god tabela nema
nijedan indeks koji bi se mogao upotrebiti u upitu. Oigledna optimizac4ija u tom slu-
aju jeste da dodate odgovarajui indeks. To je objanjeno u nastavku ovog poglavlja. MySOL-ov ugraeni mehanizam optimizovanja upita
U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, to znai da MySQL prim.enjuje na upite vie pravila optimizovanja.
e se iz tabele department uitati 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 utvruje koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro-
cons t, to znai da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da cena pogrena, odredbom STRAIGHT JOIN izriito zadajte redosled spajanja tabela.
sc zato ta tabela moe tretirati u upitu kao konstanta. Tekui tip spoja u upitu prilino Merenjem performansi upita pre i posle te izmene, utvrdiete da li time stvari pobolj
nam odgovara. avate ili pogoravate.
Kada bira indeks, MySQL trai odgovarajui indeks koji obuhvata manje od 30"/u
redova tabele. Ako ne uspe da pronae indeks koji ispunjava te uslove, sekvenCIJalno
pretrauje tabelu. (To je vidljivo iz rezultata komande EXPLAIN za prethodni pttiiH"I
upita, nakon dodavanja novog indeksa.)
18 Poglavlje 19 Optimizovanje upita

Izrazi u odredbama WHERE optimizuju se na nain slian onome na koji mnogi pre- Pitanja
vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvine
1. funkcija BENCHMARK () vraa
zagrade. To je jedan od razloga zbog kojih moete slobodno dodavati zagrade u tekst
upita da bi postao lake razumljiv. a) rezultat izraza ije izvrav;liiJL' llll'JII
Ako se potpun rezultat upita moe dobiti iz podataka sadranih u indeksima, iz b) vreme potrebno za izvravanJL' lllollol ~"JI 1111 JilL
tabela se nee u itati nijedan red. Rezultat funkcije COUNT ( *} takoe se dobija bez e) nulu, bez obzira na ulazne JW .IIIH'IIl'
itanja i prebrojavanja redova tabele jer su podaci potrebni za tu namenu smeteni d) nijedno od prethodnog
odvojeno od tabele (u indeksu).
2. Izdali ste k?mandu EXPLAIN za odredeni up1t 1 11 ~ 11 10111 1 YI' 1, ,j 11 , 1 1 d orl
Budui da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija dob1h ste t1p spoja ALL. To znai
111 1

koje MySQL obavlja, ovde ga nismo ponovili. Ali ak i taj spisak nije potpun. Ako vas
a) da e iz tabele biti uitan samo jedan IL'd
zanima kako radi optirnizator upita, moete itati njegov izvorni kod.
b) d~ e ~z tabele biti uitani svi redovi koji sadre vredu osti JL'd. 111 kt VHdnn
st1ma mdeksa
Preporuke za optimizovanje upita e) da e biti sekvencijalno pretraen ceo indeks
Postoje tri najvanije stvari koje moete uraditi da biste optimizovali svoje upite: d) da e biti sekvencijalno pretraena cela tabela
Dodajte odgovarajue indekse. Ako imate upit nad neindeksiranom kolo- 3. Izd~i ste k?man~u EXPLAIN za odreeni upit i u koloni type jedne od tabela
nom koji se esto izvrava, dodajte indeks za tu kolonu. Vie informacija o tome dob1h ste t1p spoja eq ref. To znai
kako MySQL koristi indekse nai ete u poglavlju 18, "Optimizovanje baze a) da e iz tabele biti u itan samo jedan red
podataka". Meutim, ne zaboravite sledee: iako odgovarajui indeks moe
ubrzati postupak pronalaenja podataka u tabeli, odravanje indeksa u aurnom b) d~ e ~z tabele biti u itani svi redovi koji sadre vrednosti jedanke vredno-
stlma mdeksa
stanju produuje upisivanje podataka. Nemojte dodavati indekse koji se nee
koristiti. e) da e biti sekvencijalno pretraen ceo indeks
Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana d) da e biti sekvencijalno pretraena cela tabela
u poglavlju 18.) Time aurirate podatke o raspodeli vrednosti kljueva koje 4. Izda.li ste k?mandu EXPLAIN za odreeni upit i u koloni type jedne od tabela
MySQL uva. Na osnovu tih podataka, MySQL odreuje redosled spajanja dob1h ste t1p spoja index. To znai
tabela u upitu. Ako vam se ini da MySQL spaja tabele udnim redosledom, a) da e iz tabele biti uitan samo jedan red
pokuajte s komandom ANALYZE TABLE. b) da e ~z tabele biti uitani svi redovi koji sadre 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 auri- e) da e biti sekvencijalno pretraen ceo indeks
rate statistike podatke o tabeli koje koristi optimizator upita. d) da e biti sekvencijalno pretraena cela tabela
S. ~ezultati komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimal-
Saetak mm redosledom. Zbog toga bi trebalo da
Otkrijte spore upite pomou funkcije BENCHMARK (} ili dnevnika sporih upita. a) izdate komandu ANALYZE TABLE za obe tabele
Pomou komande EXPLAIN utvrdite kako se upiti izvravaju b) izriito zadate redosled spajanja pomou odredbe STRAIGHT JOIN

Ubrzajte izvravanje upita dodavanjem indeksa a zatim ih ponovo ispitajte e) ili a) ili b)
pomou komande EXPLAIN. d) ni a) ni b)
Komande ANALYZE TABLE i OPTIMIZE TABLE pomoi e MySQL-ovom optimi-
zatoru upita da dobro obavi svoj posao.
240 Poglavlje 19 Optimizovanje upita

Spisak termina korienih u knjizi


Vebe
Pogledajte sledei upit:
alijas alias nedelji vost atomicity
select department.name atribut, obeleje attribrtle niti izvravanja thread s
from client, assignment, employee, department
b-stablo b-tree obeleje, 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 kljueve key br"!!fer otpornost sistema fau/t tolerance
and employee.departmentiD = department.departmentiD; bafer za sortiranje sort br!ffer na greke
Pomou funkcije BENCHMARK vie puta izmerite vreme izvravanja ovog upita bafer za zapise record br!lfer podu pit subquery
i pomou komande EXPLAIN utvrdite kako se on izvrava. Proverite da li moete blokiranje sledeeg next key /ocking polje field
poveati brzinu izvravanja dodavanjem novog indeksa i ponovnim merenjem. kljua ponititi roll back
itanje sadraja tabele table scan potvrditi commit
sekvencijalnim preklapanje izmeu fa ilo ver
Odgovori redosledom dva servera
datoteka slike sta~a dumpfile "na vrue"
Pitanja Dekartov proizvod Cartesian product prenosni dnevnik re/ay log
1. e dnevnik greaka error log pretraiva~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 vie glavnih multimastering
5. e funkcionalna functional servera istovremeno
zavisnost dependency rasporeivanje load balancing
glavni server master optereenja
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 kljueve candidate keys spoJ join
klju key spoljni klju foreign key
koeficijent poveza- relevance value superklju superkey
nosti s traenim ema baze podataka database schema
poJmOm tabela table
kolona column ugneen upit nested query
korelira n correlated unakrsni spoj, full join
maina za skladitenje storage engine pun spoJ
merenje performansi benchmarking zapis, slog record
n-torkc tup/es zavisni server slave
nebitne rei stop words
SVEUCIIlNA 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, podeavanje 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
aritrnetiki operatori, 110
-(oduzimanje), operator, 110 pomo{u duevuika iz meua,
atributi, tabele baze podataka, 31
+ (sabiranje), operator, 110 194-195
AUTO INCREMENT, rezervisana
; (taka i zarez), 46 mi1o, 19 3-194
re, 49-51
>(vee od), operator, 111
autocornmit, reim 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
auriranje 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 (trea normalna forma), optimizovanje
bafer za itanje, 224 iudeksi, 229-230
37-38 bafer za kljueve, definicija, 223 izbori pri projektovarlju, 228
bafer za sortiranje, 224 komat~da OPTIMIZETABLE
A baferi, 223 230
basedir, opcija, podeavanje
preporuke, 227-228
MySQL-a, 172
abs(), funkcija, 118 principi projektovanja
baze podataka
ACID usklaenost, 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
vaua pitmya, 32
MySQL server, pokretanje prikazivmlje podataka o bazi,
relacije
i sputanje, 177-178 178-180
d~f/uiciia, 29
pranjenje 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" vie 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 stmya, pravljerye,
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
unitavanje niti, 182 rasporeivatlje opterdetlja, 2 15
alijasi, komanda SELECT, 82-83 brisanje, 56
upotrebljive verz;;e MySQLtt,
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 auriranju podataka, 34 izrada, 55-56 (RDBMS),11
pri brisanju podataka, 34 ema, dcfinkJ-, 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, redunduutuwt.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
numerike, 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 izvravanju upita, 235-237 logitki, 112 HAVING, odredba, konmnolu
CASE, funkcija, 113 DELAY KEY WRITE opcija,
kljuevi, 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 ciklina promena datoteka desni spoj, 98-99
fantomski podaci, nivo round(),118 I
izolovanosti transakcija, 151
n-torke, 31 dnevnika, 183 dinamike 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 greaka, 183 razlikovanje malih i velikih slov:1,
prav!ietife, 44-52 FLUSH, komanda, pranjenje trim(),114
preimeiiOIJ(Itife, 57 convert(), funkcija, 120 log-bin, opcija, podeavanje ugraene, 109
42
ostava, 182-183
count(), funkcija, 122 MySQL-a, 172 rezervisane rei, 43
redovi, 31 FLUSH PRIVILEGES, komanda, upper(), 114
CREATE, pravo, 159 log-error, opcija, podeavanje 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 pomou koma11de 193 za rad sa znakovnim vrednostima
CREATE TABLE, SQL-ova podeavanje 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,
podeavanje MySQL-a, 173 found rows(), funkcija, 121 74
redovi, uita""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,gmpismye, 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 izvravanja, 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 viekolonski, 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 obine korisnike, 159 ceiling(), 118 podeavanje, 209-212, 215
benchmark(), funkcija, 121, 234 EXPLAIN, 237
datadir, opcija, podeavanje tabele prava, 161 concat(), 114 globalna prava
llcrkeleyDB (BDB), tip tabela, 50, INDEX DIRECTORY, opcija,
135 MySQL-a, 172 za pojedinane baze podataka, 160 convert(), 114,120 dodeljivanje, 160
zatita servera, 202 optimizovanje tabela, 51
IIIGINT, celobrojni tip podataka, DATETIME, tip podataka, 55 za pojedinane kolone, 161 counc(), 122
Google, Web lokacija, 135 InnoDB, konfiguracione opcije,
53 datoteke za replikovanje, 211 curdate(), 119
GRANT, komanda podeavanje 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, podeavanje drop database, komanda, 45, 56 encrypc(), 121 odredba ON,158
odredba REQUIRE, 159 dosledno uitavanje bez
b.t7C podataka, komanda use, 43 MySQL-a, 169-171 DROP INDEX, komanda, 56 extract, 11 9 zakljuavanja 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 vie 194 found rows(), 121
odredba WITH GRANT ACID uskladeuost, 149-/50
DLOB, tip podataka, 54 inst.:llacija na istom raunaru, 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, podeavanje 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 zakljuavanje 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 pomou dnevnika izmena, kolone za pravo, 162 L min(), funkcija, 122 opcija --cxtcndd ""'"" l 'J l
listing, 6S-66 194-19S kolatze za uspostavlj"anje zaftiene mnoenje (*),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
opti oblik, 68 runo, 193-194 uitavanje podataka iz odredenih My ISAM, tip tabela, SO opcija --opt, 188
length(), funkcija, 114
primer rezultata, 67 skript mysqldump kolona, 80 dinamike, 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 poboljanja 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 statike, 129-130
17 opcija --databases, 192 TEXT, 54 LINES, odredba, komanda LOAD tekstualno pretraivanje, 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 ograniavanje 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 zatiene 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
podeavanje 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, zatita 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
ftzika zatita, 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 mogunosti, 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 podeavanje MySQL-a, reenje s poslove, 17-18 SET, podeavanje promenljivih,
u aplikaciji, 204 program mysqlcheck, 197 EXPLAIN, 23S-237 datotekom opcija, 169-171 podefavo1zje sistema, 14-16 182
SSL (Secure Sockets Layer), 20S zakljuavanje tabela, 188 FLUSHTABLES,137, 193 primer komande INSERT, 6S-66 provera da li sistem radi, 16-17 show processlist, niti, 181
internacionalizovanje, podeavanje testiranje kopije, 19S FLUSH, pranjenje ostava, LOAD DATA INFILE, komanda, izvrive datoteke, 20--21 show variables, 180
MySQL-a,174 izvrive datoteke, MySQL-ove, 182-183 73-7S korisniki interfejsi SQL-ove
ISAM tabele, SO 20-21 LOCKTABLES,148-149,193 load file(), funkcija, 114 MySQL Control Ce11ter, 21 CREATE DATABASE, 43
ogranienja, 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
podeavanje
I111zoDB, 172-173
INSERT, 68-69
R.ESET, pranjenje ostava, REPLACE, 70
podataka, 228 jednako (=), operator, 111 182-183 logiki operatori, 112 itttemacioualizovanje1 17 4 SELECT, 8{}-89
izolovanost, nivoi (transakcije), jednakovredni spojevi, 97 SET logiko tekstualno pretraivanje, 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 reim 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 rei, tekstualno
kandidati za kljueve, 31 SHOW,23,180
repeatable read, 1 SO komanda INSERT, 68 169-171 pretraivanje, 132
karet (A), znak, 116 START TRANSACTION, 147
serializable, 1SO komanda LOAD DATA INFlLE, server niti, unitavanje, 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
kljuevi, kandidati za kljueve kopije tekueg stanja, pravljenje, server, optimizovanje definicija, 34
indeksa, SS-S6 212-214 ifrovanje, 203 druga normalna forma (2NF),
i superkljuevi, 31 parametri servera, 222-224
kopije tekueg stanja, korisniki 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 uobiajene poslove, 34-36
17-18
podataka, S4 MySQL monitor, 21-23 M struktura direktoriju ma, 19-20
trea normalna forma (3NF),
kljuevi, superkljuevi, 31 phpMyAdmin, 21 MySQL Control Center, 21
tabele korisniki nalozi. Videti i prava MySQL monitor, 21-23 37-38
numeriki 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, podeavanje 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 zatita 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 numerike 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(toiW/JI' lo i11kl, ?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, konnpu rczervia11e rei, kun lchntlllklltnrl
i terminolo~-:ija, 31 43 l
operatori 100-101 (BCNF), 38
obrnute kose crte (\), 67 uitavanje, H3- H4 RLIKE, lunkdjn, 11 ~ 117
aritmetiki, 11 O vrste, 99 dn<ga llormalllajorma (2NF),
odredbe umetanje u t.tbdu, !.S ()\1 ROLLBACK, rezt'rvhmrm t4~l', l.ff 1
logiki, 112 za izraze logikog tipa,101-103 36-37
DEFAULT, komanda INSERT zamenjivanje, 70 root, nalog, lozinkn :ru, 17, lfP
69 ugraeni, 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 trea 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 vana pitanja, 32 relacije MySQL-a iz, 12
IN FILE, 74
FROM
izbod pn" projektova11ju, 22 8 mogunosti, 19S ' pristup datotekama, definicija, 29 runa izrada rezervnih kopija
korna11da OPT/M/ZE TABLE, program myisamchk, 196-197 ograniavanje, 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 vie", 29-30 193-194
11 podupitima za izvedme tabele,
prepon1ke, 227-228 popravljanje My!SAM tabele, 130 transakcija, 152 ttpa "vie prema vie", 29-30
100
izrada tabela, Sl
GROUJ> BY, komanda SELECT,
86-87
MySQL servera
poreenje s dokerskim znacima,
funkcija UKE, 115
PROCESS, pravo, 160, 203
promenljive, podeavanje
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 poreenjc sa opsegom vrednosti, repeatable read, nivo izolovanosti
GRANT,158 operatori za poreenje, 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 mogunosti, 19S bezbednosne mere, 211 odredba HAVING, 87
koma11da OPTIMJZETABLE,
komanda DELETE, 72 za pojedi11a1'11e baze podataka, program myisamchk,196-197 budunost, 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 opti oblik, 80
ugrae11 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 tekueg 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, pranjenje, 182-183 tabele, 160,161 Q otpornost na greke, 209 SELECT, pravo, 159
koma11da LOAD DATA otpornost na greke, replikovanje, tabela colunms_priv, 164 podeavanje zavisnih servera, 214 select_type, opcija, komanda
INF/LE, 74 QUICK, odredba, komanda preklapat~e servera na vrue, 21 7 EXPLAIN, 236
209 tabela db, 163 DELETE, 72
koma11da UPDATE, 72 ovlaenja, 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 sloenije 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, viestruki glavni serveri, 217 MySQL
zasuta RAID diskovi, preporuka, MySQL
komanda DELETE, 72 optirnizovanje tabela, 51 zavisni serveri, pokretanje, 214 pokretarye 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, pranjenje 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, korisniki interfejs, EXPLAIN, 237 REVOKE, komanda, 161 pokretmife, 214
REQUIRE, komanda GRANT, 21 preimenovanje tabele, 57
rasporeivanje optereenja, rezervisane rei u replikovatifu, 209-21 O, 214
159 pid-file, opcija, podeavanje preklapanje na vrue, 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 unoenje, 73-75 prenosivost, My ISAM tabele, 129
pre nosni dnevnik, 21 O identifikatori, 43 AUTO INCREMENT, 49 SET, komanda
km11a11da SELECT, 83-84 podeavanje MySQL-a
pretraivanje 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 pretraivanje, 131-134 read uncommitted, nivo FOREIGN KEY, SO reim autocommit, isklju ivanje:,
WITII, komanda GRANT, 1S9 konfiguracione opcije za vie
PRIMARY KEY, rezervisana re, 49 izolovanosti transakcija, 152 FULLTEXT, SO 147
oduzimanje (-),operator, 110 instalacija na iston1 raunaru, redovi
ON DUPLICATE KEY UPDATE, principi projektovanja, baze IN,IOI serverske promenUivc,
173-174 auriranje, 72-73 podeavanje, l !!2
odredba, komanda INSERT, podataka !NDEX,50
mysqld, podeavanje 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-nnw,
opcije za lnnoDB, 172-173 72 opcija, podcJnvnllJt
optitnizovanjc tabela, St pri auriraty'u podataka, 34 SOME, 102
reenje 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 pretraivanje podupiti Windows 1\<loululoltll 1


show processlist, komanda, 181
show variables, komanda, 180
T tabela tables_priv, 164 logiko,
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 logikog tipa, 101-103 WITH, odredbu, kmmu11lt
prikazivanje sistemskih podataka
31 grupno unoenje podataka, 73-75 threads_connected, serverska za izvedeue tabele, 1OO GRANT, 159
o, 181-182
skupovi znakova, podeavanje 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 uitavanje bez redovi tipovi podataka, float, 48 spajanje vife tabela, 95-96 X
auriranje, 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, podeavanje tramakcije, 14 3-146
brismije pomou 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, podeavanje 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 ograniavanje upotrebe
dve tabele, spajanje, 93-95
jednakovredni, 97
izrada
spajanje izolova11ost tramakcija, 150-152 resursa, 162 z
komanda CREATE TABLE deSili spojevi, 98-99 reim autocommit, 147-149 kolone za opseg vidljivosti, 162
levi spojevi, 98-99 44, 48-52 ' dve tabele, 93-95 trea normalna forma (3NF), zakljuavanje 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.ltiene
samospojevi, 96 levi spojevi, 98-99 trim(), funkcija, 114 zakljuavanje podataka na nivou
primer baze podataka employee, TRUN CATE, komanda, 72 veze, 162
unakrsni spojevi, 97 ptmi spojevi, 97 usklaenost podataka, transakcije, stranice, BerkeleyDB (BDB)
44-48 type, vrednost, komanda
vie tabela, spajanje, 95-96 samospojevi, 96 150 tabele, 135
sputanje MySQL servera, 177-178
kolone EXPLAIN, 236
UllakrSIIi spojevi, 97 uslovi licence, InnoDB tabele, 135 zakljuavanje 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 numeriki 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
uitavanje podataka iz, 81-82 SSL (Secure Sockets Layer), 205
uitavanje podataka iz odredenih ubrzavanje MySQL servera, instalirane datoteke
DELETE, 70-72 upiti iji je rezultat jedna vrednost, zatita servera, 201
kolo11a, 80 221-222 jiltrirmije podataka, 204
INSERT, 65---<i9 100-101
znakovni i tekstualni tipovi ugraen mehanizam
REPLACE, 70 zakljuavanje, 188 fizika zaftita, 205
SELECT, 80-89 podataka, 53-5 4
komanda ALTER TABLE 56
tabele, podrka za transakcije
optirnizovanja upita, 237-238
ugraene 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 viekolonski indeksi, 229 SSL (Secure Sockets Layer), 205
zakiju{avarija podataka, 13 4 unakrsni spojevi, 97
START TRANSACTION, komanda LOCKTABLES, 193 viestruki glavni serveri, korisniki 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
statike 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
dinamike, 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
upcrkljuevi, 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, zatita, 205
Google,135
pregled, 129
statike, 129-130
164
taka i zarez (;),znak, 46
drtev11ik sporih upita, 234-235
dodava1ije i11deksa, 238
lnnoDB,135
znakovni i tekstualni tipovi
podataka, 53-54
tekstualtw pretraivarije, 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
podrka za transakcije, 127-128 BLOB,54 komm1da OPTIMIZETABLE Sleepycat, 135 obrada znakovnih vrednosti, 11 4
tabela tables_priv, 164 Yahoo!, 135
podupiti za izraze logikog 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