131
Pregledan uvod u MySQL-a - sistema za rad sa bazama podataka MySQLje sistem za upravljanje relacionim bazama podataka otvorenog koda , popularnost brzo raste. Poznat po brzini, pouzdanosti i upotre be, MySQL se pokazao kao pogodan i za i L. a iskusne programere jer izradu sofisticiranih Web lokac i ja i ap likaci ja koje rade sa bazama podataka. za MySQL daje jasan i sažet uvod u osnovne koncepte i tehnike upot rebe MySOL-a,. koji je u MySOL-u da pravi i administrira•složene baze podataka koje može koristiti kod na poslu ili na Webu . Bez obzira na to da li ste u oblasti baza podataka ili iskusan profesionalac koji želi da sazna više o tome kako radi MySQL, za MySOL vam efikasno pružiti sve informacije koje su vam potrebne da biste i brzo savladali MySQL. Luke Well ing i Laura Thomson , autori popu larne knjige PHP i MySOL: raz voj aplikacija za Web (Mikro knj i ga, 2004), predaju programiranje Web aplikacija, softverske inženjerstvo i elektronsko trgovanje, na RMIT univerzitetu u Melburnu, Australija. Oni su i pos lovni partneri u kompaniji Tangl ed Web Design, koja je osvojila više nagrada za svoje projekte dina- Web lokacija na kojima se koriste PHP i MySQL. i predaju na konferencijama o softveru otvorenog koda, kao što su MySQL U er Conference, PHPCon, Linux Tag i O'Reilly Open Source Convention. My Press Izdanja Mikro knjige donose informacije, pr e nose provere na iskustva i pru ža ju potrebna znanja . Obl .t\ 1: l\o11r pndoliolkol <{ (.) z >N ...., 1 1 n/ oo z z-, w l l za MySQ Pregledan uvod u MySQL a -sistema za rad sa bazama podata ko

Prirucnik Za MySQL

Embed Size (px)

Citation preview

Page 1: Prirucnik Za MySQL

Pregledan uvod u korišćenje MySQL-a - sistema za rad sa bazama podataka MySQLje sistem za upravljanje relacionim bazama podataka otvorenog koda, čija popularnost brzo raste. Poznat po brzini, pouzdanosti i lakoći upotrebe, MySQL se pokazao kao naročito pogodan i za početnike i L.a iskusne programere jer omogućava izradu sofisticiranih Web lokacija i ap likacija koje rade sa bazama podataka.

Priručnik za MySQL daje jasan i sažet uvod u osnovne koncepte i tehnike upotrebe MySOL-a,. Čitaocu koji je početnik u MySOL-u omogućava da pravi i administrira•složene baze podataka koje može koristiti kod kuće, na poslu ili na Webu.

Bez obzira na to da li ste početnik u oblasti baza podataka ili iskusan profesionalac koji želi da sazna više o tome kako radi MySQL, Priručnik za MySOL će vam efikasno pružiti sve informacije koje su vam potrebne da biste započeli i brzo savladali MySQL.

Luke Well ing i Laura Thomson, autori popu larne knjige PHP i MySOL: razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje Web aplikacija, softverske inženjerstvo i elektronsko trgovanje, na RMIT univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji Tangl ed Web Design, koja je osvojila više nagrada za svoje projekte dina­mički h Web lokacija na kojima se koriste PHP i MySQL. Često učestvuju i predaju na konferencijama o softveru otvorenog koda, kao što su MySQL U er Conference, PHPCon, Linux Tag i O'Reilly Open Source Convention.

My S~ Press

Izdanja Mikro knjige donose informacije, prenose proverena iskustva i pružaju potrebna znanja.

Obl.t\ 1: l\o11r pndoliolkol

<{ (.)

z >N ....,

1 1 n/ oo

z ~<

<{~ z-,

w

~ l l ~~·-•-L-1---------~~~~----~~---

Priručnik za MySQ Pregledan uvod u korišćenje MySQL a -sistema za rad sa bazama podata ko

Administrator
Rectangle
Administrator
Rectangle
Page 2: Prirucnik Za MySQL

Priručnik ~a MySQL®

Rc.·ccn1enL Urednik ltrd.lktori Tehnički urednik Korektor Realizacija korica l'rclom tc Ima i obrada slika

Izdavač

Direktor

Dragan Tanaskoski Olga Milanka Aleksandra Stojanović i Stela Spa.ić Sanja Tasić Vesna Đukić Vladimir Končarević Sanja Tasić Milica Dečanski

Mikro knjiga, Beograd Dragan Tanaskoski

Štampa Y G {)~O "J. ( ~u~kum, Beograd

Ako imate pitanja ili komentare, ili ako želite da dobijete besplatan katalog, pišite nam ili se javite:

Mikro knjiga l~ t:th 20-87 11030 Beograd tel: o t l /3540-544 pisma®mikroknjiga . co.yu

Mikro knjiga Jevrejska bb 78000 Banja Luka tel: 051/220-960 pisma®mikroknjiga.ba

Autorizovan prevod sa engleskog jezika knjige MySQL ®Turorial.

Mikro knjiga Maksimirska 13 10000 Zagreb tel: 01/2344-023 pisma®mikroknjiga . hr

Copyright© 2005 Mikro knjiga. Sva prava zadržana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan di rm i tovan na bilo koji način, elektronski ili mehanički, uključujući fotokopiranje, snimanje ili bilo koji drugi sistem ~.l bdcžcnje, bez prethodne pismene dozvole izdavača.

Authorized translation from the English language edition, entitled MYSQL Thtorial, lst Edition byWELLING, LUKE; THOMSON, LAURA, published by Pearson Education, Inc., publishing as MySQL Press, Copyright© 2004.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or nll'chanical, including photocopying, recording or by any information storage retrieval system, without permission from l'r.mon Education, Inc.

CIP- KaTanorH33l(ltja y ny6nHK3l(ltjH l IlapoAita 6116mwTeKa Cp6Hje, 6eorpa11

004.655.3(035) 004.652.4(035)

BEJ111Hr, nyK Priručnik za MySQL l Luke Welling, Laura

Thomson ; preveo Andon Kartalovski. -Beograd : Mikro knjiga, 2005 (Beograd : Publikum). - XI, 251 str. : ilustr. ; 24 cm

Prevod dela: MySQL Tutorial. - O autorima: str. YI. - Registar.

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

MSQL/251/1280412M33010P78S6K54 S 4 3 2 1

KN lio

O autorima l ul Vl•ling (Luke Wclling) predaje u Školi za računarske nauke i informacione tehno­l Pl'- 'll' ttniwr;ritct:-t RMIT u Melburnu, Australija. Kad god smatra da je izvodljivo, opre­tl• IJIIJt' Sl' "a softver otvorenog koda i nastoji da objasni prednosti takvog rešenja što "' 111 ~ lllp;u korisnika. Na predavanjima u Australiji, Severnoj Americi i Evropi, obja­IIJIV.lll .Jl' MySQL, PHP i druge teme iz oblasti softvera otvorenog koda. Studentima

1 11111 llJ .lCIIlla držao je predavanja iz raznih oblasti, ali uža specijalnost mu je Internet.

l '"''Tomson (Laura Thomson) predaje u Školi za računarske nauke i informacione r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je više predmeta iz ,,,,J.,~tt Weba i Jnterneta, a priprema doktorat na temu pretraživanja Weba. Učestvuje na , 'w 1111 konferencijama širom sveta. Bila je instruktor na kursevima u organizacijama 1 d '' t ,!\dičiti m kao što su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra 1 l\11\lllll Consulting Group. Diplomirala je inženjering računarskih sistema i računar­l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menažeriju kućnih ljubi-

ilt.ll 1, .1 ponekad priča s Lukom i o stvarima sasvim izvan sveta tehnike.

Od istih autora

1'111 1 i MySQL l lltvo~J •l'lrk.tcija zn Web

Među knjigama o izradi Web aplikacija korišćen jem P HP-a i MySQL-a, ova knjiga ima najbolje ocene na lokacijama Amazon. com i bn.com. Posebno je dobra druga polovina knjige, u kojoj su praktčini projekti. U udžbenicima pro­gramiranja za Web, primeri su obično previše jednostavni za praktičnu primenu - ova knjiga sadrži i jednostavne pri­mere na kojima se objašnjavaju svojstva jezika, ali i nekoliko gotovih kompletnih aplikacija koje prikazuju kako se prave veliki projekti .

Administrator
Rectangle
Administrator
Rectangle
Page 3: Prirucnik Za MySQL

a drža j

Uvod ........ .

Osnove MYSQL-a

Instaliranje MySQL-a

. 1

. 9

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

l Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Struktura MySQL-ovih direktorijuma ............................ .. 19 Pregled izvršnih datoteka ....................................... 20 Pregled korisničkih interfejsa .................................... 21 Kratak uvod u MySQL monitor .................................. 22 Sažetak .................................................... 23

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

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

·• Pravljenje baza podataka, tabela i indeksa ............ 41 Razlikova~ e malih i velikih slova ........ .. ....................... 42 Jdentifikatori u MySQL-u ................................. . .... 42 Prav ljenje baze podataka ........................................ 43 O iranje baze podataka .......................................... 43 Pravljenje tabela .................................. . ........... 44 Tipovi podataka u kolonama .... . ............. . . .. .. . ... ........ 52

Page 4: Prirucnik Za MySQL

l'r,1v~jenje indeksa .......................... , , , h 1nk tl)t.: za r.1d s d.11111111111 ,1 1 VIti lit 111111 .1, .. . ...... ..•.............. ll <J

Brisanje baza podataka, tabela i indeksa ............. , , , , . , .. , . , . , , ~() J'nnktq<.: za kouv~:uqu IIJHlV.I pod.tt.tka . ........................... 120 Izmena strukture postojeće tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % Sažetak ............................................... .... . 58

!>tuge funkcije . . . . . . . . . . . . .. .......... . ...... . ............. 121 l:uktijc za upotrebu u odredbi GltOUP BY ........................ 121

III Upotreba MySQL-a . ............... . 63 S.1iet1k .... ..... ... ... ... .. ..... .... ..... .. . .... .......... 122

5 Umetanje, brisanje i ažuriranje podataka . . 65 l V Tipovi tabela i transakcije u MySQL-u 125

Komanda INSERT ... .. ..... . ................... ..... ........ 65 Tipovi tabela u MySQL-u . . . . . . . . . 127 Komanda REPLACE ....... .. ............. . ... . .. ... ...... ... . 70 I~AM tabele ... ................................... .. ... ... . 128 Komanda DELETE .. .......... ............ .. .... .... . .. ... .. . 70 MyiSAM tabele ............................................. 129 Komanda TRUNCATE ........... . ... . ............. .. .. . ... .. 72 lnnoDB tabele ......... .. .. . . ..... ... .... . . ............ . .... 134 Komanda UPDATE .. .. . ....... . ......... ...... .............. 72 llerkeleyDB (BDB) tabele . . . ...... . . . ......... .. . . ............ 135 Grupno unošenje podataka pomoću komande LOAD DAT A INFILE ...... 73 MER.GE tabele .............................. ... ............ 136 Sažetak ...... .. .. . ... . . .................................... 75 l l EAP tabele .. ........... .................................. 138

6 Korišćenje upita u MySQL-u ..................... 79 S;tŽetak ........... . ... .... ........... . . .. ................. 138

Opšti oblik komande SELECT . . ... . . ............................ 80 l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143 Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80 Učitavanje podataka iz određenih kolona .... .. .. . .... . .. .. ...... . .. 80

Staje transakcija? ... . ..................... ..... ...... .. ...... 143 Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146

Apsolutna imena baza podataka i tabela ............................. 81 Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149 Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82 Sažetak ............. .... . . .... .. .......................... 152 Upotreba odredbe WHERE za učitavanje samo određenih redova ...... . .. 83 Uklanjanje dupliranih vrednosti pomoću opcije DISTINCT .. . .......... 84 V Administriranje MySQL-a ... 155 Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86 Izdvajanje određenih grupa podataka pomoću opcije HAVING ... ... .. ... 87 Sortiranje učitanih rezultata pomoću odredbe ORDER BY . . .. . . . ....... 87 Ograničavanje broja redova rezultata pomoću odredbe LIMIT ........ .. .. 88 Sažetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89

ll Upravljanje pravima korisnika 157 l'ravljenje korisničkih naloga pomoću komandi GRANT i REVOKE ... .. 157 Nivoi prava ................................................ 159 Utvrđivanje ukupnih prava . .. ......... ... .... . ... .... .......... 160 Upotreba komande REVOKE .......... .......... . ............. 161

7 Složeniji upiti . ............................... 93 Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161 Upotreba spojeva u upitima koji obuhvataju više tabela . ... ............. 93 Sažetak ........... ... . ........... .... . ........ ......... .. . 165 Vrste spojeva između tabela ...... . .. ............... ... ...... . .. . 97 Podupiti ........... ...... .......... . . . ..... . ............... 99 Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103 Sažetak ........... . .. . ....... . ... · . ... . .. .. .... . . , ......... 104

12 Podešavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169 Podešavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169 Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172 Konfiguraciane opcije za više instalacija na istom računaru ....... . .... .. 173

8 Upotreba MySQL-ovih ugrađenih funkcija Internacionalizovanje ......................................... 174

u komandi SELECT ................... ..... 109 Sažetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4

Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O Funkcije za upravljanje tokom izvršavanja komandi ....... ..... .. .. . .. 113 Funkcije za rad sa znakovnim vrednostima ........................ . 114 Numeričke funkcije ... ........... . .. ...................... .. . 117

13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177 Pokretanje i spuštanje MySQL servera ............................. 177 Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178 Podešavanje serverskih promenljivih ......... . .................. . . 182

Page 5: Prirucnik Za MySQL

Uništavanje niti .................................. .. , , . , ... .. 182 Pražnjenje ostava ............................................ 182 Datoteke dnevnika ........................................... 183 Sažetak ................................... . ............... 184

14 Izrada rezervnih kopija i obnavljanje podataka ........ 187 Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187 Testiranje rezervne kopije ... ...... ..... ....................... 195 Proveravanje i popravljanje tabela .. ... ... ........................ 195 Sažetak ............. . .............................. .... ... 198

15 Zaštita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201 Kako sistem prava korisnika deluje u praksi ......................... 201 Zaštita korisničkih naloga ...................................... 202 Zaštita instaliranih datoteka ..................................... 203 Filtriranje podataka koje korisnici šalju ............................ 204 Drugi saveti ........................................... ..... 205 Sažetak . . . . . . . . . . ......... . ...... .. ....................... 206

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

VI Optimizovanje MySQL-a . ....

17 Optimizovanje MySQL servera.

219

221 Prevođenje i povezivanje koda radi povećavanja brzine rada ............. 221 Podešavanje parametara servera .. . ....... . ........... . ........... 222 Podešavanje drugih činilaca .................................... 224 Sažetak ......... ... .. ............................ .... ..... 224

18 Optimizovanje baze podataka . . . . . . . . . . . . . . . . . . . 227 Šta usporava MySQL-ove baze podataka .......... ... ....... .. ..... 227 Pravilni izbori pri projektovanju baze podataka .. . ................... 228 Indeksiranje u cilju optimizovanja ......... .... ................... 229 Komanda ANALYZE TABLE .. . .............. . ................ 230 Komanda OPTIMIZE TABLE ... . . ... . ......................... 230 Sažetak .. ........................... . ..................... 230

19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Otkrivanje sporih upita ..................... . ..... .... ........ 233 Merenje performansi upita ............................ . ........ 234 Upotreba dnevnika sporih upita ...................... ... ........ 234 Upotreba komande EXPLAIN za prikazivanje načina na koji se

upiti izvršavaju .. ............. . ....... . ............ . ...... 235 MySQL-ov ugrađeni mehanizam optimizovanja upita ................. 237 Preporuke za optimizovanje upita ................................ 238 Sažetak . . .... . .......................... .. ................ 238

Spisak termina korišćenih u knjizi . 241

Indeks ................... . 243

Page 6: Prirucnik Za MySQL

Uvod

D~ lill O DOŠLI U PRIRUČNIK ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da 1111 omogući da brzo uhvatite korak s MySQL-om. MySQL ćemo objasniti tako da 1 ptlhližimo i krajnjem korisniku i administratoru sistema.

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

• ~bog čega biste se opredelili za MySQL

• /.ašto baš MySQL a ne neka druga baza podataka

• !'lt a je drugačije u MySQL-u 4.0 i 4.1

• Koje nove mogućnosti tek treba da se pojave u budućim verzijama

• Kome je ova knjiga namenjena

• l<.1ko treba koristiti ovu knjigu

• N<lpomena u vezi s načinom licenciranja MySQL-a.

Zbog čega biste se opredelili za MySOL 1) "'<)L je odličan proizvod iz oblasti baza podataka. Postoji više razloga zbog kojih

l11 lt ' \l! opredelili da MySQL bude vaš server baza podataka. MySQL je brz i stabilan. To je ključni razlog njegove popularnosti. Februara 2002.

•!ullltL', časopis eUiek (www. eweek. com) napravio je uporednu studiju nekoliko tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov

1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najviše ukupne H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je još brži.

M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL 1111 tZt' st: nabaviti pod uslovima GNU opšte javne licence (General Pu blic License, l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, možete je kupiti.

MySQL pruža veliku većinu mogućnosti koje se smatraju važnim u oblasti baza ('•ul.ti.lka, a to su transakcije, zaključavanje na nivou pojedinačnih redova, spoljni klju­' l 1, podupiti i tekstualno pretraživanje.Verzija 5.0 će na ovaj spisak dodati i uskladi-l Ill' procedure.

MySQL omogućava dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao što 11 Y.dlOo! Finance, Slashdot i US. Census Bureau.

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

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

Page 7: Prirucnik Za MySQL

Zašto baš MySQL a ne neka druga baza podataka Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim detaljima, ali MySQL nudi kombinaciju performansi, cene i mogućnosti koju bi drugi sistemi teško nadmašili.

Performanse MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju najbrže baze podataka na svetu, što, u zavisnosti od vašeg stepena lakovernosti, samo dokazuje jednu od sledeće dve tvrdnje: programi za testiranje mogu se napisati tako da rezultati dokazuju šta god naručilac programa zahteva, ili da se različiti proizvodi pokazuju kao savršeni u različitim uslovima upotrebe.

Na MySQL-ovj zvaničnoj Web lokaciji možete pogledati rezultate poređenja per­formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom primctno nadmašuje svoje takmace. Iako u načelu rezultate bilo kojeg testiranja treba prihvata ti "sa zrnom soli", što naročito važi za rezultate testova koje je izvršio proizvo­đač baze podataka, svi dokazi na raspolaganju, uključujući i nezavisne testove, poka­zuju da je MySQL jedan od najbržih proizvoda na raspolaganju.

Rezultate testiranja možete videti na Web lokaciji:

www.mysql.com/information/benchmarks.html

a ti podaci su priloženi i uz datoteke izvornog koda koje preuzim.ate, što vam omogu­ćava da ih uporedite s rezultatima koje dobijete u svom radnom okruženju.

Rezultati testiranja koje je izveo časopis e Week 2002. godine pokazali su da je MySQL uporediv sa Oracleom kada se koristi kao pozadinska baza podataka za Web aplikacije napisane na jeziku Java koje rade na Windows računaru s četiri procesora. Navedena dva proizvoda su nadmašila IBM-ov DB2, Microsoftov SQL Server i Syba­seov ASE. U nastavku ovog teksta biće više reči o ce nama, ali vredi napomenuti da je od svih proizvoda obuhvaćenih tim testovima, jedan od najboljih bio besplatan, dok su cene drugih bile reda veličine 160.000 dolara (40.000 dolara po procesoru).Više detalja o tome naći Ćete na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp.

Brzina je oduvek bila ključna odlika o kojoj projektanti MySQL-a vode računa. U MySQL se ugrađuju nove mogućnosti samo ako nisu na štetu performansi. Zbog toga se ponekad nove mogućnosti dodaju sporije nego što to korisnici žele, ali se time obezbeđuje da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno ćete se i sami složiti na osnovu svog iskustva ili testova koje sami izvedete.

Cena Cena je stavka koja se možda najlakše poredi. Za mnoge uslove upotrebe, MySQL je besplatna aplikacija. Uslovi licence tipa GPL omogućavaju da neograničeno koristite softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima takođe pod GPL uslovima. U određenim situacijama, npr. kada želite da distribuirate MySQL kao sastavni deo komercijalnog proizvoda, moraćete da kupite komercijalnu li cencu. Cena licence za jedan server je od 220 do 440 dolara (u vren~e pisanja ove

knjige), što zavisi od toga da li koristite tabele tipa InnoDB. Drugim rečima, za MySQL postoje dva sistema licenciranja, gde je besplatna upotreba određena GPL uslovima, a način komercijalne upotrebe određen je standardnim sporazumima EULA (End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM (Original Equipment Manufacturer- izvorni proizvođač opreme). Pravilo kompanije MySQL AB je sledeće: "Ako je vaš proizvod besplatan, i naš je; ako se vaš proizvod pb ća -naš takođe".

Najvažniji konkurenti nude isključivo komercijalne licence, uz složene sisteme t ena, koje zavise od nameravanog načina upotrebe, broja procesora po serveru i broja Istovremenih korisnika koji će uspostavljati veze s bazom podataka. Troškovi za Ora-t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu dostići desetine hiljada dolara u okruženju sa umerenim opterećenjem, pa čak i stotine hiljada dolara za server s više procesora na koji se povezuje veći broj klijenata.

MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao Što su l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.­,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1

odštetu u slučaju neispravnosti, kao što zahtevaju velike organizacije. Još jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze

podataka koje nisu namenjene radu u klijent/server okruženju, a ciljna tržišna grupa su im kućni korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro. Mada se grafički korisnički interfejs programa iz ove kategorije Često jednostavno upotrebljava, njima uglavnom nedostaje važna funkcionalnost i nisu dovoljno stabilni, skalabilni i brzi da bi bili upotrebljivi za aplikacije od ključne važnosti za firmu.

Stabilnost Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog značaja .

Sve verzije MySQL-a izdate u binarnom obliku - čak i alfa izdanja - moraju proći MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih osobina, kao i ispitivanje rezultata operacija pri kojima su u prošlosti otkrivene i ispra­vljene greške, čime se obezbeđuje da se nikad ponovo ne uvede već ispravljena greška.

Ispravljanju grešaka projektanti moraju da daju viši prioritet od drugih poslova. U suštini, projektant prekida tekući posao sve dok se ne otkloni greška koja spada u njegovu oblast stručnosti. Pravilo nalaže da svako izdanje MySQL-a mora biti oči­šćeno od dotad poznatih grešaka koje se mogu reprodukovati u poznatim uslovima. R.azume se, određeni problemi ne mogu se rešiti a da pri tom ne pro uzrokuju druge probleme na drugom mestu. To naročito važi za produkcione verzije u koje ne bi tre­balo ugrađivati suštinske izmene koje bi mogle da utiču na stabilnost verzije. U takvim slučajevima, problem se dokumentuje i otklanja u jednoj od narednih verzija.

I najzad, kvalitet softvera obezbeđuju MySQL-ovi klijenti i zajednica korisnika. Preko četiri miliona korisnika širom sveta rade u veoma različitim okruženjima, što pruža jedinstvenu priliku za otkrivanje grešaka već u početnim fazama razvoja. Budući da je MySQL-ov sistem za otkrivanje i dokumentovanje grešaka javan, svaki korisnik ima uvid u sve što su drugi korisnici otkrili i može da dodaje svoje napomene.

Page 8: Prirucnik Za MySQL

Lakoća upotrebe Druga ključna odlika MySQL-a jeste lakoća upotrebe. Nije potreban sime.: n post upak podešavanja da biste počeli da radite. MySQL server radi kako treba čim ga "rasp~ku­jete". Standardne vrednosti parametara su takve da minimizuju utrošak prostora na disku i memorije. Razume se, da bi se postigle optimalne performanse određenih funkcija koje su važne u produkcionom okruže~ u. kao što je npr. prijavljiva~e kori­snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti radnih parametara MySQL-a. Pri tome vam mogu pomoći primeri konfiguracionih datoteka koje dobijate uz MySQL.

Mogućnosti

Poređe~e mogućnosti softvera umnogome zavisi od toga koje mogućnosti smatrate važnim. MySQL pruža određene mogućnosti, kao što su tekstualno pretraživanje, replikovanje i podrška za veoma obimne tabele, kojih u drugim jeftinim proizvodima uopšte nema ili ne rade najbolje. Međutim, MySQL-u nedostaju neke mogućnosti kao što su uskladištene procedure i pogledi, koje su standardne u najskupljim proizvo­dima, a postoje čak i u nekim jeftinim proizvodima. Neke od tih nedostajućih moguć­nosti (kao što su uskladištene procedure), planirane su za naredne verzije, dok će za druge (kao što su pogledi) biti potrebno više vremena. Neke MySQL-ove mogućnosti (na primer, zaključavanje na nivou reda) ne postoje čak ni u najskupljim sistemima.

Na Web lokaciji posvećenoj MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/

information/features. html, na kojoj ćete naći uporedni pregled mogućnosti MySQL-a i dvadesetak konkurenata, da biste videli šta se sve nudi. U nastavku dajemo kratak spisak mogućnosti koje ne podržavaju svi MySQL-ovi konkurenti i spisak mogućnosti kojih nema u MySQL-u a postoje u drugim proizvodima.

MySQL 4.1 nudi sledeće:

• transakcije u skladu s grupom pravila ACID

• podršku za različite platforme

• replikovanje

• podršku za obimne tabele i baze podataka

• tekstualno pretraživanje

• podupite

• podršku za većinu sintakse po standardu SQL 92.

MySQL zasad još ne nudi sledeće:

• poglede

• uskladištene procedure

• okidače

Šta je drugačije u My -u 4.0 i 4.1 MyS )L 3.23 je dugo hio J111HIIIkt 11111.1 V« lii:ij ,l , M.11t.1 2003. godine izdat je MySQL 1 O, 13, kao produkcion.1 Vl'11ij.1 l () All.1 Vl'lli,J.I 11.1 11.data je aprila iste godine.

Ako ste koristili veri. lJ ll \ ~> \, 11 Vl' lilJI tl .O uočićete sledeće značajnije izmene:

• U standardnu binarnu verziju ugrad ena je mašina baze podataka Inn oD B, koja je već bila ugrađena u neke kasnije verzije 3.23. Mašina baze podataka InnoDB podržava pravila ACID, što znači da podržava transakcije, spoljne ključeve i zaključavanje na nivou redova tabele.

• MySQL sada koristi ostavu (keš) za upite, u koju smešta rezultate upita za kasniju ponovnu upotrebu, čime znatno poboljšava performanse uobičajenih upita.

• Tekstualno pretraživanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj­šani su dodava~em opcije Boolean.

• Tabele tipa MERGE sada podržavaju komande INSERT i polja AUTO_INCREMENT.

• Skupovi rezultata dobijeni pomoću upita SELECT sada se mogu spajati pomoću opcije UNION .

• Sada možete da br iš ete redove iz više tabela istovremeno pomoću jedne komande DELETE.

• Poboljšano je upravlja~ e pravima korisnika. Doda to je više novih vrsta prava, što omogućava finije podešavanje, a odsad možete da ograničite i resurse kojima korisnik ima pristup.

• Odsad možete da menj ate konfiguraciju servera bez ponovnog pokretanja servera.

• Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo­gućava da ugrađujete MySQL u svoje programe.

• Replikovanje, koje postoji još od verzije 3.23.15, poboljšano je na više načina, uglavnom otklanjanjem grešaka. Na primer, sada možete da podesite bazu ka~ prijemnik podataka pomoću opcije LOAD DATA FROM MASTER, umesto pomocu komande mysqldump ili alatke mysqlsnapshot.

Napravljeno je i puno drugih manjih izmena i poboljšanja. . . Verzija 4.1 donosi još neka dodatna poboljšanja. Najvažnija izmena Je dodavanJe

pod upita i izvedenih tabela. Odsad imate i podršku za Unicode, po~.~šku za fo_:m~t OpenGIS za skladištenje geografskih podataka i mnogo drugih sitmJih poboljsanJa.

Koje nove mogućnosti tek treba da se pojave u budućim verzijama Verzija 5.0 je zasad u predalfa fazi, ali možete preuzeti izvorni kod da biste s njim ckspcrimentisali. Najznačajnija izmena koju donosi verzija 5.0 jeste do.datak u~kla­dištenih procedura, što je već ugrađeno u predalfa verziju. Planirane su 1 druge 1zm~ne medu kojima su podrška za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1 druga manja značajna poboljšanja.

Page 9: Prirucnik Za MySQL

Trebalo bi da verzija 5.1 omogući definisanje spoljnih ključeva Ll sv lill Vl st.llll.l tabela (među mnogobrojnim drugim novim mogućnostima). Pogledi će biti podrža ni u jednoj od budućih verzija S.x.

Kome je ova knjiga namenjena Ova knjiga je jedinstvena jer se sastoji od niza kratkih i sažetih poglavlja, a svako je usredsređene na određenu temu i prevashodno opisuje kako se rade određeni poslovi. Svako poglavlje završava se pitanjima i vežbama koje se odnose na gradivo poglavlja, što vam omogućava da ispitate da li ste dobro razumeli koncepte izložene u poglavlju.

Ukratko, naša namera je da knjiga bude kratak priručnik za pametne ljude. Ova knjiga nije referentni priručnik. Ako vam to treba, pogledajte odličan priručnik o MySQL-u na zvaničnoj Web lokaciji. Zaista nema potrebe da ponovo pronalazimo rupu na saksiji.

Usredsredićemo se na sledećih pet ključnih oblasti: instalisanje i konfigurisanje MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a. Opisaćemo sva suštinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a.

Ovu knjigu možete koristiti kad god vam zatreba da uradite određeni posao koji se ti če upotrebe MySQL-a u novom projektu, ili ste prešli na nov posao, ili nemate dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je napisana tako da vam pomaže da uradite određeni posao.

Kako treba koristiti ovu knjigu Ova knjiga je podeljena na pet delova:

U prvom delu", Osnove MySQL-a", naučićete kako da instalirate i podesite MySQL na svom sistemu, i upoznaćete MySQL na osnovu kratkog opisa.

Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz postupak projektovanja i izrade baze podataka. Čitaocima koji imaju iskustva u pro­jektovanju baza podataka biće dovoljno da samo površno pogledaju ovaj deo, ali ako ste početnik u oblasti baza podataka, savetujemo da ga detaljno proučite .

U trećem delu",Upotreba MySQL-a", naučićete kako da koristite podatke iz MySQL-a u svakodnevnim poslovima.

Četvrti deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u koriste pojedine vrste mašina baza podataka, sa posebnim osvrtom na mašinu InnoDB i njenu upotrebu za transakcionu obradu podataka.

Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da oba­vlja administrator MySQL-ove baze podataka, kao što su upravljarUe korisnicima, podešavanje, održavarUe baze podataka, izrada rezervnih kopija i restauriranje baze podataka, zaštita baze podataka od neovlašćenog pristupa i replikovanje podataka.

Šesti deo",Optimizovanje MySQL-a", pomoći će vam da dobijete maksimum od MySQL-ove baze podataka tako što optimizujete podešavarUa servera, baze podataka i upite u svojim uslovima.

N,1 kraju svakog poglavlja, nalazi se niz pitanja i praktičnih vežbi u vezi s gradivom poglavlja, da biste mogli da provežbate ono što ste naučili u poglavlju.

Napomena u vezi s nač i nom licenci ranja MySOL-a l· nmpanija MySQL AB, kojom upravljaju projektanti i autori MySQL-a, vlasnik je MySQL-ovog koda i dokumentacije.

Većina delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU tlpštcjavne licence (General Public License, GPL).To znači da možete slobodno kori­\111 1, kopirati, distribuirati i menjati izvorni kod MySQL-a. Ako kop irate ili distribui­l,lll' kod (ili ako kod izmenite pa ga zatim kopirate ili distribuirate), to takođe morate 1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati , 11vorni kod.

Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a možete pročitati 11 l·kktronskom obliku u MySQL-ovom referentnom priručniku, ili na Web lokaciji l ondacije za besplatan softver (Free Software Foundation):

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

Više detalja o GNU uslovima naći ćete na:

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

Ako to ne odgovara vašim namerama- na primer, ako želite da izmenite MySQL 1 d:1 zatim prodajete binarnu verziju napravljenu na osnovu izmenjenog koda, ali bez pristupa izvornom kodu- onda morate kupiti komercijalnu licencu od firme MySQL AB. Komercijalnu licencu možete kupiti i ako želite da pomognete razvoj MySQL-a.

Važno je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL uslovima, ali se može slobodno štampati za ličnu upotrebu.

Page 10: Prirucnik Za MySQL

l Instaliranje MySQL-a

2 Kratak obilazak

I Osnove MYSQL-a

Page 11: Prirucnik Za MySQL

1 Instaliranje MySQL-a

t >VOM POGLAVLJU SAZNAĆETE kako se instalira i podešava MySQL za uobičajen 111 upotrebe. Obradićemo sledeće teme:

• l11staliranje na Linux

• l11staliranje na Windows

• l11staliranje na OS X

• Podešavanje sistema

• z~davanje lozinke za nalog root

• llrisanje anoninmih naloga.

l'nu~ćemo od instaliranja MySQL-a na sistem. Ako već imate instaliran primerak <)L- a 4.1 ili neku stariju verziju, možete preskočiti tekst do odeljka "Zadavanje

Ito. lli~ l! za nalog root". l'rl'balo bi da najpre preuzmete sa Web lokacije verziju MySQL-a koja je najpogod­

lllj.r 1.1 vaš sistem. Za većinu sistema postoje verzije MySQL-a koje se distribuiraju u 1!111,11110111 obliku ili kao izvorni kod. Ako tek učite kako se koristi MySQL, prepomču-1 11111 vam da preuzmete binarnu verziju jer se znatno lakše instalira. Dodatna prednost 11 1 lo što je binarna verzija MySQL-a podešena za optimalne i stabilne perfom1anse.

l .. t svaku platformu, MySQL postoji u tri varijante: Standard, Max i Debug. Za (llllllt'IC iz ove knjige, potrebna vam je varijanta Max, u koju su uključene razne kori­lli IIIOgućnosti, kao što su InnoDB tabele koje omogućavaju upotrebu transakcija,

Int' remo vrlo često koristiti. MySQL je na raspolaganju istovremeno u više verzija: tekuća verzija, najnovija ver­

~ 'l·' 1 11ekoliko razvojnih verzija iz više faza razvoja. Ova knjiga je napisana za verziju 4.1. MySQL možete preuzeti s Web lokacije:

www mysql.com/downloads/index.html

U 11<\Stavku ovog poglavlja opisujemo kako se instaliraju binarne verzije MySQL-a l'od l inuxom, Windowsom i OS X-om. Postoji MySQL i za nmoge dmge operativne ~ 1\lt'lllL', ali detalje o načinu instaliranja morate potražiti u MySQL-ovoj dokumentaciji.

Page 12: Prirucnik Za MySQL

Instaliranje na Linux U zav_is.nosti od verzije ~inuxa koju imate i od toga koliko je sveža, vrlo je verovatno da vec J mate neku verZljU MySQL-a instaliranu na svom računaru, ali je takođe vrlo verovatno da to nije najnovija verzija.

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­ZljU RPM datoteke koju preuzmete sa MySQL-ove We b lokacije, a ne RPM datoteku koju vam je isporučio proizvođač vaše distribucije Linuxa, naročito ako tek po~i~~ete učenje .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji ažuriraju se cesc: n~go . u b1lo kojoj v distribuciji Linuxa, što znači da su u njih ugrađena najnovija poboljsanja J 1spravke gresaka . Osm1 toga, struktura direktorijuma na vašem računaru biće podešena kako je opisano u MySQL-ovoj dokumentaciji, što će vam za početak svakako olakšati traženje informacija.

_Jedna distribucija se sastoji od više RPM datoteka. Da biste mogli da koristite klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server-- VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VER­ZljA.i386.rpm. (Reč VERZijA biće zamenjena odgovarajućim brojem verzije.)

Server i klijent možete instalirati ako u komandnom okruženju otkucate sledeću komandu:

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

. Time.ćete pokrenuti i mysqld, MySQL server, i formirati odgovarajuću strukturu dJ:ektonjuma u /etc/ini t. d/ da bi se server automatski pokretao kada pokrenete racunar.

Ako želite da instalirate MySQL na neki drugi način- tj. ne iz RPM datoteka -potražite detaljnija uputstva u MySQL-ovoj dokumentaciji.

Ivmajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i da se moze. razb~ovat1 o~ onog koji možda poznajete iz verzija MySQL-a koje ste ranije mstabrah, 1h od vase verzije Linuxa.

Instaliranje na Windows ~a biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prija­Vltl na s1stem kao administrator.

Akvo već !mate .instalira~ u neku verziju MySQL-a, morate zaustaviti server pre nego sto pocnete mstal1ra11Je nove verzije. To se radi pomoću sledeće komande:

mysqladmin -u root -p shutdown

. Ako imate M~SQL ins~~iran kao Windowsov servis, moraćete najpre da uklonite taj serv1s. To mozete urad1t1 u komandnom okruženju pomoću sledeće komande:

mysqld --remove

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

l"111 \lt' imt.1lirali kao Windowsov servis. Al o višt.: volite da radite s grafičkim alatkama, servis možete da uklonite i pomoću

tl .ql t' Services Manager, koja je na raspolaganju u Control Panelu, u grupi Admini-1! .111 vc Tools Services, ili na nekim sistemima, u prozoru alatke Microsoft Manage-

litt tll Console. ltllajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i može t.tllikovati od onog koji možda poznajete iz verzija MySQL-a koje ste ranije insta­

l~t , tll 11~ svojoj verziji Windowsa. Započnite instaliranje raspakivanjem .zip datoteke

lt tp 1 ste preuzeli sa We b lokacije. lJ zavisnosti od trenutka kada ovo budete čitali, sadržaj te datoteke može biti druga-

ql. U vreme pisanja ove knjige, MySQL se instalirao pokretanjem datoteke setup.exe. ~ \• d utim, MySQL AB, kompanija koja je autor MySQL-a, planira MSI verziju instala­' tnttog programa. Ako umesto datoteke setup.exe, imate .msi datoteku, MySQL ćete 111\t.tl1rati tako što dvaput pritisnete ime MSI datoteke.

Instalacioni program će vam ponuditi opciju da instalira MySQL u podrazumevani l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ćete ga

111\t.llirati u podrazumevani direktorijum. Pošto instalirate MySQL, treba da napravite datoteku s parametrima koji određuju

potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego što prvi put pokrenete server. Više detalja o podešavanju sistema naći ćete u odeljku "Podešavanje

!'lema", u nastavku ovog poglavlja. Pošto podesite parametre sistema, korisno je da server prvi put pokrenete s

~ omandne linije. (U nastavku ovog poglavlja objasnićemo kako se MySQL instalira ~ .10 Windowsov servis, ali pogledajmo prvo da li uopšte radi.)

Otvorite prozor komandne linije i pređite u direktorijum u koji ste instalirali MySQL. Ako imate standardnu instalaciju, to će biti c:\mysql\bin.

Otkucajte sledeće:

mysqld-max --standalone

Trebalo bi da se nakon toga prikaže grupa početnih poruka. Ako je dosad sve

u redu, možete instalirati MySQL kao Windowsov servis. Otkucajte ime izvršive datoteke servera koju nameravate da koristite, a zatim i

opciju --install. Na primer:

mysqld-max --install

U ovoj knjizi preporučujemo izvršivu datoteku mysqld-max. Da bi vaša instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da

obavite još jedan, poslednji posao. Pošto su neki od programa pridruženih MySQL-u zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl mašina da bi ti pro­grami mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState:

www.activestate.com/Products/ActivePerl/

Page 13: Prirucnik Za MySQL

ActivePerl dobijate u obliku MSI datoteke. Preuzmite ActivePerl i instaiii,IJ!t• ga tako Što dvaput pritisnete ime te datoteke. Možete prihvatiti sve vrednosti parametara koje vam instalacioni program ponudi za upotrebu s MySQL-om.

Instaliranje na OS X MySQL možete instalirati na OS X iz odgovarajućeg paketa, pod uslovom da imate OS X 10.2 ili noviji.

Ako već imate neku verziju MySQL servera koja je aktivna na vašem računaru, morate je zaustaviti pre nego što započnete instaliranje nove verzije. To možete ura­diti tako što na komandnoj liniji otkucate sledeću komandu:

mysqladmin -u root -p shutdown

Da biste mogli da pokrenete server, potreban vam je korisnički nalog čije je ime mysql. Ako imate OS X 10.2 ili noviji, taj nalog već postoji.

S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku.

Pojaviće se sadržaj datoteke slike diska. Pronađite PKG datoteku i dvaput je priti­snite. Za potrebe ove knjige možete prihvatiti sve vrednosti opcija koje vam instala­cioni program ponudi.

MySQL možete podesiti tako da se automatski pokreće pri podizanju sistema, tako Što dodate Startupitem. To možete uraditi ako dvaput pritisnete datoteku MySQL­Startupltem.pkg koja bi trebalo da se nalazi u vašoj .dmg datoteci.

Pošto izvršite postupak opisan u odeljku "Podešavanje sistema", možete pokrenuti MySQL server tako što otkucate sledeću komandu, pod uslovom da ste instalirali Star­tup Item:

sudo /Library/Startupitems/MySQL/MySQL start

Ako niste instalirali Startupltem, server možete pokrenuti pomoću sledećeg niza komandi:

cd /usr/local/mysql sudo ./bin/mysqld_safe

Pritisnite Ctrl+Z. I najzad, otkucajte sledeću komandu:

bg

Ako niste instalirali Startupitem, morate ponoviti ove korake kad god pokrećete svoj sistem i želite da koristite MySQL.

Imajte u vidu da postupak instaliranja MySQL-a može biti prilično složen i može se razlikovati od onog koji možda poznajete iz verzija MySQL-a koje ste ranije insta­lirali, ili može biti drugačiji na vašoj verziji OS X-a.

Podešavanje sistema Početna konfiguracija MySQL-a radiće već takva kakvu ste je instalirali; međutim, neke korisne mogućnosti su standardno isključene a instalacija nije ' dovoljno zaštićena.

U ovoj knjizi preporučujemo da izmenite sledeće opcije :

• ll udući da ćemo koristiti InnoDB tabele, morate obaviti osnovno podešavanje za

upotrebu tog tipa tabela.

• l'n:poručujcmo da uključite beleženje izmena u dnevnik (engl. binary log) u svim situacijama. To je veoma korisno u slučaju oporavljanja od katastrofalnih grešaka.

• l 1 reporučujemo da uključite beleženje sporih upita u dnevnik, što će vam pomoći da optimizujete svoje aplikacije.

MySQL smešta vrednosti konfiguracionih parametara u datoteku opcija. Ako kori­lit t Windows, globalnu datoteku opcija možete smesti ti u Windowsov sistemski

oi ill ktor u um i nazvati je my.ini, ili u e: \my.cnf. Preporučujemo da koristite my. ini jer II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija. U operativnim sistemima iz porodice Unix, globalna datoteka opcija obično je

.llii'Štena u direktorijum /etc/my.cnf. Ako želite da na istom računaru radi više r-- lySQL servera, podatke za svaki server možete čuvati u zasebnoj datoteci my.cnf lllt'Štenoj u direktorijumu data svakog servera. Osim toga, možete dozvoliti korisni-

' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smeštene u ol1tntcci -/.my.cnf(obratite pažnju na tačku ispred imena datoteke).

U zavisnosti od vaše instalacije, možda u početku nećete ni imati datoteku opcija. t ltvorite tu datoteku u svom uobičajenom editoru za tekst- Notepad će sasvim lepo nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji.

Predlažemo vam datoteku opcija sa sledećim početnim opcijama (listing 1.1):

l h ting 1.1 Predložena datoteka opcija

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

Podešavanje za InnoDB tabele ll Ovo je osnovna datoteka opcija predložena u dokumentaciji ll Datoteke za podatke treba da omoguće ll skladiš tenje podataka i indeksa. ll Obezbedite dovoljno slobodnog ll prostora na disku. innodb_data_file_path = ibdatal:lOM:autoextend ll Podesi te veličinu rezerve za bafere na ll 50-80% količine mermorije ll na računaru rwL-variable = innodb_buffer_pool_size=70M nPL-variable = innodb_additional_mem_pool_size=lOM ll Podes ite veličinu dnevnika na približno ll 25% veličine rezerve za bafere set-variable innodb_log_file_size=20M set-variable = innodb_log_buffer_size=BM

Page 14: Prirucnik Za MySQL

# Podesite .. flush_log_at_trx_commit # na O ako možete da prihvatite gubljenje # nekoliko poslednjih transakcija innodb_flush_log_at_trx_commit=1

Veći deo sadržaja ove datoteke opcija zasniva se na veoma jednostavnoj konfigura­cionoj datoteci za upotrebu Inn o DB tabela, koja je predložena u MySQL-ovoj doku­mentaciji. Ako imate postojeću instalaciju u kojoj se koriste InnoDB tabele i dodate joj ovu datoteku opcija, možda ćete morati da pretvorite u komentar sledeći red:

set-variable = innodb_log_file_size=20M

tako što ćete na početku reda upisati znak#. (Ako već imate datoteku dnevnika druge veličine, to će možda zbuniti MySQL.)

Ostala podešavanja opisana su u poglavlju 12, "Podešavanje MySQL-a".

Provera da li sistem radi Pošto instalirate MySQL, podesite ga tako da se automatski pokreće pri podizanju računara. Ako je tačno podešen, trebalo bi da bude moguće uspostavljanje veza sa MySQL serverom.

To možete proveriti pomoću sledeće komande:

mysql -u root

Može biti potrebno da zadate punu putanju izvršive datoteke mysql (na primer, na Windowsu, to je obično e: \mysql \bin\mysql -u root) ili da izmenite vrednost sistemske promenljive PATH.

Trebalo bi da se na ovaj način uspešno prijavite kao korisnik root (administrator) MySQL monitoru (tj. MySQL-ovom interfejsu u obliku komandne linije). Na vašem ekranu trebalo bi da se pojavi sledeća uvodna poruka:

Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 to server version: 4.1.0-alpha-max­-debug-log Type 'help; ' or '\h' for help. Type '\e' to clear the buffer. mysql>

Na vašem sistemu će verovatno biti različit broj veze (connection id) i broj verzije servera. Neka vas to ne brine.

Ako se pojavi poruka nalik na sledeću:

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

to znači da MySQL server ne radi. Pokušajte ponovo da pokrenete sistem da bi se ser­ver automatski pokrenuo zajedno s njim, ili ručno pokrenite server pomoću komande:

mysqld --standalone

na komandnoj liniji. (To ćete najlakše uraditi u jednom prozoru, a zatim otvorite drugi prozor iz kojeg ćete se prijaviti na server.)

Da biste se odjavili iz MySQL monitora, otkucajte sledeće:

\q

(Obrnuta kosa crta, slovo q i pritisak na taster Enter.) . . .. . Međutim, nemojte se još odjavljivati. (Ako ste to uradth, ponovo se pnjaVJte.) .

Postoji još nekoliko administrativnih stvari koje treba da obavite da bis.te_ zatsta mogh da koristite svoju instalaciju MySQL-a. Budući daje to važno, preporucujemo vam da

n~stavite čitanje ovog poglavlja.

Zadavanje lozinke za nalog root . Kao što ste verovatno uočili ako ste se upravo prijavili na server, moral1 ste da. zadate une korisnika- root - ali ne i lozinku. U svakoj instalaciji MySQL-a, u pocetku n:tlog root nema lozinku. Iz očiglednih bezbednosnih razloga, veoma je važno da tom ualogu dodelite lozinku. U MySQL monitoru otkucajte sledeće: aet password for root®localhost=password('lozinka');

Razume se reč lozinka zamenićete lozinkom koju ste izabrali za nalog root. Od javite se' (\q) a zatim se ponovo prijavite. Ovog puta ćete morati da se prijavite

slcdećom komandom:

mysql -u root -p MySQL će zatražiti da zadate svoju lozinku. Parametar -u znači ime korisnika,

;1 parametar -p znači da se prijavljujete s lozinkom.

Brisanje anonimnih naloga . .. Pri instaliranju, MySQL automatski pravi nekoliko anonimnih naloga .za koje mje potrebno zadavanje imena korisnika prilikom prijavljivanja.' Pr~poruČujemo vam da te naloge izbrišete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 .• "Zaštita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete

ukloniti pomoću sledećeg niza komandi:

use mysql; delete from user where User=''; delete from db where User=''; (lush privileges;

Pravljenje na loga za uobičajene poslove .. . . Jz bezbednosnih razloga, korisno je da umesto naloga root, za uobJcajene l svakod-

nevne poslove koristite neki drugi nalog. . . . • . ·V •

Ovde je samo ukratko opisano kako se prav1 nov konsmckt ,n~log. Vtse deta.lja

0 tome kako se upravlja korisničkim nalozima u MySQL-u naCl cete u poglavlju 11,

"Upravljanje pravima korisnika" .

Page 15: Prirucnik Za MySQL

Pomoću sledeće komande napravite nov nalog koji ćete koristiti za svakodnevne poslove:

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

lock tables, select, show databases, update on*.*

to imekorisnika identified by 'lozinka ' ;

Razume se, umesto reči imekorisnika i lozinka, u tekst komande treba da upišete svoje korisničko ime i odgovarajuću lozinku.

Trebalo bi da se sada odjavi te sa servera, pa ponovo prijavite na njega pod imenom korisnika i lozinkom koje ste zadali. U nekim od završnih poglavlja ove knjige mora­ćete da koristite nalog root da biste obavili određene poslove, ali pošto korisnički nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za sva­kodnevne poslove.

Sažetak U ovoj f.ni trebalo bi da vaša instalacija MySQL-a bude upotrebljiva a vi spremni da sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili sledeće:

• Preuzeli najnoviju binarnu verziju MySQL-a za vaš operativni sistem s Web loka­cije mysql.com.

• Instalirali je- pomoću instalacionog programa (na Windowsu ili OS X-u) ili pomoću alatke RPM.

• Podesili server tako da se automatski pokreće pri podizanju sistema, ako je to u vašem slučaju prihvatljivo.

• Napravili datoteku opcija.

• Prvi put se prijavili na server i odjavili s njega.

• Zadali lozinku za nalog root.

• Izbrisali anonimne naloge.

• Napravili nov nalog i lozinku za svoje svakodnevne programerske poslove.

Vežbe Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju, ukoliko još niste to uradili.

U sledećem poglavlju U poglavlju 2",Kratak obilazak", pogledaćemo komponente vaše instalacije MySQL-a, ponovo ćemo pogledati korisničke interfejse i osnovni način upotrebe MySQL-a.

2 Kratak obilazak

u OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Pri­d1užene. Povešćemo vas u kratak obilazak da biste saznali koje sve al~tke postoje u MySQL-u i koji su najčešći klijentski interfejsi. Razmotrićemo sledece teme:

• Strukturu MySQL-ovih direktorijuma

• Pregled izvršnih datoteka

• Pregled korisničkih interfejsa

• Kratak uvod u MySQL monitor.

truktu ra MySQL- ovih direktorijuma .. l J ovom poglavlju pretpostavićemo da ste instalirali MySQL na standardnu lokaciJU na vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura

dlll'ktorijuma biće ista, ali će kerenski direktorijum biti drugačiji. Ukoliko vam je proizvođač isporučio sistem sa već instaliranim MySQL~om:.

1 1uktura direktorij uma će se možda razlikovati. Na primer, ako Imate dJstn~uCIJU v .

l~l'd Hat 9, otkrićete daje organizacija datoteka izmenjena tako da se uklop~ u op.s:1 ,1,tcm skladištenja datoteka. Ako ste MySQL instalirali iz RPM d~toteka. koje potJCu .1 MySQL-ove Web lokacije, trebalo bi da datoteke budu na mestima koje navodimo

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~ ~ nJe ste opcione stavke instalirali i da li ste MySQL instalJral.I IZ bmarne .distnbuciJe Ih 11 distribucije sa izvornim kodom. U ovoj knjizi pretpostavljamo .da ste mst~Irali IZ blll.lrne distribucije, kao što je preporučeno u poglavlju 1, u odeljku "InstaliranJe

MySQL-a". . . . .. Ako imate operativni sistem srodan Unixu, standardm kerenski dJrektonJUm za .

MySQL-ove datoteke je /usr/locallmysql. Ako imate Windows, standardm kerenski ducktorijumje C:\mysql.

Page 16: Prirucnik Za MySQL

/U rUylctVIJt: L 1'\.ldldl\. UVIIOLO"

U tom direktorijumu naći ćete, između ostalog, sledeće poddirektorijume (pod pretpostavkom da ste instalirali MySQL iz binarne distribucije):

• bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i više drugih korisnih programa u prevedenom obliku. Sadržaj tog direktorijuma opi­

san je u narednom odeljku ovog poglavlja. • scripts: Ovaj direktorij um sadrži grupu skri p tova napisanih na jeziku Perl koji

obavljaju korisne poslove. Objasnićemo ih detaljnije u narednom odeljku ovog

poglavlja . • data: Ovo je direktorij um u kojem će se čuvati vaši podaci.

• does (Linux) ili Does (Windows): U ovom direktorijumu naći ćete dokumenta­

ciju o MySQL-u, u HTML formatu. • sql-bench (Linux) ili bench (Windows): U ovom direktorijumu nalaze se pro-

grami za testiranje MySQL-a.

Postoji još nekoliko drugih direktorij uma u koje će prosečan korisnik retko zala­ziti. To su: include (sadrži datoteke zaglavlja), lib (biblioteke funkcija koje MySQL koristi), share (sadrži tekst poruka o greškama koje MySQL šalje) i example (postoji samo na Windowsu, sadrži primere upotrebe datoteke libmysql.DLL). Ako instalirate drugi softver (kao što je PHP) koji se povezuje s MySQL-om, može vam zatrebati da znate gde se ti direktorijumi nalaze ali malo je verovatno da ćete nešto direktno

menjati u njima.

Pregled izvršnih datoteka MySQL-ove izvršne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo

najpre direktorijum bin. U njemu ćete naći izvršnu datoteku mysqld ili datoteku s nekim drugim imenom,

što zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u poglavlju 1 podesili tako da se automatski pokreće zajedno sa operativnim sistemom.

Tu ćete naći i mysql, MySQL monitor. To je osnovni klijentski program sa mter-

fejsom u obliku komandne linije. . Osim ova dva najvažnija programa, naći ćete i više drugih. Upotrebu mnogih od

njih opisaćemo u pojedinim poglavljima ove knjige. Ovde ćemo navesti samo neke

među najkorisnijim:

• mysqladmin: Služi za obavljanje administrativnih funkcija.

• myisamchk: Služi za proveru i popravljanje oštećenih MyiSAM tabela.

• mysqldump: Omogućava izradu rezervnih kopija baze podataka.

• mysqlbinlog: Omogućava čitanje dnevnika izmena, što je ključno za opora­

vljanje baze u slučaju katastrofalne greške. • mysqlshow: Služi za prikazivanje podataka o bazama podataka i njihovim

tabelama.

Pregled korisničkih interfejsa

Kroz celu ovu knjigu koristićemo programe mysqld i mysql, a na druge pomenute programe vrati ćemo se u petom delu, "Administriranje MySQL-a".

Pogledajte sadržaj direktorijuma scripts. Programi koji se u njemu nalaze su skrip­tovi koji se interpretiraju, a ne programi u prevedenom obliku, kao u direktorijumu h111. Upotrebu nekih među njima opisaćemo kada vam budu zatrebali u ovoj knjizi. Najvažniji od onih koje ćemo koristiti u ovoj knjizi jeste mysqlhotcopy, koji služi za 111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada 11'zervnih kopija i obnavljanje podataka".)

Pregled korisničkih interfejsa MySQL-u možete pristupati pomoću više korisničkih interfejsa, ili klijentskih pro­gl.l!na.Tri najpopularnija korisnička interfejsa su: mysql (u obliku komandne linije), poznat i kao MySQL monitor, MySQL Control Center (ili, skraćeno, MySQLCC) 1 phpMyAdmin.

MySQL monitor je uključen u osnovnu instalaciju MySQL-a, a komande se :.ulaju preko komandne linije. On uvek postoji u svim instalacijama, jednostavno se l o listi i radi na svim platformama.

MySQL Control Center (MySQLCC) jeste grafički korisnički interfejs. Napisan je pomoću skupa alatki za izradu prozora Qt, koji omogućava izradu verzija za različite pl.1tforme. U vreme pisanja ove knjige, MySQLCC je na raspolaganju za Unix i Win­dows, a planirana je i verzija za OS X.

phpMyAdrninje Web korisnički interfejs za upotrebu MySQL-a. Veoma je popu-111 an među dobavljačima Internet usluga koji svojim korisnicima stavljaju na raspola­go~~~jc MySQL radi razvijanja Web aplikacija.

Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je zvanični pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate, 111nžda ćete morati da ga posebno preuzmete sa adrese:

www.mysql.com/downloads/mysqlcc.html

MySQLCC se izuzetno lako instalira, a uputstva o tome naći ćete na adresi:

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

phpMyAdmin možete preuzeti sa adrese:

www.phpmyadmin.net/

Ako želite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser­n·l 1 instaliran PHP.

Za potrebe ove knjige, nevažno je koji ćete korisnički interfejs odabrati. Svi nude Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika­:tiJll takođe u obliku teksta, bez obzira na korisnički interfejs koji upotrebite.

i>rimeri koje dajemo u ovoj knjizi testirani su pomoću MySQL monitora, ali vi 1110Žete koristiti šta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god 111u~i klijentski program nađete na Internetu. Za neke poslove biće potrebno da izađete it kn ns n i čkog interfejsa i upotrebite koma n dno okruženje operativnog sistema.

21

Page 17: Prirucnik Za MySQL

22 Poglavlje 2 Kratak obilazak

Kratak uvod u MySQL monitor Sada ćemo ukratko opisati osnovni način upotrebe MySQL monitora. Prijavljivanje za rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni­tor prijavljujete se pomoću sledeće komande:

mysql -u username -p

Ovaj klijentski program ima nekoliko opcija koje mogu biti korisne. Ako usposta­vljate vezu s MySQL-ovom bazom podataka koja se nalazi na drugom računaru, možete upotrebiti opciju -h da biste zadali ime tog računara; na primer:

mysql -h imeračunara -u imekorisnika -p

U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postižete i pomoću opcije --safe -update s. Na primer:

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

Ova opcija ograničava štetu koju biste mogli da načinite pomoću zadate komande. To je naročito korisna opcija (na raspolaganju samo u alatki u kojoj se komande zadaju na komandnoj liniji) kada se kao početnik malo pribojavate rada u MySQL-u. Možda bi bilo dobro daje koristite dok čitate ovu knjigu. (Konkretno, ova opcija vas sprečava da ažurirate ili izbrišete redove u tabelama ako ne zadate vrednost primarnog ključa tih redova. Ako još ne znate šta to tačno znači, nemojte brinuti. Sve će postati jasno u trećem delu knjige, "Upotreba MySQL-a".)

Pošto se prijavite u MySQL, možete videti koje sve baze podataka postoje, ako zadate komandu SHOW:

show databases;

Kod većine čitalaca, u ovoj fazi rezultat ove komande biće kratak spisak baza poda­taka. Trebalo bi da se na vašem spisku pojavi baza podataka mysql. To je sistemska baza podataka u kojoj se čuvaju podaci o korisničkim nalozima i njihovim pravima. Više reči o tome biće u nastavku ove knjige.

Obratite pažnju na to da se komanda završava znakom tačka i zarez. Većinu komandi koje otkucate u MySQL monitoru morate završiti tim znakom inače ih MySQL neće izvršiti. Otkucajte:

show databases

i zatim pritisnite Enter. MySQL će samo mirno čekati. Ako potom otkucate znak tačka i zarez i pritisnete taster Enter, komanda će biti izvršena. To omogućava da složene komande raspodelite u više redova da bi bile čitljivije. Umesto znaka tačka i zarez, možete upisati \g (obrnuta kosa crta i slovo g), ali većina koristi tačku i zarez.

Možete izabrati neku bazu podataka sa liste i otkucati sledeću komandu:

use imebaze;

(Upišite tačno ime baze kojoj želite da pristupite.) Time navodite MySQL-u da želite da radite sa određenom baz<?m podataka. Izabe­

rite jednu sa spiska i otkucaj te ovu komandu. (Možda nećete imati prava da pristupite

Sažetak

tHiređenoj bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka p.1 pokušajte ponovo.)

Pošto izaberete bazu podataka, možete videti koje se sve tabele nalaze u njoj, ako 111 k ll Cate komand ll:

11 1iow tables;

Podatke o određenoj tabeli možete dobiti pomoću komande: til ncribe tablename;

Iz MySQL monitora možete se odjaviti tako što otkucate: \q

bratite pažnju na to da se ova komanda ne završava znakom tačka i zarez. Postoji l', illpa komandi koje počinju znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr­,, va se znakom tačka i zarez. Spisak tih komandi možete dobiti ako otkucate:

\h

(Slovo h potiče od reči help.)

MySQL-ove i SQL-ove komande možete upisivati direktno ll MySQL monitor. Ml'tlutim, te komande možete takođe uneti u datoteku koju zatim izvršite jednom ~ o111andom, kao skript. To ćete raditi u nastavku ove knjige, npr. kada u poglavlju 4, ,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka.

Ako ste prijavljeni u MySQL monitor, datoteku koja sadrži komande možete izvr­dir kad otkucate:

""ree imedatoteke

Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama možete rr.vršiti preusmeravanjem rezultata te datoteke; na primer:

my oql -u imekorisnika -p e imedatoteke

Ovim ste stekli osnove o načinu upotrebe klijentskog programa mysql.

ažetak • Najvažniji direktorijumi u instalaciji MySQL-ajesu bin (izvršni programi), data

(podaci iz baze podataka) i does (dokumentacija).

• Dva programa koja ćete n;Učešće koristiti jesu mysqld (MySQL server) i mysql, klijentski program u kojem se komande zadaju preko komandne linije.

• Možete birati između više korisničkih interfejsa, odnosno klijentskih programa. Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC (grafički interfejs) i phpMyAdmin (Web interfejs).

• Program mysql ima više korisnih opcija koje možete zadati na njegovoj komand­noj liniji. Pomenuli smo -u (kojom se zadaje ime korisnika), -p (prijavljivanje s lozinkom), -h (kojom se zad;Ue ime udaljenog računara) i --i-am-a-dummy (za ogranič:lvanjc moguće štete).

Page 18: Prirucnik Za MySQL

24 Poglavlje 2 Kratak obilazak

• Pošto se prijavite na server, možete izdati komande SHOW DATABASES ili SHOW

TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta­

bele da biste dobili podatke o određenoj tabeli.

• Iz MySQL servera možete se odjaviti pomoću komande \q.

• Komande možete završavati znakom ; ili znakovima \g da biste ih poslali servem na izvršenje .

• Datoteku koja sadrži komande možete izvršiti iz klijentskog programa pomoću komande source imedatoteke, ili izvan klijentskog programa- preusmerava­njem rezultata datoteke.

Pitanja l. Program MySQL server nalazi se u

a) direktorijumu does ili Does

b) direktorijumu lib

e) direktorijumu scripts

d) direktorijumu bin

2. Dokumentacija o MySQL-u nalazi se u

a) direktorijumu does ili Does

b) direktorijumu lib

e) direktorijumu scripts

d) direktorijumu bin

3. Program mysqlhotcopy nalazi se u

a) direktorijumu does ili Does

b) direktorijumu lib

e) direktorijumu scripts

d) direktorijumu bin

4. U MySQL monitoru

a) komande treba da se završavaju znakom tačka i zarez

b) komande treba da se završavaju znacima \g

e) može a) ili b)

d) ništa od prethodnog nije tačno

5. Opcija --i-am-a-dummy zadata u programu mysql

a) znači tačno to što piše

b) sprečava me da napravim previše štete dok učim SQL

e) sprečava me da uradim bilo šta osim prijavljivanja i odjavljivanja

d) ništa od prethodnog nije tačno

U sledećem poglavlju

Vežbe l'r t·uznute i instaliraj te neki grafički ili Web korisnički interfejs, kao što je MySQLCC. Vt·zbajte prijavljivanje i prikazivanje spiska postojećih baza podataka pomoću klijent­lo~ programa koji ste izabrali .

Odgovori

fl1lanja l . d ) a

\. e

l . e

'l . b

U sledećem poglavlju l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri ćemo opšte kon-' qllt: u vezi s bazama podataka, terminologiju i principe projektovanja, uključujući i rrnrrnalizaciju.Ako niste početnik u oblasti baza podataka, ali ste početnik u MySQL-u, '" rrtorate detaljno pročitati to poglavlje.

Page 19: Prirucnik Za MySQL

II Projektovanje i izrada

baza podataka u MySQL-u

\ Ubrzani kurs projektovanja baza podataka

l Pravljenje baza podataka, tabela i indeksa

Page 20: Prirucnik Za MySQL

3 Ubrzani kurs projektovanja

baza podataka

U OVOM POGLAVLJU RAZMOTRIĆEMO osnovne principe projektovanja i normali­lu\,lllja baza podataka. U dobro projektovanoj bazi podataka redundantnost (dupli-' tll)t') podataka svedeno je na minimum, ali bez gubljenja podataka. To znači da će naš 'riJ hrt i što manji utrošak prostora na disku uz očuvanje svih veza koje postoje između 1'•HI.1taka.

R.1zmotrićemo sledeće teme:

• Koncepti i terminologija baza podataka

• Principi projektovanja baza podataka

• Normalizovanje i normalne forme

• Vcžbe iz projektovanja baza podataka.

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

l ntiteti i relacije l hnovni elementi koje ćemo pokušati da model ujemo jesu entiteti i relacije. Entiteti su ·'' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog života o kojima čuvamo podatke

11 h.1:n podataka. Na primer, možemo se opredeliti da evidentiramo podatke o zaposle-111111.1 i službama u kojima rade. U tom slučaju bi zaposleni bio jedan entitet, a služba 11 ~nJoj radi- drugi. Relacije su veze koje postoje između entiteta. Na primer, zaposleni t,tdi ll službi. "Radi u" je relacija (veza) između entiteta zaposleni i služba.

ltdacije mogu biti različitih vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan ptt'tlla više" (ili "više prema jedan", u zavisnosti od toga s koje strane relacije posma­lt,tlt') 1., više prema više". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta.

Page 21: Prirucnik Za MySQL

JU ruyraVIJI:: J VUILdfll ~ur~ fHUJI::~lUVdiiJd UdLd JJUUdld~d

Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s pisaćim stolom, to bi bila relacija tipa ,jedan prema jedan". U primerima kao što je navedeni, ta veza "radi u" češće je tipa "više prema jedan", tj. više zaposlenih radi u datoj službi . Tc dve vrste rela­cija prikazane su na slici 3.1.

Candy

Istraživanje i razvoj

-Jr________.____", ~~'

Nora

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

Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan". Relacija "radi u" jeste tipa "više prema jedan".

Imajte u vidu da entiteti, relacije i vrste relacija među njima zavise od okruženja i poslovnih pravila koje pokušavate da modelu jete. Na primer, u nekim firmama jedan zaposleni može raditi u više službi. U tom slučaju bi relacija "radi u" bila tipa "više prema više". Ako više ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u" nije tipa "jedan prema jedan".

Kada projektujete bazu podataka, morate uzeti u obzir pravila koja važe u sistemu koji modelujete. Ne postoje dva potpuno jednaka sistema.

Koncepti 1 termrnologiJa oaza podataka

l.tbele ~ tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database \ ltiiWgement System, RDBMS), što znači da podržava baze u kojima postoje relacije 1 111\!du podataka koji se čuvaju u tabelama (engl. tables). Ako ste ikada koristili neki i'ln~ram za tabelarne proračune, svaki njegov radni list ima oblik tabele s podacima. 11111llCr tabele je prikazan na slici 3.2.

emolovee em loveeiD name ob departmentiD

~g 1 Noro edwards Ben Smith

1 Programmer 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), imena (name), poslovi kojima se bave Gob) i službe u kojima rade (departmentiD).

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

Kolone ili atributi l J tabelama baze podataka, svaka kolona ili atribut opisuje određeni podatak koji se 11 .d.tzi u svakom redu tabele. Reči kolona (engl. column) i atribut (obeležje, engl. attri­/111/r) koriste se kao sinonimi, ali tačnije je reći da je kolona deo tabele, dok se atribut 1 ul11osi na entitet iz stvarnog sveta koji tabela modelu je. Na slici 3.2 vidljivo je da svaki .1posleni ima atribute employee ID, name, j ob i department ID. To su kolone tabele

r lltployee, koje se ponekad nazivaju i atributi ili polja (engl.fields) tabele.

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

Ključevi ..,.IIJII'rkijuč (engl. superkey) je kolona (ili grupa kolona) koja jednoznačno identifikuje red t.tbele. Ključ (engl. key) je minimalni superključ. Pogledajte tabel u employee. Da bismo )l'dnoznačno identifikovali svakog zaposlenog, možemo upotrebiti kombinaciju kolona t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job, tkpartmentiD). Obe kombinacije su superključevi.

Međutim, da bismo jednoznačno identifikovali svaki red tabele, nisu nam potrebne sve te kolone, već je dovoljna samo jedna (na primer) employeeiD, odnosno mini­Illa ina grupa kolona pomoću koje nedvosmisleno identifikujemo svaki red. Prema tome, ključ je kolona employeeiD.

Pogledajte ponovo tabelu employee. Jednog zaposlenog možemo identifikovati po 1111enu (name) ili po šifri zaposlenog (employeeiD). Obc kolone su ključevi. Tc klju (·l'vc nazivan~ o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to mogući bndid~ti

Page 22: Prirucnik Za MySQL

1.( t'UYičlVIJC:: J UUfLčlnl KUf~ prUJC::KlUVčlnJčl UčlLčl pUUčllčlKčl

među kojima ćemo izabrati primarni (engl. pri mary) ključ. Primarni ključ je kolona ili grupa kolona pomoću koje ćemo jednoznačno identifikovati pojedine redove tabele. U ovom slučaju, za tu namenu koristićemo kolonu employee ID. To je bolji ključ od kolone name jer se često događa da dve osobe imaju isto ime i prezime.

Spoijni ključevi (engi.Joreign keys) predstavljaju veze između tabela. Na slici 3.2 vidite da kolona departmentiD sadrži brojeve koji predstavljaju šifre službi u kojima rade zaposleni. To je spoljni ključ; skup svih podataka o određenoj službi čuva se u drugoj tabeli, u kojoj je primarni ključ kolona departmentiD.

Funkcionalne zavisnosti Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se ređe nego drugi koje smo naveli, ali treba da shvatite njegovo značenje da biste razumeli postupak normali­zavanja o kojem će biti reči u nastavku ovog poglavlja.

Ako u datoj tabeli postoji funkcionalna zavisnost između kolone A i kolone B, koja se može napisati kao A -7 B, vrednost u koloni A određuje vrednost u koloni B. Na primer, u tabeli employee, kolona employeeiD funkcionalno određuje ime zaposlenog (a u ovom primeru i sve druge atribute).

Šeme Izraz šema ili šema baze podataka (engl. database schema) označava strukturu ili dizajn baze podataka, odnosno oblik koji baza podataka ima, i ne odnosi se na same podatke. Da bi vam bilo jasnije, šema je "nacrt strukture" podataka koji se čuvaju u bazi.

Šemu jedne tabele u bazi podataka pišemo na sledeći način: employee ( employeeiD, name, j ob, ~-~P.~r_t_I?!!'!.~_nR)

U ovoj knjizi držaćemo se pravila da se atributi koji predstavljaju primarne ključeve podvlače punom linijom, a atributi koji predstavljaju spoljne ključeve - tačkastom. Pri­marni ključevi koji su istovremeno i spoljni, podvlače se i punom i tačkastom linijom.

Principi projektovanja baza podataka Kada projektujemo bazu podataka, moramo razmotriti dva važna pitanja:

• Koje sve podatke treba čuvati, odnosno o kojim sve stvarima ili entitetima moramo da čuvamo podatke?

• Koju ćemo vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se upiti.)

Kada tražimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila organizacije koju pokušavamo da modelujemo, o čemu sve moramo da čuvamo podatke i koje su veze između tih podataka.

Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka čija će struktura biti takva da isključuje strukturne probleme kao što su redundantnost (dupli­ranje) podataka i anomalije podataka.

nmc1p1 prUJC::KlUVčlnJčl UčlLčl pUUtlliiKil

H dundantnost i gubljenje podataka l Hla projektujemo šemu baze podataka, to moramo uraditi tako da redundantnost Jlndataka bude minimalna, ali da pri tome ne izgubimo nijedan podatak koji namje 111 llphodan. Redundantni podatak u ovom kontekstu znači da se isti podatak ponavlja 11 1 azličitim redovima iste tabele ili u različitim tabelama baze podataka.

Zamislite da umesto dve tabele, employee (zaposleni) i department (službe), imamo 11110 jednu tabelu koja se zove employeeDepartment. To možemo izvesti ako tabeli

• IIIJlloyee dodamo kolonu departmentName tako da šema tabele postaje sledeća: cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName)

Za svakog zaposlenog koji radi u službi čiji je šifra 128, Research and Development (htt.1Živanje i razvoj), moramo da ponovimo podatak "Research and Development" ( Irb 3.3). Isto važi i za sve ostale službe kompanije.

employeeDepartment employeeiD name ob de artmentiD de artmentName

~~~ ora_t:a_war s rogrammar

·~ 1 ~.esearcn ana Ue\le opment

Ben Smith OBA Fmance 6651 ~ayPatet Programmer 128 Research and Development 9006 Candy Burn eU Systems Administrator 128 Research and Development

Slika 3.3 Ova šema dovodi do redundantnosti (ponavljanja) podatka o nazivu službe.

Ovu šemu možemo da izmenimo na sledeći način: t•mployee(employeeiD, name, job, ~-~P.~r_t_l?}!'!.~-~l:Q)

dcpartment(departmentiD, name)

U ovom slučaju se naziv službe čuva na samo jednom mestu, pa se minirnizuje 1111 ošak prostora na disku i izbe gavaju određeni problemi.

Obratite pažnju na to da smo morali da ostavimo kolonu departmentiD u tabeli • 111ployee; bez nje bismo izgubili informaciju iz šeme, odnosno u ovom slučaju bismo 1/~llbili vezu između zaposlenog i službe u kojoj radi. Kada poboljšavamo šemu baze Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali lll'z gubljenja informacija.

Anomalije /\11omalije su nešto složeniji koncept. To su problemi koji se pojavljuju među poda-' 1111.1 zbog loše osmišljene strukture baze podataka. Mogu se pojaviti tri vrste anoma­lq.t, koje ćemo opisati na primeru loše osmišljene Šeme sa slike 3.3.

Anomalije pri dodavanju podataka Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loše osmišljenom struktu­llllll pokušate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da 1111csemo i šifi-u i naziv službe u kojoj radi. Šta se događa ako unesemo podatke koji se 1,wlrkujr1 od postojećih u tabeli, npr. ako upišemo da novi zaposleni radi u službi čija J l' sili .1 42, J evl'lopment? Nakon toga više neće biti jasno koji redovi tn bele sadrže 1\jli.IVIIl' pod.1tkt• 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOŠl'IIJll pod;~(;1k;l.

Page 23: Prirucnik Za MySQL

ll t'll91ilVIJe J uorzant Kurs proJeKwvanJa oaza pooaraKa

Anomalije pri brisanju podataka Anomalije pri brisanju podataka nastaju kada se podaci brišu iz tabele s loše osmišlje­nom strukturom. Zamislite da svi zaposleni iz službe čija je šifra 128 daju otkaz (možda zato što im je sve dojadilo). Pošto izbrišemo sve zapise o tim zaposlenima, više nemamo nijedan zapis u kojem se pominje služba sa šifrom 128, niti njeno ime. To je primer anomalije pri brisanju.

Anomalije pri ažuriranju podataka Anomalije pri ažuriranju podataka nastaju kada se ažuriraju podaci u tabeli s loše osmi­šljenom strukturom. Zamislite da je rukovodstvo donelo odluku da služba čija je šifra 128 promeni ime u EmergingTechnologies. U tom slučaju moramo izmeniti podatke pojedinačno za svakog zaposlenog koji radi u toj službi. Lako se može dogoditi da nekog izostavimo.Ako se to desi, imaćemo anomaliju pri ažuriranju.

Null vrednosti Poslednje pravilo dobrog projektovanja baza podataka nalaže da treba izbegavati šeme koje dozvoljavaju veći broj nepopunjenih atributa. Ako želimo da evidentiramo da na svakih sto ili više zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta kolona sadržala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se čuvale šifre i kvalifikacije samo zaposlenih koji ih imaju.

Normalizovanje Normalizovanje je postupak koji omogućava ispravljanje loše osmišljene strukture baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, što su grupe pravila o tome šta treba i šta ne treba da bude u strukturama tabela. Tokom postupka normalizovanja, tabele se razbijaju na manje tabele koje čine bolju strukturu.

Da biste pratili postupak normalizovanja, na strukturu baze podataka primenićemo redom sve tri normalne forme. U svakoj nomalnoj formi obično se polazi od pretpo­stavke daje šema baze podataka već u prethodnoj normalnoj formi. Da bi baza poda­taka bila u drugoj normalnoj formi, mora prethodno biti dovedena u prvu normalnu formu a da bi bila u trećoj normalnoj formi, mora prethodno biti dovedena u drugu normalnu formu itd. U svakoj fazi normalizovanja dodajemo nova pravila koja Šema mora da ispuni.

Prva normalna forma Prva normalna forma, koja se ponekad naziva i l NF, propisuje da svaka vrednost atri­buta ili kolone mora biti prosta. To znači da svaki atribut mora sadržati samo jednu vrednost, a ne kom.binaciju više vrednosti ili drugi red baze podataka.

Pogledajte tabelu na slici 3.4. To je nenorm.alizovana verzija tabele employee koju smo razmatrali u prethodnim

odcljcima. Kao što vidite, dodata je nova kolona, skills, u kojoj su navedena stručna znanja svakog zaposlenog.

NormattzovanJe

employee employeoiD name ob dopartmentiD skills

~~ Nora Edwards Programmer 1~ 1 ~~en. Java Ben Smith OBA

6651 ,AJay Palal Programmer 128 VB, Java 9006 Candy Burnett Systems Administrator 128 NT, Linu)(

Slika 3.4 Ova Šema nije u prvoj normalnoj formi zato što kolona skills sadrži grupu vrednosti.

Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto d.1 sadrži prostu vrednost kao što je Java, kolona sadrži listu vrednosti, kao što je e, l ' t l , Java. Time je prekršena pravilo prve normalne forme.

Da bismo ovu šemu doveli u prvu normalnu formu, moramo razdvojiti vrednosti 11 koloni skills na proste elemente. To se može obaviti na više načina. Prvi i možda naj­' n tglcdniji način prikazan je na slici 3.5.

emclovee employeeiD Name ob del'_artmentiD skill

~~:~ IJ\Iora ~dwards Nora Edwards

1 ~rogrammer

Pro grammar :~ l ~eri 7513 Nora Edwards Pro grammar 12e Java 9642 Ben Smith OBA 42 082 6651 Ajay Patel Programmer 12e VB 6651 Ajay Patel Pro grammar 128 Java 9006 Candy Burnett Systems Administrator 12e NT 9006 Candy Bumett Systems Administrator 12e Linux

Slika 3.5 Sve vrednosti sada su proste.

U ovom slučaju napravili smo jedan red po stručnoj kvalifikaciji. Ova šema je sada 11 prvoj normalnoj formi.

Razume se, ova organizacija podataka je daleko od savršene jer imamo veliku ~t •dundantnost- za svaku kombinaciju stručna kvalifikacija/zaposleni u tabeli čuvamo ~ VL' podatke o zaposlenom.

Bolje rešenje i pravilan način organizovanja ovih podataka u prvu normalnu formu prikazano je na slici 3.6.

employee employeeiD name ob departmentiD

~:~ 1 Nora Edwards Ben Smith

1 ':'rogrammer OBA l~

6651 Ajay Patel Pro grammar 12e 9006 Candy Burnett Systems Administrator 12e

employeeSkills employeeiD skill

~~:; lG Perl

7513 Java 9642 082 6651 VB 6651 Java 9006 NT 9006 Linux

Slika 3.6 Pravilno rešenje istog problema je pravljenje dodatne tabele.

Page 24: Prirucnik Za MySQL

J b t"ogtaVIJe J uorzan1 Kurs proJeKtovanJa oaza poaaiaKa

U ovom primeru, preneli smo stručne kvalifikacije u zasebnu ta belu koja služi samo da poveže šifre zaposlenih s pojedinim kvalifikacijam.a. Time smo rešili problem redundantnosti.

Možda se pitate kako smo došli do drugog rešenja. Postoje dva odgovora. Jedan je: na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka normalizovanja na šemu sa slike 3.5; u tom slučaju, na kraju dobijamo Šemu sa slike 3.6. Prednost iskustva je to što omogućava predviđanje i direktan prelazak na prav1lnu strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka.

Druga normalna forma Pošto postavimo šemu u drugu normalnu formu, možemo je preneti u naredne nor­malne forme višeg stepena, koje se nešto teže razumeju.

Kaže se daje šema u drugoj normalnoj formi (koja se takođe zove 2NF), ako su svi atributi koji nisu deo primarnog ključa funkcionalno potpuno zavisni od primarnog ključa i šemaje već u prvoj normalnoj formi. Šta to tačno znači? To znači da svaki atri­but koji nije deo primarnog ključa mora biti funkcionalno zavisan od svih delova pri­marnog ključa, tj. ako primarni ključ čini više kolona, svi ostali atributi tabele moraju biti zavisni od kombinacije svih tih kolona.

Pogledajmo primer da bi postalo jasnije. Pogledajte sliku 3.5. U toj šemi, tabela sadrži jedan red po zaposlenom i po stručnoj

kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog čega? Šta je primarni ključ te tabele? Znamo da primarni ključ mora jednoznačno identifi­

kovati svaki red tabele. U ovom slučaju, to je moguće samo pomoću kombinacije kolona employeeiD i skills. Ako je sadržaj kolone skills kao na slici, kolona employeeiD nije dovoljna za jednoznačno identifikovanje redova jer, na primer, vrednost em.ployeeiD 7513 postoji u tri reda. Međutim, pošto kombinacija vrednosti u kolonama employeeiD i skills jednoznačno identifikuje svaki red, upotrebićemo je kao primarni ključ. Tako dolazimo do sledeće šeme:

employee(employeeiD, name, job, <J.e_p_'!l_'m"!~Đ~_I_.Q, skill)

Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom slučaju imamo:

employeeiD, skill -7 name, job, departmentiD

ali i employeeiD -7 name, job, departmentiD

Drugim rečima, dovoljna nam je samo vrednost atributa em.ployeeiD da bismo odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To znači da su ti atri­buti funkcionalno samo delimično zavisni od izabranog primarnog ključa, odnosno vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog ključa a njegova cela vrednost nije neophodna. Prema tome, ova šema nije u drugoj normalnoj formi.

Sledeće pitanje je: "Kako bismo je doveli u drugu normalnu formu?"

Normalizovanjc

'!''::!belu moramo razdvojiti na više tabela u kojima su svi atributi koji nisu deo pri ­liLl rnog ključa funkcionalno potpuno zavisni od primarnog ključa. U ovom slučaju je ''' 1glcdno da to možemo postići ako tabelu razdvojimo na dve tabele:

employee(employeeiD, name, job, departmentiD) <.'mployeeSkills( employeeiD, skill)

-----------------'lb je Šema prikazana na slici 3.6.

Kao što je već opisano, ova šema je u prvoj normalnoj formi zato što su sve vred­ll osti proste. Ona je takođe u drugoj normalnoj formi zato što svaki atribut koji nije dl' o primarnog ključa sada je potpuno zavisan od svih delova primarnog ključa.

Ir ·ća normalna forma I'1111Ckad ćete čuti nekoga da kaže: "Normalizovanje se tiče ključa, celog ključa i ničeg t11t1gog osim ključa". Druga normalna forma nalaže da atributi moraju zavisiti od 1 1 log ključa. Treća normalna forma propisuje da atributi zavise samo od ključa.

1:ormalno, da bi Šema bila u trećoj normalnoj formi (3NF), moramo ukloniti sve li.lllzitivne zavisnosti i šema mora već biti u drugoj normalnoj formi. U redu, ali šta je lidll:titivna zavisnost?

Pogledajte ponovo sliku 3.3. Prikazana je sledeća šema: l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName)

Ova Šema sadrži sledeće funkcionalne zavisnosti: l'mployeeiD -7 name, job, departmentlD, departmentName

dcpartmentiD -7 departmentName

Primarni ključ je employeeiD i svi atributi funkcionalno su potpuno zavisni od "l''ga, što je lako razumljivo jer se primarni ključ sastoji od samo jednog atributa.

Međutim, vidljivo je i to da imamo: l'mployeeiD -7 departmentName

l'tnployeeiD -7 departmentiD

dcpartmentiD -7 departmentName

Obratite pažnju i na to da atribut departmentiD nije ključ. Ovaj odnos znači da je funkcionalna zavisnost employee ID -7 departmentName

li,lllzitivna zato što postoji "međukorak" (zavisnost departmentiD -7 departmentName) . Da bismo došli do treće normalne forme, moramo ukloniti ovu tranzitivnu zavisnost. Kao i u prethodnim formama, da bismo došli do treće normalne forme, tabel u raz­

dv.l_J.lmo na više drugih tabela. U ovom slučaju takođe, prilično je očigledno šta bi trc­lo.do da uradimo. Šemu d elimo na dve tabele, employee i department, na sledeći način:

l'mployee(employeeiD, name, job, ~_<:p_~:~~~~-~-t_I_J?.) d cpartmcnt( d epa rtmen t ID, departmentN ame)

Page 25: Prirucnik Za MySQL

'18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka

To nas vraća na šemu tabele employee prikazanu na slici 3.2. Ona je u trećoj nor­malnoj formi.

Drugi način da opišemo treću normalnu formu jeste da kažemo sledeće: fo~maln~, ako je šema u trećoj normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh, ispunjen je jedan od sledeća dva uslova:

• Leva strana funkcionalne zavisnosti je super ključ (tj. ključ koji nije obavezno minimalan).

ili

• Desna strana funkcionalne zavisnosti je deo svakog ključa te tabele.

Drugi uslov se ne pojavljuje baš tako često! U većini slučajeva, sve funkcionalne zavisnosti biće obuhvaćene prvim uslovom.

Boyce-Coddova normalna forma Poslednja forma koju ćemo - ukratko- razmotriti jeste Boyce-Cod~ova normalna forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh ~mo ~~a usl.ova. Da bi tabela bila u BCNF, mora biti u trećoj normalnoj formi i mora 1spumt1 prv1 od dva uslova, tj. sve funkcionalne zavisnosti moraju imati superključ na levoj strani.

Taj uslov je često automatski ispunjen i bez pred uzimanja posebn~hv mera, kao u ovom primeru. Ako imamo zavisnost koja krši ovo pravilo, moramo j OS jednom raz­dvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF.

Normalne forme višeg stepena .. Postoje i normalne forme viših stepena (četvrta, peta itd.) ali su one pogodmje za aka­demske rasprave nego za praktičnu primenu na projektovanje b~za podataka. 3NF (ili BCNF) sasvim. je dovoljna da reši te probleme redundantnost1 podataka na koje ćete naići.

Sažetak Za kraj, evo šta smo sve razmotrili u ovom poglavlju.

Koncepti • Entiteti su "stvari", a relacije su veze imeđu njih .

• Tabele sadrže podatke koji se prikazuju u tabelarnom obliku.

• Kolone tabela su atributi (obeležja) koji opisuju svaki entitet.

• Redovi tabela sadrže vrednosti iz svih kolona tabele .

• Ključevi omogućavaju jednoznačno identifikovanje pojedinih redova.

• Funkcionalne zavisnosti opisuju koji atributi određuju vrednosti drugih atributa.

• Šeme su "nacrti" baze podataka.

Pitanja

l'rmcipi projektovanja baza podataka • Redundantnost se mora minimizovati, ali bez gublje~a podataka.

• Anomalije pri dodavanju, brisanju i ažuriranju jesu problemi koji se pojavljuju kada se u tabelu s loše osmišljenom strukturom podaci dodaju, brišu iz nje ili ažuriraju .

• lzbegavajte strukture koje dovode do velikog broja null vrednosti.

Normalizovanje

• Normalizovanje je formalni postupak koji omogućava poboljšava~ e strukture baze podataka.

• Prva normalna forma (lNF) znači da kolone ili atributi sadrže isključivo proste vrednosti.

• Druga normalna forma (2NF) znači da svi atributi izvan ključa mor;Uu zavisiti od celog ključa.

• Treća normalna forma (3NF) znači da ne sme biti tranzitivnih zavisnosti.

• IJoyce-Coddova normalna forma (BCNF) znači da svi atributi moraju biti funk­cionalno određeni superključem.

Pitanja Superklj uč je

a) Minimalni ključ

b) Spoljni ključ

e) Grupa atributa koja jednoznačno identifikuje svaki red tabele

d) Minimalna grupa atributa koja jednoznačno identifikuje svaki red tabele 1 Ako je tabela u drugoj normalnoj formi

a) Takođe je u prvoj normalnoj formi

b) Takođe je u trećoj normalnoj formi

e) Ne sadrži tranzitivne zavisnosti

d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa l , Ako je tabela u trećoj normalnoj formi

a) Takođe je u Boyce-Coddovoj normalnoj formi

b) Sadrži atribute koji nisu prosti

e) Ne sadrži tranzitivne zavisnosti

d) Sadrži atribute koji nisu potpuno funkcionalno zavisni od primarnog ključa •1. Tri vrste anomalija nastaju pri

a) dodavanju, učitavanju i brisanju podataka

b) dodavanju, ažurira~u i brisanju podataka

e) učitavanju, ažuriranju i brisanju podataka

3

Page 26: Prirucnik Za MySQL

40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka

5. N-torka je

a) kolona

b) red

e) kandidat za ključ

d) vrsta narodnog kola

e) spoljni ključ

Vežbe 1. Normalizujte sledeću šemu u treću normalnu formu:

Porudžbine(šifraKupea, imeKupea, adresaKupea, brojPorudžbine, datumPorudž­bine, šifraRobe, nazivRobe, količinaRobe)

2. Pokušajte da osmisli te šemu koja je 3NF ali ne i u BC NF.

Odgovori

Pitanja 1. e

2. a

3. e

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

Vežbe 1.

Kupei(šifraKupea, imeKupea, adresaKupea)

Porudžbine(brojPorudžbine, datumPorudžbine, ~~~~~':~~~-~)

StavkePorudžbine(k:~i_~-~:_l!_~~~~~~.' ~~~~~?_<:• količinaRobe) Roba(šifraRobe, nazivRobe)

2. Postoji puno mogućih rešenja, proverite samo da vaše ne krši pravila

normalizovanja.

U sledećem poglavlju U poglavlju 4, "Prav ljenje baza podataka, tabela i indeksa", pretvorićete Šemu baze podataka u stvarne MySQL tabele.

4 Pravljenje baza podataka,

tabela i indeksa

u O VO M POGLAVLJU NAUČIĆETE da pravite osnovne MySQL strukture: baze 1 tlld,nnka, tabele i indekse. Razmotrićemo sledeće teme:

• Pravljenje baze podataka

• Biranje baze podataka

• Pravljenje tabela

• Tipovi podataka za MySQL-ove kolone

• Pravljenje indeksa

• l3risanje tabela, indeksa i baza podataka

• lzmena postojećih struktura tabela.

/.a rad s primerima u ovom poglavlju koristićemo jednostavnu bazu podataka: to je 1:,1 podataka employee o kojoj je već bilo reči u prethodnom poglavlju. Šema te baze

l"'d .1t~kaje sledeća:

t·mployee(employeeiD, name, job, ~~p-~:~~~-r:~_I_l2)

t k·pa rtment( departmentiD. name)

t•mployeeSkills( employeelD, skill)

tli ent(clientiD. name, address, eontaetPerson, eontaetNumber)

. l s si gnmcnt(~}~~~-~~~.' ~-~J?!~Y~:!:'?.· workdate, hours)

l >ok čitate gradivo iz ovog poglavlja, možete unositi odgovarajuće komande da biste lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse 11111/l'tc praviti pomoću bilo kojeg klijentskog programa za MySQL, ali u ovim primc­' lllt.l , bazu podataka napravićemo pomoću MySQL monitora. Opredelili smo se za to 11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa.

Page 27: Prirucnik Za MySQL

42 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Trebalo bi da se najpre prijavite u MySQL monitor, na isti način na koji ste to činili u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak".

U ovom poglavlju koristi ćemo mogućnosti za definisanje podataka koje pruža jezik SQL da bismo pravili baze podataka, tabele i indekse. Šta to tačno znači? SQL je skra­ćenica od Structured Query Language (strukturirani jezik za upite), što je jezik koji ćemo koristiti za izradu relacionih baza podataka i učitavanje podataka iz njih. Čine ga dve semantički odvojene komponente: jezik za definisanje podataka (engl. Data Difini­tion Language, DDL), koji omogućava formiranje struktura baze podataka), i jezik za rad s podacima (engl. Data Manipulation Language, DML), koji omogućava pretraživanje baze podataka.

U narednim odeljcima saznaćete kako se u MySQL-u prave baze podataka, tabele i indeksi.

Razlikovanje malih i velikih slova Pre nego što započnemo upotrebu jezika SQL i definišemo identifikatore MySQL-ovih objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u.

U rezervisanim rečima jezika SQL ne pravi se razlika između malih i velikih slova. To je standardno u svim sistemima za rad s bazama podataka.

Da li će MySQL praviti razliku između malih i velikih slova u imenima baza poda­taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to što će najčešće svakoj bazi podataka odgovarati određeni direktorijum, a svaka tabela biće smeštena u odgovarajaću datoteku. Imena tih direktorijuma i datoteka slede različita pravila, koja zavise od operativnog sistema.

To praktično znači da ako koristite Windows, u imenima baza podataka i tabela neće se praviti razlika između malih i velikih slova, ali će suprotno pravilo važiti ako koristite neki operativni sistem iz porodice Unix. To može biti uzrok zbrke, naročito ako je vaš operativni sistem OS X, koji možete podesiti tako da ne pravi razliku između malih i velikih slova (HFS+, standardno podešavanje), ili naprotiv, da je uzima u obzir (UFS).

Da biste smanjili mogućnost zbrke, korisno je da se naviknete da sve identifikatore tretirate kao da je uključeno razlikovanje malih i velikih slova, čak i pod operativnim sistemom Windows. To će vam omogućiti da lako pređete na drugu platformu. Namerna upotreba dva različita oblika istog identifikatora, npr. Zaposleni i zaposleni, može zbuniti ljude koji čitaju vaš kod, pa zato izbegavajte da to radite.

U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima će biti reči u nastavku teksta) nikad ne pravi razlika između malih i velikih slova.

ldentifikatori u MySOL-u Identifikator je opšta reč koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili indeksa. To je način da se nedvosmisleno identifikuje određeni objekat. Pre nego što počnete da sami pravite baze podataka i tabele, moramo objasniti i koji su identifika­tori ispravni u MySQL-u.

Biranje baze podataka

l lgl.tvnom, identifikatori mogu sadržati sve znakove koji postoje, osim sledećih:

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

• Imena baza podataka mogu sadržati sve znakove koji su dozvoljeni u imenima 1hrcktorijuma, ali ne i znakove koji imaju posebno značenje u imenima direkto-1 U u ma (/, \ i . ) , iz očiglednih razloga.

• Imena tabela mogu sadržati sve znakove koji su dozvoljeni u imenima datoteka, osi m znakova . i l.

~vi identifikatori, osim alijasa, mogu se sastojati od najviše 64 znaka. Imena alijasa (opt~ani su u poglavlju 7 ",Složeniji upiti") mogu sadržati najviše 255 znakova.

jt•dno neobično pravilo u MySQL-u glasi da možete koristiti rezervisane reči kao lo tlllflkatore, pod uslovom da ih pišete između navodnika. Na primer, možete imati

l ''" lu čije je ime TABLE . Razume se, ako je nešto dozvoljeno, to ne znači da to morate 'd •.t vezno i raditi, a u ovom slučaju, navedenu praksu bolje je izbegavati. Čak i ako se

t 11 tome dobro snalazite dok radite s MySQL-om, to može zbuniti program mysql­d11111p, koji se često koristi za izradu rezervnih kopija baze podataka.

!'ostoji kratak spisak rezervisanih reči koje MySQL prihvata kao identifikatore bez tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je prilično uobičajeno u ' tkodnevnim poslovima. Najčešći primeri na koje ćete nailaziti su upotreba rezervi­litt h reči DATE i TIMESTAMP za imena kolona.

Pravljenje baze podataka ~~.tkon projektovanja strukture baze podataka, naredni korak je, savim logično, da "l' t semo MySQL-u da želimo da napravimo novu bazu podataka. To se radi pomoću '><>L-ove komande CREATE DATABASE, na sledeći način:

• ~~ate database employee;

Da li je ova komanda uspešno izvršena, možete proveriti ako izdate komandu:

rhow databases;

Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka 11,1 vašem računaru .

Sada imate praznu bazu podataka koja čeka da u njoj napravite nekoliko tabela.

Biranje baze podataka l'rc nego što u bazi podataka employee napravimo novu tabelu ili uradimo bilo šta drugo u njoj, moramo obavestiti MySQL da želimo da radimo u našoj novoj bazi podataka. To se radi pomoću komande use, na sledeći način:

noe employee;

Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvršimo od s.tda pa nadalje, podrazumevaće se da se odnose na tu bazu podataka .

Page 28: Prirucnik Za MySQL

44 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Pravljenje tabela Tabele u bazi podataka employee napravićemo pomoću SQL-ove komande CREATE TABLE. Uobičajen oblik te komande je sledeći:

create table imetabele ( definicije kolona tabele ) [type=tip_tabele];

Kao što vidite, komanda počinje rečima create table, iza kojih sledi ime tabele koju bismo želeli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na kraju komande možete po potrebi zadati tip mašine baze podataka koji biste želeli da se koristi.

Primer izrade tabele Postupak ćemo ilustrovati primerom izrade tabele. U listingu 4.1 prikazana je grupa SQL-ovih komandi koja formira bazu podataka employee. Unesite ih ručno, ili preuz­mite datoteku (zajedno s nešto pro bnih podataka za bazu) sa Web lokacije posvećene ovoj knjizi.

Listing 4.1 SQL-ove komande koje formiraju bazu podataka employee

drop database if exists employee; create database employee;

use employee;

create table department (

departmentiD int not null auto increment primary key, name varchar(30) type=InnoDB;

create table employee

employeeiD int not null auto increment primary key, name varchar(BO), job varchar (30), departmentiD int not null references department(departmentiD) type=InnoDB;

create table employeeSkills

employeeiD int not null references employee(employeeiD), skill varchar(l5) not null, primary key (employeeiD, skill) type=InnoDB;

create table client

client ID int not null auto increment pri mary key', name varchar(40), address varchar(lOO),

·u•ltactPerson varchar ( 80) , t'lmtac tNumber char(l2)

ype= InnoDB;

tle table assignment

1 l lentiD int not null references client (clientiD), • 111ployeeiD int not null references employee (employeeiD), WtJr·kda te date not null, liours float, p t imary key (clientiD, employeeiD, workdate) lype= InnoDB;

Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci. l'očcćemo od:

ol t op database if exists employee;

t'raviJenJe tiltlcla

()va komanda ispituje da li već postoji baza podataka čije je ime employee; ako l'" ' toji, ona se briše, što vam "priprema teren", ako se tako može reći. To nije baš 111 ophodno i može biti čak i opasno, ali ovde smo to uradili da bismo obezbedili da 1 11"· '1 skript za izradu baze podataka uvek bude delotvoran, čak i ako ste ranije nešto l ' pcrim.entisali s bazom podataka employee.

Ukoliko MySQL koristite u okruženju čiji niste vlasnik, može se dogoditi da kom­l'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop 1.11 , ba se. U tom slučaju uklonite taj red iz skripta (ali proverite da ne postoji baza

pnd.ltaka čije je ime employee) . Zatim fonniramo bazu podataka i otvaramo je (biramo da je koristimo), kao što ste

1 1111j c radili:

11 c1te database employee; 11 w employee;

Sada počinjemo izradu tabela unutar te baze podataka. Najpre pravimo tabelu 'it'partment, na sledeći način:

1" 1 .a te table department (

departmentiD int not null auto increment primary key, name varchar(20) Lype =InnoDB;

Ova tabela ima dve kolone, departmentiD (šifra službe), koja je primarni ključ, 1 tl.lmc (naziv službe). Kolone tabele deklarišemo tako što zadamo listu deklaracija kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne 111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona.

Ovo je naša prva SQL komanda koja se rasprostire u više redova. Budući da su ll.il'ziku SQL razmaci nebitni, komande možemo pisati u obliku koji nam najbolje odgovara. Uobičajeno je da se stavke komande CREATE pišu svaka u svom redu, da bi l l' l,l komanda bila čitUivija . Interpretator jezika QL neće pokušati da rastuma č i vaŠlt

Page 29: Prirucnik Za MySQL

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

komandu dok ne otkucate završni znak tačka i zarez (;) i pritisnete taster Enter. (Možete se opredeliti i da komande završavate znacima \g, ali se znak tačka i zarez znatno češće koristi.)

U ovoj tabeli deklarišemo dve kolone. Svaka deklaracija kolone počinje imenom kolone, za čime slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu kolonu ovog primera jer se nešto lakše razume. Deklaracija

name varchar(20)

opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar znači daje u pitanju znakovna vrednost promenljive dužine, koja u ovom slučaju može sadržati najviše 20 znakova. Mogli smo da zadamo i tip char, što je znakovna vrednost fiksne dužine. Bez obzira na to da li zadate varchar ili char, način rada s tim poda­cima se neće razlikovati, jedina razlika je u obliku u kojem se ti podaci smešta ju u memoriju. Podatak tipa varchar ( 2 o) zauzima onoliko prostora koliko je potrebno za skladištenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna­kova, bez obzira na to da lije u njega smeštena bilo kakva vrednost.Više o relativnim prednostima i nedostacima ovih tipova podataka biće reči odeljku "Tipovi podataka u kolonama", u nastavku ovog poglavlja.

Pogledajmo sada definiciju prve kolone, koja izgleda ovako:

departmentiD int not null auto_increment primary key,

Ime ove kolone je department ID, a njen tip je int (integer). To je jedinstven broj (ne ponavlja se) koji ćemo koristiti za identifikovanje pojedinih službi i odeljaka kompanije.

Deklaraciji tipa podataka kolone slede dodatni podaci o koloni. Prvo smo zadali da je ta kolona tipa not null - drugim rečima , u svakom redu

tabele, ta kolona mora sadržati neku vrednost. Drugo, zadali smo daje ta kolona takođe tipa auto_increment. To je veoma

korisna mogućnost MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo šifru službe, MySQL će sam do deli ti jedinstven broj koji će biti sledeći po redosledu auto_increment sekvence (niza). To će vam prilično olakšati život.

Na kraju, odredba primary key znači da će ta kolona biti primarni ključ tabele. Ako se primarni ključ sastoji od samo jedne kolone, može se zadati u ovom obliku. Za primarne ključeve sastavljene od više kolona mora se upotrebiti drugi oblik komande, koji ćemo razmotriti u nastavku ovog poglavlja.

Time se završava definicija tabele department. A sada, pogledajte sam kraj SQL-ove komande. Iza završne zagrade nalazi se sledeći red:

type=InnoDB

Time se zadaje da tabela treba da koristi mašinu baze podataka InnoDB.Ako pažlji­vije pogledate definicije tabela, uočićete da smo sve tabele deklarisali kao InnoDB tabele.

l'raviJenje tabela

Šta to tačno znači? MySQL podržava razne mašine baze podataka, koje ćemo detalj nije razmotriti u poglavlju 9, "Tipovi tabela u MySQL-u". Standardni tip je My ISAM. Ako želite da koristite My ISAM tabele, nije neophodno da na kraj komande create database dodate odredbu type.

U ovom slučaju potrebne su nam InnoDB tabele zato što ćemo u nekoliko primera koristiti spoljne ključeve. Mašina baze podataka InnoDB podržava spoljne ključeve i lra nsakcije, što nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele često H l brže od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji .

Mogli smo da zadamo tabele različitih tipova i da imamo, na primer, nekoliko lnnoDB tabela i nekoliko MyiSAM tabela (pa čak i tabele još nekih drugih tipova, ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi ćemo isključivo lnnoDB tabele.

Pogledajmo drugu komandu create table:

create table employee

employeeiD int not null auto_increment primary key, name varchar(BO), job varchar ( 15) , departmentiD int not null references department(departmentiD) t ype=InnoDB;

U ovoj komandi samo je jedan deo sintakse nov. Posle dn ja kolona tabele employee JL' šifra službe (departmentiD) u kojoj zaposleni radi. To je spoljni ključ. U definiciji t.1bele to se deklariše pomoću odredbe references, na sledeći način:

departmentiD int not null references department(departmentiD)

Ovom odredbom smo zadali da kolona departmentiD tabele employee referencira kolonu (povezana je s kolonom) department ID tabele department.

Imajte u vidu da sintaksu za spoljni ključ možemo koristiti zato što je tabela employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih ključeva nije moguća. Prema planu razvoja, trebalo bi da spoljni ključevi u MyiSAM tabelama hudu podržani i jednoj od budućih verzija MySQL-a, verovatno u verziji 5.1.

Pogledajte sada treću komandu create table:

create table employeeSkills

employeeiD int not null references employee(employeeiD), skill varchar(15) not null, primary key (employeeiD, skill) type=InnoDB;

U ovoj tabeli takođe imamo spoljni ključ; to je kolona employee ID. Zanimljivo u vezi s definicijom ove tabele jeste to da ona ima primarni ključ koji se sastoji od dve kolone . Kao što vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim JC rasebno deklarisan primarni ključ u sledećem redu:

pt l.mary key (employeeiD, skill)

Page 30: Prirucnik Za MySQL

48 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Budući da u sintaksi definicija drugih tabela nema ničeg novog, nećemo ih detaljno objašnjavati. Obratite pažnju na to da smo u tabeli assignment upotrebili nekoliko novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokret­nim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku ovog poglavlja biće više reči o tim tipovim kolona.

Pomoću sledeće komande možete proveriti da li su tabele na vašem sistemu tačno

podešene:

show tables;

Trebalo bi da dobijete sledeće rezultate:

+-------- ------------+ l Tables_in_employee l +--------------------+

assignment client department employee employeeSkills

+--------------------+ Detaljnije podatke o strukturi svake tabele možete dobiti pomoću komande des­

cribe; na primer:

describe department;

Trebalo bi da na svom ekranu dobijete rezultate nalik na sledeće:

+--------------+-------------+-------------------+------+-----+---------+----------------+ 1 Field l Type l Collation l Null l Key l Default l Extra l +--------------+-------------+-------------------+------+-----+---------+----------------+ 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 +--------------+-------------+-------------------+------+-----+---------+----------------+

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

Komanda CREATE TABLE Pošto ste videli primer, možemo preći na opis cele sintakse komande CREATE TABLE. U MySQL-ovoj dokumentaciji stoji da komanda ima sledeći opšti oblik:

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

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

ili

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE izvorna_ tabela;

definicija_kolone: ime_kolone tip_podataka [NOT NULL l NULL] [DEFAULT

podrazumevana_vrednost ] [AUTO_INCREMENT] [PRIMARY KEY] [definicija_reference]

ili PRIMARY KEY (ime_indeksirane_kolone, .. . )

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

ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili INDEX [ime_indeksa] (ime_indeksirane_kolone, ... ) ili UNIQUE [INDEX] [ime_indeksirane_kolone , ... ) ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... ) ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]

(ime_indeksirane_kolone , ... ) [definicija_reference]

ili CHECK (izraz)

Pogledajmo detaljnije opcije koje postoje u opštoj definiciji. Rezervisana reč TEMPORARY omogućava izradu privremene tabele koja će biti

dosegljiva samo u tekućoj sesiji, a kada se veza s bazom podataka zatvori, tabela se automatski briše.

Odredbu IF NOT EXISTS možete upotrebiti da biste napravili novu tabelu samo ako ne postoji tabela s imenom koje ste zadali.

Pomoću odredbe LIKE izvorna_ tabela možete napraviti novu tabelu koja ima istu Šemu kao izvorna tabela.

U komandi CREATE TABLE deklarišemo unutar zagrada kolone koje nam trebaju, njihove tipove podataka i druge informacije koje se tiču strukture tabele. Najjednostav­nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared­nom odeljku ovog poglavlja objasnićemo važeće tipove podataka za kolone tabele.

Svaku deklaraciju kolone možemo, po potrebi, proširiti sledećim opcijama:

• Svaku kolonu možemo deklarisati kao NOT NULL ili NULL, što znači da ne dozvo­ljavamo da kolona sadrži vrednost NULL (opcija NOT NULL) ili da prihvatamo vred­nost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva.

• Pomoću rezervisane reči DEFAULT iza koje sledi neka vrednost možete zadati podrazumevanu vrednost za kolonu.

• Rezervisana reč AUTO_INCREMENT omogućava generisanje rednog broja, kao što smo to učinili u prethodnom primeru.Ta vrednost, koja se automatski generiše biće za jedan veća od tekuće najveće vrednosti iz tabele. Prvi red podataka koji un este u tabel u imaće redni broj l. Tabela može sadržati samo jednu kolonu tipa AUTO_INCREMENT, koja mora biti indeksirana. Obratite pažnju na to da u prethod­nim primerima nismo ručno napravili nijedan indeks; međutim, neki su ipak bili automatski napravljeni. Indeksi se automatski prave za kolone koje deklarišete kao primarne ključeve (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo deklarisali kao AUTO INCREMENT.

• Pojedine kolone možemo deklarisati kao primarne ključeve (odredba PRIMARY KEY).

• Pojedine kolone možemo deklarisati kao spoljne ključeve, pomoću opcije REFE­RENCES, kao u ovom primeru.

Page 31: Prirucnik Za MySQL

rU~IdVIJC .. rldVIJCIIJC UdLd fJUUdldl\d 0 ldUCid l IIIUCI\)d

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

TABLE možemo zadati i dodatne podatke:

• Možemo zadati primarni ključ koji se sastoji od više kolona, kao u ovom pri­meru, tako što iza opcije PRIMARY KEY navedemo imena kolona koje čine pri­marni ključ. Na taj način može se zadati i primarni ključ koji se sastoji od samo jedne kolone. Kolona deklarisana kao PRI MARY KEY može sadržati samo jedin­stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne može sadržati vrednost null.

• Opcije INDEX i KEY su sinonimi i znače da će zadata kolona (ili kolone) biti indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadrže jedinstvene vrednosti.

• Pomoću opcije UNIQUE zadaje se da određena kolona može sadržati samo jedinst­vene vrednosti. Kolone deklarisane kao UNIQUE takođe se automatski indeksiraju.

• Pomoću opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre­traživanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraživanje možete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9.

• Opcija FOREIGN KEY omogućava da deklarišete spoljne ključeve na isti način kao primarne ključeve.

Iza zatvarajuće zagrade možete zadati određene opcije koje se tiču tabele. Dosad smo već videli da to može biti tip tabele. Tipovi tabela detaljnije su opisani u poglavlju 9. Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele može biti jedan od sledećih:

• My ISAM, koji se podrazumeva, veoma je brz i podržava indekse za tekstualno pretraživanje; zamenjuje nekadašnji podrazumevani tip ISAM.

• ISAM je stariji tip tabela. Sličan je tipu My ISAM ali pruža manje mogućnosti, zbog čega bi trebalo da umesto njega uvek koristite MyiSAM.

• InnoDB je mašina baze podataka usklađena s grupom pravila ACID koja podržava transakcije, spoljne ključeve i zaključavanje podataka na nivou pojedi­načnog reda tabele.

• BDB (Berkeley DB) je mašina baze podataka koja podržava transakcije i zaklju­čavanje podataka na nivou stranice tabele.

• Ceo sadržaj tabela tipa HEAP čuva se u memoriji i nikad se ne upisuje na disk; zahvaljujući tome, te tabele su veoma brze, ali veličina im je ograničena i podaci iz njih se ne mogu restaurirati ukoliko se sistem pokvari.

• Tabele tipa MERGE omogućavaju kombinovanje više tabela tipa MyiSAM koje imaju istu strukturu, tako da se podaci iz njih čitaju kao da radimo s jednom tabe­lom.To se može iskoristiti kada operativni sistem ograničava maksimalnu veličinu datoteka - pa zbog toga i tabela.

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

Možemo zadati još nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri­''"w pre svega optimizaciji. Neke među njima objasnićemo u poglavlju 18",0ptimi­"v.tnje baze podataka" . To su sledeće opcije:

• AUTO_INCREMENT = # Omogućava da u koloni tipa auto_increment zadate početnu vrednost različitu od 1.

• AVG_ROW_LENGTH = # Omogućava da zadate prosečnu dužinu reda da biste "pomogli" mašini baze podataka.

• CHECKSUM = l Omogućava da uključite izračunavanje kontrolnog zbira u redo­vima tabele, što može biti korisno kada rešavate problem oštećenog sadržaja tabele. Zadajte vrednost 1 da biste uključili izračunavanje. Ova opcija je stan­dardno isključena a upotrebljiva je samo za My ISAM tabele.

• COMMENT = "tekst" Omogućava da tabeli pridružite neku napomenu.

• MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se može uneti u tabelu.

• MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela može sadržati.

• PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje) sadržaj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate vrednost 1, svi indeksi će se pakovati; ako zadate vrednost o, nijedan indeks se neće pakovati.

• PASSWORD = "tekst• U standardnoj verziji MySQL-a ova opcija na radi baš ništa.

• DELAY_KEY_WRITE = {o l l} Omogućava da odložite ažuriranje indeksa dok ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele.

• ROW_FORMAT= {default l dynamic l fixed l compressed } Omogućava

da zadate format u kojem se skladište podaci u redovima tabele. Upotrebljiva je samo za MyiSAM tabele.

• RAID_TYPE= {l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=#

Omogućava da u cilju optimizovanja servera zadate tip RAID grupe diskova koji imate.

• UNION= (ime_tabele, [ime_tabele ••• ]) Ovaopcija,namenjenaisključivo

tabelama tipa MERGE, omogućava da zadate tabele koje čine grupu MERGE.

• INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva isključivo za tabele tipa MERGE i služi da se zada tabela u koju se podaci umeću.

• DATA DIRECTORY="apsolutna putanja• Pomoću ove opcije možete izričito zadati direktorijum u koji želite da se smeštaju podaci tabele.

• INDEX DIRECTORY="apsolutna putanja" Pomoću ove opcije možete izričito zadati direktorijum u koji želite da se smešta sadržaj indeksa tabele.

Page 32: Prirucnik Za MySQL

rU~IdVIJ'C ""t rldVIJ'CIIJ'C UdLd JJUUdldl\d, lciU'Cicl l IIIU\..1\.>cl

I najzad, ako ponovo pogledate opšti oblik komande CREATE TABLE, uočićete da komandu CREATE TABLE možete završiti komandom SELECT. SELECT je SQL-ova komanda koja omogućava učitavanje redova iz jedne ili više tabela. (Podrobnije je opisana u poglavljima 6, 7 i 8 ove knjige.) Pomoću tc opcije možete napuniti novu tabelu podacima koje učitava zadata komanda select.

Tipovi podataka u kolonama U MySQL-u postoje tri osnovna tipa kolona: numerički, znakovni ili tekstualni i datumsko/vremenski. Objasnićemo ih jedan po jedan u narednim odcljcima.

Numerički tipovi podataka Numerički tipovi se koriste za skladištenje brojeva. U našem primeru, upotrebili smo tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva primera podtipova numeričkih tipova: tačni numerički tipovi i aproksimirani (pri­bližni) numerički tipovi.

Za numeričke tipove možete zadati ukupan broj cifara koji sc prikazuje (širina, M) i, za tipove s pokretnim zarezom, broj decimalnih mesta, D.Vrednosti tih parametara zadaju se iza deklaracije tipa podatka; na primer:

plata decimal(lO, 2)

Ova komanda omogućava prikazivanje vrednosti sa ukupno 12 cifara i dva deci­malna mesta.

Možete se opredeliti da ne zadate nijedan od ovih parametara, ili možete zadati samo ukupnu širinu za prikazivanje, ili i širinu i broj decimala.

Uz numeričke tipove možete zadati rezervisane reči UNSIGNED i/ili ZEROFILL.

Rezervisana reč UNSIGNED znači da kolona može sadržati samo nule ili pozitivne vrednosti. Rezervisana reč ZEROFILL znači da će se vrednosti iz kolone prikazivati s vodećim nulama.

Tačni numerički tipovi opisani su u nastavku teksta.

Tip NUMERIC ili DECIMAL O be reči označavaju potpuno isti tip podataka, a DECIMAL se može skratiti na DEC. Ovi tipovi omogućavaju čuvanje tačnih vrednosti s pokretnim zarezom i obično se koriste za rad s novčanim vrednostima. Opseg mogućih vrednosti jednak je kao za brojeve s pokretnim zarezom dvostruke preciznosti.

Tip INTEGER i varijante Ovaj tip se može skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se smcštaju u četiri bajta, što daje 232 moguće vrednosti. Tip INT ima nekoliko varijanti:

• TINYINT zauzima jedan bajt (28 mogućih vrednosti). Rezervisane reči BIT i BOOL

su sinonimi za TINYINT.

• SMALLINT zauzima dva bajta (216 mogućih vrednosti).

Tipovi podataka u kolonama

• MEDIUMINT zauzima tri bajta (224 mogućih vrednosti).

• BIGINT zauzima osam bajtova (264 mogućih vrednosti).

Aproksirnirani numerički tipovi opisani su u nastavku teksta.

Tip FLOAT Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti. Može predstavljati pozitivan broj u opsegu od 1.18 x 10-38 do 3.40 x 1038 i sličan opseg 11egativnih brojeva.

Tip DOUBLE Ovaj tip je namenjen brojevima s pokretnim zarezom dvostruke preciznosti. Sinonimi 'la DOUBLE SU REAL i DOUBLE PRECISION. Mogu predstavljati pozitivan broj u opsegu od 2.23 x 10-308 do 1.80 x 10308 i sličan opseg negativnih brojeva.

Znakovni i tekstualni tipovi podataka MySQL podržava više znakovnih i tekstualnih tipova podataka. Osnovni tekstualni tipovi SU CHAR, VARCHAR, TEXT, BLOB, ENUM i SET. OpisaĆemo ih jedan po jedan u 11astavku teksta.

Tip CHAR l'ip CHAR omogućava skladištenje znakovnih vrednosti fiksne dužine. Kao u primeru haze podataka employee, rezervisanoj reči CHAR obično sledi dužina (broj znakova) zna­kovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate dužinu, podrazumeva se CHAR ( 1) .

Maksimalna dužina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upiše ll kolo~ u ta?ele, on uvek ima dužinu koju ste zadali u definiciji kolone. To se postiže d~?unF:anJem po~atka u koloni razmacima. Ti razmaci se automatski uklanjanju pri liCJtavanJU podatka IZ kolone tipa CHAR.

Očigledno je da podaci tipa CHAR zauzimaju više prostora na disku od ekviva­il'J~tnih z~akovnih ~~ednosti promenljive dužine. Prednost im je to što se podaci brže uČ!tavaju 1z tabele CIJe su sve kolone fiksne širine (tj. CHAR, numerički ili date).

ll udući da je brzina učitavanja podataka često važnija od prostora koji oni zauzimaju na disku, možda ćete se opredeli ti da tekstualna polja u kojima se vrednosti ne razli­k LUU mnogo po dužini deklarišete kao CHAR da biste (malo) optimizovali sistem.

Ispred deklaracija oba tipa, CHAR i VARCHAR, možete dodati rezervisanu reč NATIO­

NAL, Što znači da želite da ograničite sadržaj na standardni skup znakova. Pošto se ova opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil­llOSt između različitih platformi.

Deklaracijama tipova CHAR i VARCHAR može slediti rezervisana reč BINARY što znači d.t sc pri poređer0u znakovnih vrednosti pravi razlika između malih i velikih slova. Podrazumevani način poređenja je da se ta razlika ne pravi.

Page 33: Prirucnik Za MySQL

54 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Tip VARCHAR .. v· v·

Tip VARCHAR omogućava skladištenje znakovnih nizova promenljlVe duzme. Duzma podataka zadaje se između zagrada iza imena tipa, na primer, VARCHAR (l o l . Opseg

mogućih vrednosti je od O do 255.

Tipovi TEXT, BLOB i njihove varijante Tipovi TEXT omogućavaju skladištenje tekstualnih podataka dužih od ono.g što m?Ž.e da stane u tipove CHAR i VARCHAR. BLOB je skraćenica za Binary Large OBject (vehki binarni objekat). Ovi tipovi se međusobno ni po čemu ne razlikuju, jedino je BLOB

namenjen čuvanju binarnih a ne tekstualnih podataka. Pri poređenju podataka tipa BLOB pravi se razlika između malih i velikih slova, dok se to ne čini pri poređenju P~.da­taka tipa TEXT. Oba tipa su promenljive dužine i za oba postoje varijante razmh velicma:

• Tip TINYTEXT ili TINYBLOB može sadržati najviše 255 (to je 28-1) znakova ili

ba j tova. • Tip TEXT ili BLOB može sadržati najviše 65,535 (i 6-1) znakova ili bajtova (64 KB).

• Tip MEDIUMTEXT ili MEDIUMBLOB može sadržati najviŠe 16,777,215 (224

-1) znakova

ili bajtova (16 MB). • Tip LONGTEXT ili LONGBLOB može sadržati najviše 4,294,967,295 (2

32-1) znakova

ili bajtova (4 GB).

Tip ENUM . ,. . v

Ovaj tip podataka omogućava da zadate hstu moguClh vrednost1. Kolona tabele ~oze sadržati jednu vrednost iz nabroj anog skupa mogućih. Tip podataka ENUM deklanse se

na sledeći način:

pol enum('m', 'Ž')

Pošto vrednost tipa ENUM može biti i NULL, moguće vrednosti kolone pol su m,

ž, NULL ili error.

Tip SET · v .

Tip SET je sličan tipu ENUM s tom razlikom što kolone u redovima tabele mogu sadrzat1

i više vrednosti iz nabrojanog skupa mogućih.

Datumski i vremenski tipovi podataka MySQL podržava više tipova za rad s datumima i vremenima, koji su opisani u nared-

nim odeljcima.

Tip DATE Tip date omogućava skladištenje datuma. MySQL očekuje da datum bude u ISO redosledu godina-mesec-dan, čime se izbegavaju problemi usled različitih formata datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD.

Pravljenje indeksa

fip TIME Ovaj tip <:n;ogućava skladištenje podataka koji predstavljaju vreme, koje se prikazuje u lormatu CC:MM:SS.

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

fip TIMESTAMP <)vo je koristan tip podataka za kolone tabele. Ako u određenom redu ne zada te vred­IIOSt za kolonu ovog tipa, ili zada te NULL, u kolonu se upisuje vreme kada je red dodat t.tbcli ili kada je poslednji put izmenjen sadržaj reda.

Kada učitatate podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE­

'1' IME. To je značajna razlika između MySQL-ovih verzija 4.0 i 4.1. Ranije ste u dekla­' .t ciji kolone tipa TIMESTAMP mogli da zadate širinu na kojoj se prikazuju podaci iz ll' kolone .

rip YEAR ()vaj tip omogućava skladištenje podataka koji predstavljaju godine. Kada deklarišete ~o! onu ovog tipa, možete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podra­tumeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069.

Pravljenje indeksa Sve indekse koji vam trebaju najčešće ćete praviti automatski kada pravite tabele. Za W;tku kolonu koju deklarišete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto­lll.ltski se formira i indeks.

Ponekad ćete ustanoviti da koristite veći broj upita koji obuhvataju kolonu za koju 11istc definisali indeks; u takvim slučajevima možete dodati nov indeks pomoću ~oman de CREATE INDEX.

Zanimljivo je to da se, pre izvršavanja, komanda CREATE INDEX preslikava u komandu ALTER TABLE. Komanda ALTER TABLE može se upotrebiti i za mnoge druge 11.11ncne, koje ćemo opisati u poslednjem odeljku ovog poglavlja.

Na primer, tabeli employee možemo dodati nov indeks na sledeći način:

<' l' ate index name on employee (name) ;

Ova komanda pravi indeks čije je ime name nad kolonom name tabele employee. Komanda create index nema puno opcija. Ispred reči index možete dodati reč

liN J QUE ako želite indeks s jedinstvenim vrednostima. Osim toga, ispred reči index 111ožcte navesti rezervisanu reč FULLTEXT da biste napravili indeks za tekstualno pre­!I,J~ivanje MyiSAM tabele. (Više detalja o tome naći ćete u poglavlju 9.)

Page 34: Prirucnik Za MySQL

56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Indeksi definisani nad kolonama tipa char i varchar mogu se ograničiti na prvih nekoliko znakova u polju. To ćete uraditi tako što iza imena indeksirane kolone zada te između zagrada broj znakova koji želite da se indeksira, na primer:

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

Pošto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad numeričkim kolonama, indeksiranje samo nekoliko početnih znakova poboljšava performanse.

Brisanje baza podataka, tabela i indeksa Pošto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da naučite i da ih brišete. Rezervisana re č koja vam treba za tu namenu jeste DROP.

Celu bazu podataka, zajedno s njenim sadržajem, brišete pomoću sledeće komande (nemojte je još zadati!):

drop database employee;

Ispred imena baze podataka možete dodati neobaveznu opciju IF EXISTS. Ako se vratite na listing 4.1, videćete da je u njemu upotrebljena baš ova verzija komande DROP DATABASE.

Tabelu možete izbrisati pomoću komande DROP TABLE, na primer:

drop table assignment;

Opšti oblik komande DROP TABLE izgleda ovako:

DROP [TEMPORARY] TABLE [IF EXISTS] ime_tabele [, ime tabele, ... ]

Ako želite da izbrišete privremenu tabelu, upotrebite rezervisanu reč TEMPORARY

Istom komandom možete izbrisati više tabela ako zadate listu njihovih imena razdvo­jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti način kao u komandi DROP DATABASE.

Indeks brišete pomoću komande DROP INDEX, na primer:

drop index part_name on employee;

Kao što vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridružen.

lzmena strukture postojeće tabele Osim izrade novih tabela i brisanja postojećih, često će vam zatrebati da izmenite strukturu postojeće tabele. To se može uraditi pomoću komande ALTER TABLE- ona ima veliki broj varijanti koje se mogu upotrebiti za menjanje struktura tabela.

Na primer, indeks nad ta belom employee mogli smo da napravimo na sledeći način:

alter table employee add index name (name) ;

tzmena struKture postoJece t110e1e

ll udući da komanda ALTER TABLE pruža veliki broj mogućnosti, ima i veliki broj lj H 'Ja . Opšti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji

' '~·. leda ovako:

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

t a_ izmene:

il l

lli l l i l l i l l i ll i

l l i l 1 i

11 i l ll l J i

ADD

ADD

ADD

ADD

ADD

ADD

ADD

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

ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT} CHANGE [COLUMN] staro_ime_kolone definicija kolone

[FIRST l AFTER ime_kolone] -MODIFY [COLUMN] definicija_kolone [FIRST l AFTER ime_kolone] DROP [COLUMN] ime_kolone DROP PRIMARY KEY

l l i DROP INDEX ime_indeksa l l i DISABLE KEYS

1 l i ENABLE KEYS

lli RENAME [TO] novo_ime tabele l l i ORDER BY ime kolone ll i opcije_za_tabelu

Većina ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi ' 'll EA TE TABLE, kao što je ADD PRI MARY KEY Opisaćemo ukratko one koje možda nisu t1.1[j asnije.

pcije CHANGE i MODIFY zapravo su jedna te ista opcija i omogućavaju izmenu defi­lltnje kolone ili njenog mesta u tabeli.

Opcija DROP COLUMN briše kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP

1 NDEX brišu samo indeks pridružen koloni.

Opcija DISABLE KEYS nalaže MySQL-u da ne ažurira sadržaj indeksa, ali upotre­i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS uključuje ažuriranje indeksa.

Opcija RENAME omogućava promenu imena tabele. Opcija ORDER BY će poređati zadatim redosledom redove tabele na koju je prime­

IIJCI1a, slično opciji ORDER BY u komandi SELECT, koju ćemo razmatrati u poglavlju 6, .. Korišćenje upita u MySQL-u". Taj red o sled neće biti očuvan kada se kasnije unesu Ilovi podaci u tabelu.

Opcija opcije_za_tabelu omogućava da na kraj komande zadate iste opcije za t.ll>elu kao u komandi CREATE TABLE- više detalja o tome naći ćete u prethodnom dl'lu ovog poglavlja.

Page 35: Prirucnik Za MySQL

58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa

Sažetak U ovom poglavlju, naučili ste da pravite i brišete baze podataka, tabele i indekse, i da izmenite strukturu postojeće tabele.

ldentifikatori i razlikovanje malih i velikih slova • Za imena baza podataka važe ista pravila razlikovanja malih i velikih slova kao u

direktorij urnima vašeg operativnog sistema. Za imena tabela važe ista pravila kao za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika između malih i velikih slova.

• Svi identifikatori, osim alijasa, mogu sadržati najviše 64 znaka. Dužina alijasa može biti najviše 255 znakova.

• Identifikatori mogu da sadrže većinu postojećih znakova, ali imena baze podataka ne mogu sadržati znakove l, \ i . a imena tabela ne mogu sadržati znakove . i l.

• Rezervisane reči možete koristiti kao identifikatore, pod uslovom da ih pišete između navodnika.

Pravljenje baze podataka • create database ime_baze; pravi novu bazu podataka.

• use database ime_baze; bira (otvara) bazu podataka za upotrebu.

Pravljenje tabela • Tome služi komanda create table, čiji opšti oblik izgleda ovako:

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

ili

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE ime_postojeće_tabele;

definicija_kolone: ime_kolone tip_podataka [NOT NULL J NULL) [DEFAULT

podrazumevana_vrednost] [AUTO_INCREMENT] [PRIMARY KEY] [definicija_reference]

ili PRIMARY KEY (ime_indeksirane_kolone, .. . ) ili KEY [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili UNIQUE [INDEX] [ime_indeksa] (ime_indeksirane_kolone, ... ) ili FULLTEXT [INDEX] [ime_indeksa] (ime_indeksirane_kolone, .. . ) ili [CONSTRAINT simbol] FOREIGN KEY [ime_indeksa]

(ime_indeksirane_kolone, ... ) [definicija_reference]

ili CHECK (izraz)

;:,azetaK

l ipovi podataka za kolone • Tačni numerički tipovi SU TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC

i DECIMAL.

• Aproksimirani numerički tipovi su FLOAT i DOUBLE.

• Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB .

• Za rad S datumima i vremenima služe tipovi DATE, TIME, DATETIME, TIMESTAMP i YEAR.

• Za navedena imena tipova podataka postoji i više alijasa (sinonima).

Brisanje baza podataka, tabela i indeksa • Bazu podataka brišete pomoću komande

drop database ime_baze;

• Tabelu brišete pomoću komande drop table ime_tabele;

• Indeks brišete pomoću komande drop index ime_indeksa on ime_tabele;

lzmena strukture postojeće tabele • Strukturu tabele menjate pomoću komande ALTER TABLE, čiji opšti oblik

izgleda ovako: ALTER [IGNORE) TABLE ime_tabele vrsta izmene [, vrsta_izmene ... ]

vrsta izmene: ADD

ili ADD ili ADD ili ADD ili ADD ili ADD ili ADD

[COLUMN] definicija_kolone [FIRST l AFTER ime kolone [COLUMN] (definicija_kolone, definicija_kolo;e, ... ) INDEX [ime_indeksa] (ime_indeksirane_kolone, .. . ) PRIMARY KEY (ime_indeksirane_kolone, .. . ) UNIQUE [ime_indeksa] (ime_indeksirane_kolone, .. . ) FULLTEXT [ime_indeksa] (ime indeksirane kolone, ... ) [CONSTRAINT simbol] FOREIGN-KEY [ime_indeksa] (ime_indeksirane_kolone, ... ) [definicija_reference]

ili ALTER [COLUMN] ime_kolone {SET DEFAULT literal l DROP DEFAULT}

ili CHANGE [COLUMN] tekuće_ime_kolone definicija kolone [FIRST l AFTER ime_kolone] -

ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone] ili DROP [COLUMN] ime_kolone ili DROP PRIMARY KEY ili DROP INDEX ime_indeksa ili DISABLE KEYS ili ENABLE KEYS ili RENAME [TO] novo_ime tabele ili ORDER BY ime_kolone ili opcije_za_tabelu

Page 36: Prirucnik Za MySQL

bU roglaVIJe 4 rraVIJenJe oaza poaataKa, taoe1a 1 maeKsa

Pitanja 1. Šta od sledećeg nije ispravno ime tabele u MySQL-u?

a) employee

b) select

e) employee.skill

d) employeeSkills

2. Od sledećih tvrdnji o tipovima podataka CHAR i VARCHAR, koje su tačne?

a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadržaj.

b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri upisi­vanju na disk.

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

d) Kolona tipa VARCHAR uvek zauzima isti prostor na disku, bez obzira na sadržaj.

3. Pre nego što počnemo da pravimo tabele u bazi podataka, moramo prvo

a) napraviti indekse tabela

b) napraviti bazu podataka

e) napraviti bazu podataka i otvoriti je za upotrebu

d) napraviti sve kolone tabela

4. Od sledećih komandi CREATE TABLE, koja je sintaksno ispravna?

a) create table department

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

b) create table department type=InnoDB (

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

} ;

e) create department

department ID int not null auto - increment pri mary name varchar(20} type=InnoDB;

d) create table department (

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

key,

key,

key,

key,

VU~UVUII

5. Da biste izbrisali bazu podataka (čije je ime dbname) i ceo njen sadržaj, zadali biste

a) drop all tables on dbname;

b) drop database dbname;

e) drop dbname;

d) delete database dbname;

Vežbe 1. Napišite SQL komande koje formiraju bazu podataka porudzbine čija je šema

sledeća:

kupac(kupaciD, kupaclme, kupacAdresa)

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

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

Možete izabrati proizvoljne tipove podataka.

Testirajte komande u MySQL-u, a zatim pregledajte rezultujuće tabele pomoću komandi SHOW i DESCRIBE.

2. Svakoj porudžbini u tabeli porudzbine želimo da dodamo novo polje nazvano napomena, koje će biti tipa TEXT. Obavite to pomoću odgovarajuće komande ALTER TABLE, a zatim proverite rezultat pomoću komande DESCRIBE.

3. Izbrišite bazu podataka porudzbine.

Odgovori

Pitanja 1. e

2. a

3. e

4. d

5. b

Vežbe create database porudzbine;

use porudzbine;

create table kupac (

kupaciD int not null auto increment primary key, kupacime varchar(20}, kupacAdre sa varchar(BO} t ype I nnoDB ;

Page 37: Prirucnik Za MySQL

b.l roglaVIJe 4 rraVIJenJe oaza pooaiaKa, Iaoe1a 1 moeKsa

create table porudzbine (

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, robaNaziv varchar(20) type = InnoDB;

create table porudzbinaStavka

porudzbinaiD int not null references porudzbine(porudzbinaiD), robaiD int not null references roba(robaiD), robaKolicina int, primary key (porudzbinaiD, robaiD) type = InnoDB;

alter table porudzbine add column napomena text;

drop database porudzbine;

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

III Upotreba MySQL-a

5 Umetanje, brisanje i ažuriranje podataka

6 Korišćenje upita u MySQL-u

7 Složeniji upiti

8 Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT

Page 38: Prirucnik Za MySQL

5 Umetanje, brisanje

i ažuriranje podataka

u OVOM POGLAVLJU OBJASNIĆEMO kako se pomoću komande INSERT, DELETE

1 UPDATE umeću i ažuriraju podaci u MySQL-ovoj bazi podataka . Razmotrićemo sledeće teme:

• Komanda INSERT

• Komanda DELETE

• Komanda UPDATE

• Učitavanje podataka pomoću komande LOAD DATA INFILE

• Proširenja: komande REPLACE i TRUNCATE.

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

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

U listingu 5.1 prikazano je nekoliko primera komande insert.

Listing 5.1 employee_data.sql

use employee;

d lete from department; insert into department values (42 l 'Finance') l

(128 1 'Rs arch and Development') 1

(Nur.r, l 'll um<~ n R a out ces' ) l

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

Page 39: Prirucnik Za MySQL

t'oglaVIJe o umetanJe, onsanJe 1 azumanJe podataka

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

delete from employeeSkills; insert into employeeSkills values (7513, •e•)' (7513, • Perl'), (7513, 'Java'), (9842, 'DB2'), (6651, 'VB'),

(6651, 'Java'), (9006, 'NT'), (9006, 'Linux');

delete from client; insert into client values (NULL, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', l 95551234 l) '

(NULL, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', l 95559876 l) ;

delete from assignment; insert into assignment values (l, 7513, '2003-01-20'' 8.5);

Obratite pažnju na to da pre nego što dodamo nove podatke u tabelu, izvršavamo komandu DELETE- ni u ovom slučaju to nije neophodno, ali tako ćete ukloniti iz tabele probne podatke koje ste možda ranije uneli. U narednom odeljku vratićemo se na komandu DELETE.

Osim toga, obratite pažnju i na to da smo uneli probne podatke koji odgovaraju primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i nekoliko dopunskih redova.

Sve navedene komande INSERT međusobno su veoma slične. Pogledajmo prvu da biste shvatili kako deluju:

insert into department values (42, 'Finance'), (128, 'Research and Development'), (NULL, 'Human Resources'), (NULL, 'Marketing');

U prvom redu zadali smo ime tabele u koju želimo da unesemo podatke - u ovom slučaju, to je tabela department, u koju unosimo četiri reda s podacima. Možda se sećate da tabela department ima dve kolone, departmentiD i name. (U to se možete uveriti ako izdate komandu describe department.)

Komanda INSERT

U prva dva reda izričito smo zadali vrednosti za kolonu departmentiD. Pogle­dajmo ponovo definiciju kolone departmentiD. Verovatno se sećate iz prethodnog poglavlja da deklaracija te kolone izgleda ovako:

departmentiD int not null auto_increment primary key

Budući daje u pitanju kolona tipa auto_increment, možemo izričito zadati vrednost za nju, ili prepustiti MySQL-u da sam generiše neku vrednost. (Pri upotrebi kolona tog tipa obično se prepušta MySQL-u da sam izračuna vrednost, ali postoje i slučajevi, kao što je ovaj, gde ćete imati postojeću vrednost koju ćete želeti da upotrebite.)

U redovima s podacima o službama Human Resources i Marketing, u koloni department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment koji izračunava novu vrednost. Pogledajmo Šta ćemo dobiti s tom komandom lNSERT.

Ako pažljivije pogledate pojedine komande INSERT, uočićete da su podaci koji se umeću u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese­arch and Development'. Polunavodnici se ne koriste za numeričke tipove.

Ukoliko se podaci uokviruju polunavodnicima, šta treba uraditi kada podatak sadrži polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape). Jednostavnije rečeno, ispred svakog polunavodnika treba dodati obrnutu kosu crtu (\), na primer, 'o\'Leary'.

Šta treba uraditi ako želimo da obrnuta kosa crta bude baš obrnuta kosa crta, bez ikakvog posebnog značenja? U tom slučaju, morate na isti način preslikati i obrnutu kosu- zamenite je s dve obrnute kose crte (\ \).

Podatke učitavamo iz baze pomoću komande SELECT. Tu komandu ćemo veoma detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da će se, ako zadate:

select * from ime_tabele;

učitati svi podaci koji se nalaze u tabeli. Ako zadate:

select * from department;

trebalo bi da na ekranu dobijete rezultate nalik na sledeće:

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

42 Finance 128 Research and Develop 129 Human Resources 130 Marketing

----------- --+----------------------+ ~ rows in set (0.01 sec)

Trebalo bi da bude vidljivo da je rezultat upotrebe kolone tipa auto_increment vrt•dnost koja je za jedan veća od tekuće najveće vrednosti u koloni.

Page 40: Prirucnik Za MySQL

GB Poglavlje 5 Umetanje, brisanje i ažuri ra nje podataka

U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima sledeći opšti oblik:

INSERT [LOW_PRIORITY l DELAYED] [IGNORE] [INTO] ime_ tabele [ (ime_kolone, ... ) J

VALUES ((izraz l DEFAULT), ... ),( .. . ), ... [ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... J

ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] [INTO] ime tabele [ (ime_kolone, ... ) J SELECT ...

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

U prime rima koje smo dosad videli, upotrebljen je prvi oblik komande. Obratite pažnju na to da rezervisana reč INTO nije obavezna. Mogli smo je izostaviti i započeti upit s insert employee values, ali smatramo da reč INTO doprinosi razumljivosti upita.

Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati listu vrednosti poredanih istim redosledom kao odgovarajuće ciljne kolone tabele. U ovom primeru, morali smo prvo da zadamo vrednost za kolonu department ID, a zatim i za kolonu name jer je takva struktura tabele. Iz primera se vidi da ovaj oblik omogućava da se jednom komandom INSERT umetne više novih redova u tabel u.

Drugi oblik komande INSERT završava se komandom SELECT. Um.esto da vredno­sti umećete ručno, ovaj oblik omogućava da podatke učita te iz jedne ili više tabela baze podataka i da ih zatim umetnete u ciljnu tabelu.

Treći oblik komande INSERT omogućava da izričito zadate kolone u koje treba umetnuti podatke. Primer upotrebe ovog oblika komande INSERT:

insert into department set name='Asset Management';

Ovaj oblik omogućava da umetnete samo jedan red po komandi, ali ne morate da zadate vrednosti za sve kolone. U ovom primeru, zadajemo vrednost samo za kolonu name. Sve ostale kolone će preuzeti podrazumevane vrednosti (u kolonama u kojima su takve vrednosti definisane) ili vrednost NULL. U ovom slučaju, koloni department ID

prosleđuje se vrednost NULL, usled čega se aktivira mehanizam auto_increment koji generiše novu vrednost u toj koloni. (U to se možete uveriti ako ponovo izdate komandu select * from department.)

Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako one deluju:

• Možete zadati da se komanda INSERT izvršava s niskim prioriteom (opcija LOW PRIORITY), ili da se izvršavanje odloži (opcija DELAYED). Obe opcije čine da se umetanje podataka u tabelu odloži dok više ne bude nijednog klijenta koji poku­šava da učita podatke iz tabele . Razlika između ove dve opcije je u tome što

Komanda INSERT

opcija LOW PRIORITY blokira klijentski program koji umeće podatke, dok opcija DELAYED to ne čini. Ukoliko izdate komandu za umetanje podataka s opcijom LOW PRIORITY, možda ćete morati da sačekate pre nego što budete mogli da nastavite izvršavanje upita iz svog klijentskog progran1a. Ako upotrebite opciju DELAYED, biće vam dozvoljeno da započnete izvršavanje drugog upita, ali onda morate imati u vidu da vaši podaci neće biti upisani u tabelu dok ona ne bude potpuno slobodna.

• Opcija IGNORE je korisna prvenstveno kada umećete više redova istovremeno. Standardno ponašanje je takvo da ukoliko jedan od redova koji pokušavate da umetnete izazove grešku tipa dupliran primarni ključ ili duplirana vrednost u koloni koja prihvata samo jedinstvene vrednosti, dolazi do greške a operacija umetanja se poništava. Ako upotrebite opciju IGNORE, greška se zanemaruje a postupak umetanja se nastavlja s podacima iz sledećeg reda.

• Možete izričito zadati da kolona treba da preuzme svoju podrazumevanu vred­nost ako umesto vrednosti za kolonu zadate opciju DEFAULT.

• Opcija ON DUPLICATE KEY UPDATE pruža elegantno rešenje problema duplira­nog primam og ključa ili duplirane jedinstvene vrednosti. Iza ove opcije sledi komanda update koja menja postojeću vrednost primarnog ključa ili postojeću jedinstvenu vrednost u koloni tako da se ona više "ne sudara" s podacima iz novog reda.

Naredni kratak primer ilustruje uobičajeni način upotrebe opcije ON DUPLICATE ~ J•,Y UPDATE:

t' t·eate table warning (

employeeiD int primary key not null references employee(employ­' t I D),

count int default l ) t ype =InnoDB;

insert into warning (employeeiD) values (6651)

on duplicate key update count=count+l;

Ova opcija je korisna u slučajevima kada ne samo što želite da unesete jedinstvene vrednosti, već hoćete i da izvršite neku akciju, npr. da povećate određeni brojač, kada w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog događaja je korisna. Nastavljajući s primerom baze podataka employee, zaposlene kojima je dupliran pri­IILlrni ključ evidentirali bismo u tabeli warning (upozorenje).

Da biste evidentirali upozorenje koje se tiče određenog zaposlenog, izvršite ovu komandu INSERT. Budući da kolona count ima podrazumevanu vrednost 1 i za nju 111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD biće upisana vrt·dnost 1 svaki put kada umetnete red u tabelu . Svaki naredni red koji u kolonu • mployeeiD umeće istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE ko1.1 povcbva brojač.

Page 41: Prirucnik Za MySQL

70 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka

Komanda REPLACE Komanda REPLACE deluje slično komandi INSERT, s tom razlikom što ako dođe do

dupliranja ključa, novi red koji umećete zamenjuje postojeći r~d. , . v • •

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

REPLACE [LOW PRIORITY l DELAYED]

ili

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

REPLACE [LOW PRIORITY l DELAYED] [INTO] im~_ tabele [ (ime_kolone, ... l l SELECT ...

ili REPLACE [LOW_PRIORITY l DELAYED] [INTO] ime tabele SET ime_kolone:izraz, ime_kolone:izraz, ...

Verovatno ste i sami uočili sličnost s komandom INSERT.

Komanda DELETE SQL-ova komanda DELETE omogućava brisanje redova iz tabele. U listingu 5.1 prika­zano je nekoliko primera komandi delete, kao što je sledeći:

delete from department;

U ovom obliku, komanda delete briše sve redove iz tabele department. Pomoću opcije WHERE možete zadati redove koji se brišu, na primer:

delete from department where name:•Asset Management';

Ova komanda briše samo redove koji ispunjavaju uslove zadate u odredbi where. U ovom primeru, biće izbrisani samo redovi koji u koloni name sadrže vrednost

Asset Management. Nije uobičajeno da se brišu baš svi redove. Međutim, pošto je to najkraći oblik

komande delete, može vam se dogoditi daje greškom zadate bez odredbe WHERE. Možete poštedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa . mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano u.pogl.~vlju 2 Kratak obilazak". Te opcije će vas sprečiti da izbrišete redove (Ih da Izmemte nJihov s~d~žaj) ako pomoću odredbe WHERE ne zadate uslov za ključ, tj. morate zadati da želite da izbrišete samo redove koji sadrže određene vrednosti ključeva.

U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima sledeći opšti oblik:

DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele [WHERE uslov] [ORDER BY ... ] [LIMIT broj_redova]

Komanda DELETE

ili

IlE LETE [LOW _PRIORITY] [QUICK] ime tabele [. *] [, ime tabele [. *] ... ]

FROM reference na tabele [WHERE uslov]

.il i

DELETE [LOW_PRIORITY] [QUICK] FROM ime_tabele[.*] [, ime tabele[.*] ... ] USING reference na tabele [WHERE uslov]

Prvi oblik smo već upotrebili u dosadašnjim primerima. Druga dva oblika omogućavaju brisanje redova iz jedne ili više tabela uz referenci­

l anje drugih tabela. Na primer:

de lete employee, employeeSkills t r om employee, employeeSkills, department where employee.employeeiD : employeeSkills.employeeiD

nd employee.departmentiD : department.departmentiD nd department.name:'Finance•;

Ovaj primer briše sve zaposlene koji rade u službi Finance i sve zapise o njihovim stručnim kvalifikacijama. Obratite pažnju na to da se redovi brišu samo iz tabela employee i employeeSkills Uer su navedene u odredbi delete), ali ne iz tabele depart­ment U er je navedena samo u odredbi from).

Redovi će biti izbrisani iz tabela navedenih u odredbi delete, dok će tabele navedene u odredbi from biti pretražene ali se redovi iz njih neće brisati, osim ako su navedene i u odredbi delete.

Obratite pažnju na to da je ovaj primer prilično složen jer obuhvata čak tri tabele! Za ilustrovanje ovog primera potrebne su nam tri tabele. Takođe vam savetujemo da ovaj primer i opciju WHERE ponovo proučite pošto pročitate odeljak o spajanju tabela ll poglavlju 7, "Složeniji upiti".

U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju tabela. kolona . Pomoću operatora AND spojili smo više uslova . To je primer jedno­stavnog logičkog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija ~nači "kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije ćemo objasniti te koncepte.

Treći oblik komande DELETE sličan je drugom obliku, s tom razlikom što u ovom slu čaju brišemo redove samo iz tabela navedenih u odredbi FROM dok referenciramo tabele u opciji USING. Na primer:

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

Page 42: Prirucnik Za MySQL

72 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka

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

drugačija sintaksa. Opšti oblik komande DELETE prihvata i druge neobavezne odredbe:

• Odredba LOW_PRIORITY deluje na isti naČin kao U komandi INSERT.

• Odredba QUICK može ubrzati komandu DELETE jer nalaže MySQL-u da odloži neke od poslova održavanja indeksa dok briše podatke iz tabele.

• Odredba ORDER BY određuje redosled brisanja redova. Najkorisnija je u kombi­naciji sa opcijom LIMIT - na primer, kada želite da izbrišete iz tabele samo n

najstarijih redova. • Odredba LIMIT određuje maksimalan broj redova koji komanda DELETE srne da

izbriše. Korisna je u kombinaciji sa odredbom ORDER BY ili kada želite da sp re­

čite brisanje prevelikog broja redova.

Komanda TRUNCATE Komanda TRUNCATE briše sve redove iz tabele. Na primer:

TRUNCATE TABLE employee;

Ovaj upit briše sve zaposlene iz tabele employee. Brži je od komande DELETE jer radi tako što najpre fizički uklanja celu tabelu a zatim pravi istu takvu ali praznu. Vodite računa o tome da komanda TRUNCATE nije uključena u transakcionu obradu.

Komanda UPDATE SQL-ova komanda UPDATE omogućava ažuriranje postojećih redova u tabelama baze podataka. Na primer, pretpostavimo da je jedan od zaposlenih prešao na drugo radno

mesto:

update employee set job='DBA' where employeeiD='6651';

Ova komanda menja vednost u koloni j ob za zaposlenog čija je šifra 6651. U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima sledeći oblik:

UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele

ili

SET ime kolonel=izrazl [, ime kolone2=izraz2 ... )

[WHERE uslov] [ORDER BY ... ) [LIMIT broj_redova]

UPDATE [LOW_PRIORITY) [IGNORE) ime_tabele [, ime_tabele ... ) SET ime_kolonel=izrazl [, ime_kolone2=izraz2 ... ) [WHERE uslov]

Komanda UPDATE je po mnogo čemu slična komandi DELETE.

Grupno unošenje podataka pomoću komande LOAD DATA INFILE

Možete dodati neobavezno opciju WHERE da biste ažurirali samo određene redove, 1 d o je izosta vite, ažuriraćete sve redove tabele. U ovom slučaju takođe, može vam se ,1, ,Koditi da zaboravite opciju WHERE- sećam se kad je jedan moj površni kolega zadao 111 liO nalik na sledeće:

1 ul te user l password='test';

Ovaj primer još jednom ističe korist od opcije -- i-am-a-dummy programa mysql, 11.11o čito kada imate posla s neznalicama.

Druga navedena verzija komande UPDATE omogućava ažuriranje više tabela jednom lnluandom. Postupak je sličan brisanju podataka iz više tabela istovremeno, koje smo "hJ.ISnili u prethodnom odeljku. Imajte u vidu da će biti ažurirane samo kolone koje 1 111.-ito navedete u odredbi SET.

Sve ostale odredbe komande UPDATE opisali smo ranije . Odredbe LOW_PRIORITY i IIINORE deluju na isti naČin kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju

11.1 1sti način kao u komandi DELETE.

rupno unošenje podataka pomoću komande LOAD DATA INFILE l omanda LOAD DATA INFILE omogućava grupno prenošenje podataka iz tekstualne d.tloteke u tabelu, bez potrebe da pišete komande INSERT. Primenjujući ovu tehniku, 1110gli smo da napunimo podacima tabelu department na način opisan u nastavku ovog • 11k·ljka. U listingu 5.2 prikazan je sadržaj datoteke s podacima o nazivima službi koje lll'ba uneti u tabelu department.

l bling 5.2 department_infile.txt

l

128

IWLL NULL

Finance Research and Development Human Resources Marketing

Ova datoteka je u standardnom formatu za komandu LOAD DATA INFILE, što znači d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna­' una za tabulator. (To se može podesiti i drugačije, što ćemo opisati u nastavku .)

Podatke možete uneti u tabelu department pomoću sledeće komande LOAD DATA INFILE:

lo d data local infile 'department infile.txt' Into table department; -

Ova mogućnost je naročito korisna kada treba u čitati podatke iz formata neke 1li ugc baze podataka, iz tabele programa za tabelarne proračune ili iz CSV (comma­\l'parated values) datoteke .

Page 43: Prirucnik Za MySQL

lli Pn1JI;1vlj b Umetanje, brisanje i ažuriranje podataka

Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije infom1acije o tome potražite u poglavlju ll, "Upravljanje pravima korisnika", naročito ako imate problema pri izvršavanju ove komande. Pravo izvršavanja ove komande često je ograničeno iz ozbiljnih bezbednosnih razloga- na primer, da biste sprečili korisnike da bilo šta unesu u /etc/passwd.

Opšti oblik komande LOAD DATA INFILE izgleda ovako:

LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE

'imeDatoteke.txt' [REPLACE l IGNORE] INTO TABLE ime_tabele [FIELDS

[TERMINATED BY ' \t' ] [[OPTIONALLY] ENCLOSED BY '']

[ESCAPED BY '\\' ]

[LINES TERMINATED BY '\n'] [IGNORE broj LINES]

[ (ime_kolone, ... ) l

Komanda LOAD DATA INFILE ima sledeće odredbe:

• Odredba LOW PRIORITY deluje na isti način kao u komandi INSERT, tj. čeka da drugi klijentski programi završe učitavanje podataka iz tabele. Odredba CONCUR­

RENT, s druge strane, omogućava drugim klijentskim programima da učitavaju podatke iz tabele dok je vi punite podacima pomoću komande LOAD DATA

INF ILE .

• U navedenom primeru zadali smo neobaveznu rezervisanu reč LOCAL, koja znači da se datoteka s podacima nalazi na klijentskom (lokalnom) računaru. Ako ne zadate ovu odredbu, MySQL će tražiti datoteku na serveru.

• Ako se pri punjenju tabele podacima ključevi dupliraju, odredbe REPLACE i IGNORE pružaju dve mogućnosti rešavanja tog problema. Opcija REPLACE nalaže MySQL-u da postojeći red zameni novim redom, dok opcija IGNORE nalaže MySQL-u da zadrži postojeći red.

• Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U opštem obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih opcija - svaki red s podacima smešten je u zaseban red datoteke, a vrednosti kolona razdvojene su zarezima.Vrednosti kolona možete omeđiti navodnicima, a pomoću obrnute kose crte možete preslikati svaki znak (kao što je polunavod­nik) koji bi MySQL možda pogrešno protumačio .

• Odredba IGNORE broj LINES nalaže MySQL-u da zanemari (preskoči) prvih

broj redova. • Poslcdnjom odredbom zadajete da želite da popunite podacima samo navedene

kolone tabele.

Sažetak

Za prenošenje podataka iz jednog formata u drugi, često se koristi CSV format (e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi čitaju i pesu datoteke u tom formatu, a jedan od najpoznatijih je Microsoftov Excel. U listingu 1. ) prikazana je kratka CSV datoteka dobijena iz Excela.

11\ting 5.3 new_programmers.csv

tMme, Job, DepartmentiD

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

Ove podatke možete preneti u tabelu employee pomoću sledećeg upita:

load data infile 'e:\\new_programmers.csv' Into table employee l ields terminated by • , • lines terminated by '\n' lgnore 2 lines (name, job, departmentiD);

Kao što vidite, za prenošenje ovih podataka naveli smo više opcija nego kada su podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je istaći sledeće:

• Budući da smo putanju datoteke zadali u formatu uobičajenom u Windowsu/ DOS-u, ~. pu tanja sadrži obrnutu kosu crtu, morali smo da je preslikamo pomoću dodatne kose crte. Zbog toga je putanja zada ta u obliku 'e:\ \new_programmers. csv'.

• Verovatno podrazumevate da su polja u CSV datoteci razdvojena zarezima, ali se to ipak mora izričito zadati u komandi .

• Nije neophodno da izričito zadate da se redovi završavaju znakom za nov red, ali mi smo se opredelili da to ipak učinimo.

• Pošto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadrže podatke i treba ih izostaviti pri učitavanju podataka iz datoteke.

• Pošto datoteka ne sadrži šifre zaposlenih (kolona employeeiD), da bismo preneli tri kolone podataka u četiri kolone tabele, moraćemo da navedemo ciljne kolone (i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name,

job, departmentiD).

Sažetak U ovom poglavlju razmatrali smo načine umetanja, brisanja i ažuriranja podataka u tabelama baze podataka.

Page 44: Prirucnik Za MySQL

76 Poglavlje 5 Umetanje, brisanje i ažuriranje podataka

Umetanje podataka • Vrednosti znakovnog tipa treba da budu omeđene navodnicima. Polunavodnike

ili obrnute kose crte unutar vrednosti treba preslikati pomoću obrnute kose crte.

• Komanda INSERT omogućava umetanje podataka u tabelu:

INSERT [LOW PRIORITY l DELAYED] [IGNORE] [INTO] ime_ tabele [ (ime_kolone, ... ) l

VALUES ((izraz l DEFAULT), ... ),( ... ), ... [ ON DUPLICATE KEY UPDATE ime_kolone=izraz, ... ]

ili INSERT [LOW_PRIORITY l DELAYED] [IGNORE] [INTO] ime_tabele [(ime_kolone, .. . )]

SELECT ...

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

• Komanda REPLACE deluje na isti način kao komanda INSERT, s tom razlikom što u slučaju dupliranja ključa zamenjuje postojeće redove. Ako se to dogodi u komandi INSERT, komanda se ne izvrŠava ili aktivira odredbu ON DUPLICATE KEY UPDATE.

Brisanje podataka • Izbegnite katastrofu pomoću opcije --i-am-a-dummy.

• Komanda DELETE briše podatke iz atebele: DELETE [LOW_PRIORITY] [QUICK] FROM ime tabele

[WHERE uslov] [ORDER BY ... ] [LIMIT redova]

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

[,ime tabele[.*] ... ] - FROM reference_na_tabele

[WHERE uslov] ili DELETE [LOW_PRIORITY] [QUICK]

FROM ime_tabele[.*] [, ime_tabele[.*] ... ] USING reference_na_tabele [WHERE uslov]

• Komanda TRUNCATE TABLE briše sve redove tabele.

Ažuriranje podataka • Podatke u tabelama ažurirate pomoću komande UPDATE TABLE:

UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ]

[WHERE uslov] [ORDER BY ... ] [LIMIT redova]

ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ] SET ime_kolonel•izrazl [, ime kolone2· izraz2 ... ]

[WIIERE us 1 ov]

LOAD DATA INFILE • Komanda LOAD DATA INFILE omogućava prenošenje sadržaja tekstualne dato­

teke u tabelu: LOAD DATA [LOW_PRIORITY l CONCURRENT] [LOCAL] INFILE •ime_datoteke.txt•

[REPLACE l IGNORE] INTO TABLE ime tabele [FIELDS

[TERMINATED BY '\t'] [ [OPTIONALLY] ENCLOSED BY ' '] [ESCAPED BY '\\' ]

[LINES TERMINATED BY • \n'] [IGNORE broj LINES] [ (ime_kolone, ... ) l

Pitanja 1. Koja od narednih komandi uspešno umeće nov red u tabelu employee?

a)

b)

e)

d)

insert into employee values

set employeeiD=NULL, name='Laura Thomson',

job='Programmer', departmentiD=128;

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

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

insert employee values (NULL, 'Laura O'Leary', 'Programmer', 128);

2. Komanda REPLACE

a) slična je komandi INSERT, s tom razlikom što se u slučaju dupliranja vred­nosti ključa postojeći red zamenjuje novim redom

b) slična je komandi INSERT, s tom razlikom što se u slučaju dupliranja vred­nosti ključa postojeći red zadržava a novi zanemaruje

e) slična je komandi UPDATE, s tom razlikom što se u slučaju dupliranja vred­nosti ključa postojeći red zamenjuje novim redom

d) slična je komandi UPDATE, s tom razlikom što se u slučaju dupliranja vred­nosti ključa postojeći red zadržava a novi zanemaruje

3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql

a) sprečava unošenje podataka

b) spn:čnva ažuriranje podataka ako ni rc zadat~ vrednost odgovarajućeg ključa

Page 45: Prirucnik Za MySQL

78 Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa

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

d) i b) i e) 4. U standardnom formatu datoteke koju zadate u komandi LOAD DATA INFILE

podaci su razdvojeni

a) zareztma

b) razmacima

e) znakovima za tabulator

d) znakovima vertikalna crta

5. Neobavezna opcija LOCAL U komandi LOAD DATA INFILE

a) zadaje da klijent i server rade na istom računaru

b) zadaje da se datoteka s podacima nalazi na serveru

e) zadaje da se datoteka s podacima nalazi na klijentskom računaru

d) zadaje da serverski program radi na lokalnom računaru .

Vežbe 1. Napišite grupu komandi INSERT pomoću kojih ćete napuniti podacima tabele

u svojoj bazi podataka porudzbine.

2. Izbrišite podatke iz svojih tabela.

3. Napravite datoteku koja sadrži iste podatke koje ste uneli u tački l i prenesite ih u svoju bazu podataka porudzbine pomoću komande LOAD DATA INFILE.

Odgovori

Pitanja l. b

2. a

3. d

4. e

5. e

Vežbe Ne postoji jedno "tačno" rešenje vežbi iz ovog poglavlja. Potrudite se samo da ih sve

uradite do kraja .

U sledećem poglavlju U poglavlju 6, "Korišćenje upita u MySQL-u", počećemo da se bavimo SQL-ovom "dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama.

6 Korišćenje upita u MySQL-u

D o sAD SMO OBJASNILI PROJEKTOVANJE, izradu i punjenje podacima MySQL-ove haze podataka. U ovom i u dva naredna poglavlja razmotrićemo drugu stranu postupka: učitavanje podataka iz baze.

U ovom poglavlju detaljnije ćemo objasniti SQL-ovu komandu SELECT. To je wrovatno najvažnija komanda jezika SQL, koja omogućava učitavanje redova iz wdne ili više tabela baze podataka.

U ovom poglavlju objasnićemo kako se učitavaju redovi iz jedne tabele baze poda­Lika. Razmotrićemo sledeće teme:

• Opšti oblik komande SELECT

• Jednostavni upiti

• Učitavanje podataka samo iz određenih kolona

• Alijasi kolona

• Upotreba odredbe WHERE za učitavanje samo određenih redova

• Upotreba odredbe GROUP BY

• Ograničavanje grupa podataka pomoću odredbe HAVING

• Sortiranje rezultata upita pomoću opcije ORDER BY

• Ograničavanje broja redova rezultata pomoću opcije LIMIT

U poglavlju 7, "Složeniji upiti" , bavićemo se složenijim upitima, a naročito upi­tima koji obuhvataju više tabela, te podupitima i raznim vrstama spojeva između tabela.

U poglavlju 8, "Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT", razmotrićemo brojne funkcije koje postoje u MySQL-u da bi vam pomogle pri upo­trebi upita.

Najpre ćemo pogledati opšti oblik komande SELECT.

Page 46: Prirucnik Za MySQL

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

Opšti oblik komande SELECT Komanda SELECT ima sledeći opšti oblik:

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

Ovo nije potpuna sintaksa- objasnićemo je u narednom poglavlju- ali ilustruje opšti oblik komande. Odredbe koje su ovde navedene opisaćcmo u ovom poglavlju.

Komanda SELECT ima veliki broj neobaveznih odredaba. Ne morate ih uvek navo­diti, ali ako ih upotrebite, morate ih zadati redosledom koji je prikazan u opšte m obliku komande.

Jednostavni upiti Primer najjednostavnijeg oblika komande SELECT izgleda ovako:

select * from department;

Ako ovaj upit izvršite s podacima koji postoje u bazi podataka employee, trebalo bi da dobijete rezultate nalik na sledeće:

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

42 Finance l 128 Research and Development l 129 Human Resources l 130 Marketing l

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

Ovaj upit je u čitao sve podatke iz zadate tabele - tj. sve redove i sve kolone iz tabele department.

Postupak možete isprobati i na nekoj drugoj tabeli- na primer, učitajte sve redove i sve kolone iz tabele employeeSkills.

Razume se, suština relacione baze podataka svakako nije u tome da vam daje sve podatke koje ste u nju uneli, već da vam omogući da nađete određene podatke.

Učitavanje podataka iz određenih kolona U narednom koraku ograničićemo kolone iz kojih učitavamo podatke. Znak * u prethodnom primeru upita (select * from department) znači "sve kolone tabele" . Umesto zvezdice, možete zadati samo kolone iz kojih vam trebaju podaci. To može biti samo jedna kolona, nekoliko kolona tabele, ili čak sve kolone tabele poređane

Apsolutna 1mena oaza pooataka 1 tabel;

rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti r:tzdvojenih zarezima.

Sledeći upit učitava samo vrednosti iz polja employeeiD i name tabele employee:

aelec t name, employeeiD from employee;

Ako ovaj upit izvršite u bazi podataka employee, trebalo bi da dobijete rezultate nalik na slediće:

·---------------+-------------+ l name l employeeiD ·---- -----------+-------------+

Ajay Patel Nora Edwards Candy Burnett Ben Smith

6651 7513 9006 9842

·---- ---------+---------------+ ~ rows in set (0.00 sec)

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

Apsolutna imena baza podataka i tabela Dodatan oblik notacije koji bi trebalo da imate u vidu omogućava zadavanje apsolut­nih imena baze podataka i tabele s kojom želite da radite. Kolonu name tabele employee možemo navesti u upitu kao employee. name.

select employee.name from employee;

Trebalo bi da rezultati ovog upita budu nalik na sledeće:

·---------------+ l name t---------------+

Ajay Patel Nora Edwards Candy Burnett Ben Smith

·--------- --- ---+ 4 rows in set (0.41 sec)

Slično tome, možete izričito zadati koju tabelu u kojoj bazi podataka imate na umu, nn primer:

select name irom employee.employee;

(Trebalo bi da pomoću ovog upita dobijete isti rezultat kao pomoću prethodnog upita.)

Page 47: Prirucnik Za MySQL

t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U

U ovom primeru, izričito navodimo da želimo podatke iz tabele employee koja se nalazi u bazi podataka employee. Notacija u ovom slučaju je baza_podataka . tabela.

Ako je potrebno, možete zadati kojoj bazi podataka i tabeli pripada određena kolona. Isti primer može se napisati pomoću sintakse baza _podataka. tabela . . kolona u sle­dećem obliku:

select employee.employee.name from employee;

Ova sintaksa nije naročito korisna za ovakve jednostavne upite, ali kad budete prešli na složenije upite, ona će vam omogućiti da na nedvosmislen način zadajete podatke koji su vam potrebni.

Alijasi Sada bi trebalo da objasnimo koncept alijasa kolona i tabela.

Kolonama i izrazima u komandi SELECT možete dodeliti drugačija imena, koja će se prikazivati u rezultatima. Na primer, možemo upotrebiti sledeći upit:

select name as employeeName from employee;

U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon­tekstu ovog upita. Rezultati izvršavanja ovog upita u bazi podataka employee izgle­

daju ovako:

+---------------+ l employeeName +---------------+

Ajay Patel Nora Edwards Candy Burnett Ben Smith

+---------------+ 4 rows in set (0.01 sec)

Kao što vidite, sadržaj kolone name sada je prikazan ispod zaglavlja employeeName. Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje određena pra­

vila o tome šta se može a šta se ne može raditi sa alijasima, koja ćemo objasniti kad dođemo na tu temu.

Navedeni primer alijasa nije naročito koristan. Međutim, pravu moć alijasa shva­ti ćete kad počnete da pišete složenije upite i upite u kojima se nešto izračunava.

Alijasi se mogu zadavati i za tabele, kao u sledećem primeru:

select e.name from employee as e;

Trebalo bi da rezultati ovog upita budu isti kao da smo ga napisali bez upotrebe ali­j asa. Ovaj način notacije postaće koristan kada u narednom poglavlju počnete da izvršavate upite koji obuhvataju više tabela.

upuucuct uurcuuc vvncnc Let ucnctVCifiJC ~ctrnu uurcucr1111 rt:uuvd

U poslednja dva primera rezervisana reč AS nije bila neophodna. Upit smo mogli da napišemo i u sledećem obliku:

oe lect name employeeName Lrom employee;

ili

se lect e.name from employee e;

Upite možete pisati u obliku koji smatrate najpogodnijim. To je isključivo pitanje li čnog stila programiranja. Kao što ćete videti u ovom poglavlju i na mnogim drugim mestima u knjizi, isti upit može se napisati na više različitih načina. Kao i u drugim programskim jezicima, lični stil svakog programera na SQL-u razlikuje se od ostalih .

Upotreba odredbe WHERE za učitavanje samo određenih redova Dosad smo razmatrali učitavanje svih podataka sadržanih u tabeli i učitavanje svih podataka samo iz određenih kolona. Sada ćemo preći na učitavanje samo određenih redova. To je korisno jer često treba da iz jedne ili više tabela učita te samo zapise koji ispunjavaju određene uslove. Ta mogućnost postaje još važnija kada je potrebno uči­ta ti samo nekoliko traženih redova iz veoma obinme tabele.

To se može obaviti pomoću odredbe WHERE komande SELECT. Jednostavan primer bio bi sledeći:

se lect employeeiD, name from employee where job='Programmer';

(Uzgred, imajte u vidu da se tekst upita može rasporediti u više redova. Svaki upit se završava znakom tačka i zarez. (;). Upite pišemo na taj način da bi bili čitljiviji.)

Rezultati izvršavanja ovog upita u bazi podataka employee izgledaju ovako:

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

6651 l Ajay Patel l 7513 l Nora Edwards l

+- ------------+--------------+ 2 rows in set (0.42 sec)

U odredbi WHERE zadali smo uslov zbog kojeg se izdvajaju samo redovi tabele koji ga ispunjavaju - u ovom primeru, to su zaposleni koji rade kao programeri .

Obratite pažnju na to da smo u upitu kombinovali uslov s kolonama koje nam tre­baju (employeeiD i name) da bismo učitali samo podatke koji su nas zanimali .

U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite pažnju na to da u SQL-u znak = služi za ispitivanje jednakosti. To je različito od mn -gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq.

Page 48: Prirucnik Za MySQL

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

Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje ćemo detaljno objasniti u poglavlju 8. Zasad ćemo navesti samo operatore koji se najčešće koriste:

• Jednakost, ili=, što smo već koristili.

• Nejednakost (različitost), koja se piše kao ! = ili <>.

• Sve kombinacije > (veće od), < (manje od), >= Uednako ili veće od), i <= Ued­nako ili manje od).

• IS NULL i IS NOT NULL, pomoću kojih se ispituje da li određena vrednost jeste ili nije NULL. To ne možete utvrđivati pomoću izraza nekavrednost=NULL. (Zbog čega to ne može, objasnićemo u poglavlju 8.)

• Uobičajeni aritmetički operatori koje biste očekivali i koji se najčešće koriste u kombinaciji s operatorima za poređenje. Na primer, možete ispitati da li je nekavrednost > nekadrugavrednost*lO.

• Standardni logički operatori AND, OR i NOT, koji se koriste za povezivanje više uslova. Budući da imaju niži prioritet od operatora za poređenje, na primer, izraz plata > 30000 AND plata < 50000 izračunava se kako biste i očekivali.

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

omogućava prebrojavanje redova koje je upit učitao. Na primer:

select count(*) from employee;

Ovaj upit pokazuje koliko redova sadrži tabela employee. I najzad, standardni redosled prioriteta izračunavanja delova izraza možete menjati

tako što ih grupišete između zagrada. Sledeći primer je nešto složeniji upit u kojem je zada ta odredba WHERE:

select * from assignment where employeeiD=6651 and hours > 8;

Ovaj upit učitava iz kolone assignment sve poslove na kojima je zaposleni čija je šifra employeeiD 6651 (Ajay Pate!) radio više od osam časova.

Važno je istaći da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone tabela, već morate navesti izvorno ime kolone. To je ograničenje ANSI standarda za jezik SQL. Razlog je to što vrednost kolone predstavljene alijasom možda neće biti poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE.

Uklanjanje dupliranih vrednosti pomoću opcije DISTINCT Pomoću rezervisane reči DISTINCT navodite da u rezultatima upita ne želite da vidite duplirane vrednosti. Na primer, sledeći upit:

select job from employee;

d.IJ C ove podatke:

--- ------------------+ job --- ------------------+

Programmer Programmer Sys tems Administrator OBA

-- -------------------+ rows in set (0 . 01 sec)

Uklanj anje dupli ran ih vrednosti pomoću opcije DISTINCT

Obratite pažnju na to da se podatak Programmer pojavljuje dvaput jer postoji ll dva reda tabele. Upit je u čitao listu svih vrednosti iz kolone job tabele employee .

A sada, pogledajte sledeći upit:

• lect distinct job It om employee;

Ovaj upit daje sledeće rezultate:

-- -------------------+ job --- -------- - ---------+

Programmer Systems Administrator l OBA 1

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

U ovom primeru duplikati se ne pojavljuju.

U ovom slučaju razlika ne izgleda tako značajna - naravno, drugi skup rezultata je tlt'Što uredniji, ali poboljšanje i nije tako veliko. Bilo bi primetnije kada biste imali opsežnu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili tačne podatke.

S druge strane, pogledajte sledeći upit:

mysql> select count(job) from employee; --- -------+

count (job) 1

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

-- --------+ row in set (0 . 01 sec)

Prema rezultatima ovog upita, kolona j ob sadrži četiri vrednosti . To navodi na po~rešan zaključak jer nije tačno da u toj koloni postoje četiri različite vrednosti. Ako pogledate podatke u tabeli, videćete da kolona j ob sadrži samo tri različite vrednosti .

Lako vam se može dogoditi da greškom zadate prethodni upit kada ste imali na 11111u sledeći upit:

l ct count(distinct job) from employee;

Page 49: Prirucnik Za MySQL

86 Poglavlje 6 Korišćenje upita u MySQL-u

On daje sledeći rezultat:

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

3 l +---------------------+ 1 row in set (0.05 sec)

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

niji podatak.

Upotreba odredbe GROUP BY . , . . V ·

Sledeća odredba koju ćemo razmotriti jeste GROUP BY koJa omogucava gruptsanJe u ct­tanih redova. Ona je zaista korisna samo kada je upotrebite u kombinaciji s funkcijama koje deluju na grupe redova. Jedina takva funkcija koju smo dosad pomenuli jeste

count (), ali u poglavlju 8 razmotrićemo više drugih. Pogledajte sledeći upit:

select count(*), job from employee group by job;

Ovaj upit prebrojava zaposlene po radnom mestu- tj. utvrđuje broj zaposlenih. po svakom radnom mestu. Ako izvršite ovaj upit u bazi podataka employee, trebalo bt da

dobijete rezultat nalik na sledeći:

+----------+-----------------------+ l count(*) l job l +----------+---------------- -------+

l l DBA l 2 l Programmer l 1 l Systems Administrator l

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

Postoje dve razlike između načina na koji odredba GROUP BY radi u MySQL-u

i u standardnom ANSI SQL-u. U ANSI SQL-u, u odredbi GROUP BY morate navesti sve kolone koje ste zadali

u odredbi SELECT. MySQL dozvoljava da u odredbi GROUP BY zadate i dodatna polja

kojih nema u odredbi SELECT. . MySQL omogućava da izaberete redosled grupa kojim se prikazuju rezultati. Podra-

zumeva se rastući redosled. Ako želimo da ponovimo poslednji upit, ali tako da se rezultati prikažu opadajućim redosledom, možemo upotrebiti sledeći upit:

select count(*), job from employee group by job dese;

Sortiranje učitanih rezultata pomoću odredbe ORDER BY

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

-- ---+---------------------- -+ ·ount (*) l job l

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

-- ----+-----------------------+ oows in set (0 . 04 sec)

)(Jo što vidite, nazivi radnih mesta sada su prikazani opadajućim abecednim redo­lo dom. Možete da zadate opciju ASC (od engl. ascending, rastući redosled), ali pošto se

1 q tl•closled podrazumeva, nema potrebe da ga izričito zadajete.

l/dvajanje određenih grupa podataka pomoću opcije HAVING · l c· dcća odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je olodata odredba HAVING deluje na sličan način kao komanda SELECT kojoj je dodata ou lc cdba WHERE. Na primer:

1 ct count(*), job l e om employee 11 oup by job

lt.,ving count (*l =l;

O vaj upit učitava sva radna mesta u firmi na kojima je zaposlen samo po jedan slu­:hl'nik. Trebalo bi da rezultati budu nalik na sledeće:

---- ----+-----------------------+ count(*) l job l ----- -- -+-----------------------+

l l DBA l l l Systems Administrator l

-- ------+---------------------- -+ ' rows in set (0.05 sec)

Prema našem dosadašnjem iskustvu, početnici u jeziku SQL često brkaju odredbe WII ERE i HAVING. Odredbu WHERE možete upotrebiti U gotovo svakom upitu koji snu­\li tc da biste zadali uslove koji se odnose na pojedinačne redove. Odredbu HAVING ~ oristite kada određeni uslov treba da važi za celu grupu.

Sortiranje učitanih rezultata pomoću odredbe ORDER BY S k-d eća odredba komande SELECT jeste odredba ORDER BY koja omogućava sortiranje t l'rttltujućih redova po jednoj ili više kolona. Redosled sortiranja može biti rastući , što st' označava sa ASC, ili opadajući, što se označava sa DESC. Na primer:

' 1 ct * l t om employee otd r by j ob a se , n me d sc ;

Page 50: Prirucnik Za MySQL

BB Poglavlje 6 Korišćenje upita u MySQL-u

Ovaj upit učitava sve redove i kolone iz tabele emplo~e~ .. R:zul.tati. ~e bi~i sortirani po abecednom redosledu sadržaja kolone job, a .ako dvoje 1h v1se ljudl 1~1a 1s.to radno mesto, oni će biti sortirani opadajućim abecedmm redosledom po unemma l prezl­

menima. Rezultati upita izgledaju ovako: + --------------+-----------------------+--------------+

+------------ - 1 · b l departmentiD l 1 employeeiD l name JO --------------+ +------------+---------------+-----------------------i 42 l l 9842 l Ben Smith DBA l 128 l l 7513 l Nora Edwards Programmer l 128 l 1 6651 1 Ajay Patel Programmer

l 9006 1 candy Burnett Systems Administrator l 128 l +------------+---------------+-----------------------+--------------+ 4 rows in set (0.02 sec)

Ako za kolonu zadate odredbu ORDER BY bez opcije ASC ili DESC, p~~razumeva se ASC. Ukoliko ne zadate odredbu ORDER BY, ništa se ne može pretpostav1t1 o redosledu

redova u skupu rezultata.

Ograničavanje broja redova rezultata pomoću odredbe LIMIT . . . Poslednja odredba komande SELECT koju ćemo razmotriti u ovom poglavlju jeste

odredba LIMIT. . . . · le-Odredba LIMIT ograničava broj redova rezultata koje up1t daje . Na pnmer, pog

dajte sledeći upit:

select * from employeeSkills limit 5;

Ovaj upit daje samo prvih pet redova koji ispunj.ava~u zadati uslov. U ovom slu­čaju, to je prvih pet redova učitanih uz tabele, kao sto je pnkazano:

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

+------------+-------+ 6651 l Java l 6651 l VB l 7513 l e l 7513 l Java l 7513 l Perl l

+----------- -+-- --- --+ 5 rows in set (0.44 sec)

Možete zadati i da želite podskup redova drugačiji od prvih n. Ako pomo~u p:e­thodnog upita hoćemo da učitamo redove od 6 do 8, to ćemo uraditi na sledeCl nacm:

select * from employeeSkills limit 5, 3;

Sažetak

Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od kojeg počinje učitavanje) a drugi je maksimalni broj redova koji želimo da se učita. Uporedite to s prethodnim slučajem: kada zadamo samo jedan parametar, on predsta­vlja maksimalni broj redova koji želimo da se učita.

Kada zadajemo pomak, on počinje od O (kao što se vidi u prethodnom primeru­za šesti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT učitava

redove od O do 4, a drugi primer učitava redove od 5 do 7. Ako kao vrednost drugog parametra zadate -1, upit će učitati redove od pomaka

do kraja tabele . Odreba LIMIT se najčešće koristi u kombinaciji sa odredbom ORDER BY da bi rede­

sled redova u rezultatima upita imao određeni smisao. Imajte u vidu da bez odredbe ORDER BY, redosled redova rezultata nije predvidljiv.

Ova odredba je naročito korisna u We b ili GUI aplikacijama koje koriste MySQL jer omogućava jednostavan mehanizam podele rezultata na stranice.

Sažetak • Komanda SELECT ima sledeći opšti oblik:

SELECT kolone

FROM tabele [WHERE uslovi]

[GROUP BY grupa [HAVING uslovi_ za_grupe]]

[ORDER BY kolone_za_sortiranje] [LIMIT broj] ;

• Odredba select * učitava sve kolone; select ime kolone učitava samo nave­denu kolonu.

• Tabele možemo navoditi kao baza_podataka. tabela a kolone kao tabe-

la. kolona ili baza_poda taka. tabela. kolona da bismo izbegli dvosmislenost.

• Alijasi su alternativna imena za tabele i kolone, a zadaju se na sledeći način: select kolona as alijas_kolone

from tabela as alijas_tabele;

• Odredba WHERE služi za učitavanje redova koji ispunjavaju zadate uslove.

• Rezervisana reč DISTINCT uklanja duplirane podatke iz skupa rezultata.

• Odredba GROUP BY obrađuje redove rezultata grupu po grupu. Koristi se prven­stveno u kombinaciji s funkcijama koje deluju na grupe redova, kao što je funk­cija count () .

• Odredba HAVING deluje slično odredbi WHERE, ali na grupe.

• Odredba ORDER BY sortira redove rezultata prema sadržaju kolona koje navedete.

• Odredba LIMIT određuje koji će redovi biti učitani iz mogućeg skupa rezultata. Maksimalni broj redova zadaje se u obliku pomaka od kojeg počinje učitavanje.

Page 51: Prirucnik Za MySQL

90 Poglavlje 6 Korišćenje upita u MySQL-u

Pitanja 1. Koji od narednih upita učitava sve podatke iz tabele client?

a)

b)

e)

d)

select * from client where clientiD=2;

select clientiD, name, address, contactPerson, contactNumber

from client;

select * from client limit l;

select all from client;

2. Koji od sledećih upita učitava sve programere iz tabele employee?

a)

b)

e)

d)

select * from employee where job='Programmer';

select * from employee having job='Programmer';

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

select job from employee;

3. Koji od sledećih upita ne daje ukupan broj zaposlenih evidentiranih u tabeli

employee?

a) select count(employeeiD) from employee;

b) select count(employeeiD) as total from employee;

e) select count(distinct employeeiD) from employee;

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

4. Gde se alijas ne može zadati?

a) za kolone

b) za tabele

e) U odredbi WHERE

d) U odredbi SELECT

Ud g ovon

S. Ako nam iz rezultata upita trebaju redovi od lS do 20, odgovarajuća odredba LIMIT je

a) LIMIT lS, 20

b) LIMIT 14, 19

e) LIMIT 14, s

d) LIMIT lS, s

Vežbe 1. Napišite upit koji daje sve podatke o zaposlenima u službi (tabela department)

čija je šifra 128.

2. Napišite upit koji iz kolone employeeiD učitava sve šifre zaposlenih koji su radili za klijenta čija je šifra l.

3. Napišite upit koji za svaku stručnu kvalifikaciju evidentiranu u tabeli employee­Skills daje ukupan broj zaposlenih koji je imaju.

Odgovori

Pitanja l. b

2. a

3. d

4. e

S. e

Vežbe 1.

2.

3.

select * from employee where departmentiD=128;

select employeeiD from assignment where clientiD=l;

s l cL skill , count(skill) f 1·om mploy Skills CJI Oll Jl IJy ll k { ) J ;

Page 52: Prirucnik Za MySQL

92 Poglavlje 6 Korisćenje upita u My~UL-u

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

Složeniji upiti

u OVOM POGLAVLJU BAVIĆEMO SE složenijim upitima. Razmatraćemo prven­stveno kako se mogu izvršavati upiti koji obuhvataju više tabela istovremeno. Zbog toga ćete morati da savladate koncept spajanja tabela, tj. način na koji se tabele mogu međusobno povezati.

Razmotrićemo sledeće teme:

• Izvršavanje upita koji obuhvataju više tabela primenom sledećih vrsta spojeva:

• Prirodnih, unutrašnjih i unakrsnih spojeva

• Jednakovrednih spojeva

• Levih i desnih spojeva

• Podupiti

• Upotreba opcija komande SELECT

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

Spajanje dve tabele Pogledajte sledeći upit:

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

Page 53: Prirucnik Za MySQL

rogtaVIJC l :>IOZCniJI Upili

Kao što vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom slučaju želimo da učitamo imena zaposlenih i nazive službi u kojima rade. Rezultati ovog upita izgledaju ovako:

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

Ben Smith Finance Ajay Patel Research and Development Nora Edwards Candy Burnett

Research and Development Research and Development

+---------------+--------------------------+ 4 rows in set (0.42 sec)

Kako smo dobili ove rezultate? Prvo, zadali smo kolone koje postoje u različitim tabelama. (Obratite pažnju na to da smo upotrebili notaciju s tačkom, kako je opisano u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da navedemo imena obeju tabela u odredbi FROM.

Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvršite bez odredbe WHERE, u sledećem obliku:

select employee.name, department.name from employee, department;

dobićete sledeće rezultate:

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

Ajay Patel Finance Nora Edwards Candy Burnett Ben Smith Ajay Patel Nora Edwards Candy Burnett Ben Smith Ajay Patel Nora Edwards Candy Burnett Ben Smith Ajay Patel Nora Edwards Candy Burnett Ben Smith

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

+- - -------------+--------------------------+ 1 6 rows in set (0.01 sec)

Prvi upit, kojem je pridružena odredba WHERE, prikazuje zaposlene s tačnim poda­cima o službama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i službi , pri čemu nij e moguće utvrditi koji redovi rezultata sadrže ta čn e pod.11 k l· a koji

upotreoa spoJeva u up1t1ma KOJI oounvataJu v1se taoela

' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih mogućih kombinacija lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela.

Sasvim je očigledno da je odredba WHERE ključna za dobijanje rezultata koji nam li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova pomoću kojih pove­t ujemo tabele zove se spojni uslov. U ovom slučaju, uslov je employee. department ID

department. department ID, što je veza između tabela koju smo definisali preko \poljnih ključeva još u šemi baze podataka.

Kada želite da istovremeno učita te podatke koji se nalaze u više tabela, morate upo­trebiti veze između tih tabela da biste pronašli podatke koje tražite. Ponekad to znači da morate pronaći put od podataka koje znate do podataka koje tražite. U narednom odeljku opširnije ćemo objasniti tu ideju.

U prethodnom primeru rezultata obratite pažnju i na to da u zaglavljima obe kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada. ltezultati će biti razumljiviji ako upotrebite alijase, na primer:

select employee.name as employeeName, department.name as department­Name Jrom employee, department where employee . departmentiD

Ovaj upit daje sledeće rezultate:

department.departmentiD;

1---- -----------+--------------------------+ l employeeName l departmentName 1--- ------------+--------------------------+

Ben Smith Finance Ajay Patel Research and Development Nora Edwards Research and Development Candy Burnett Research and Development

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

Sadržaj ovog skupa rezultata je razumljiviji nego prethodni.

Spajanje više od dve tabele Spajanje više tabela ne razlikuje se od spajanja samo dve tabele.

Recimo da treba utvrditi iz koje su službe zaposleni koji su radili za klijenta čije je ime Tele o Inc. Kako da dođemo do tih podataka?

Pošto znamo ime klijenta, u koloni clientiD tabele client možemo pronaći njegovu ši fru . Pomoću tog podatka potražić~mo u tabeli assignment poslove obavljene za tog klijenta i šifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima možemo zatim pronaći u tabeli employee šifre službi u kojima rade ti zaposleni. I najzad, pomoću tih podataka pronaći ćemo u tabeli department odgovarajuće nazive službi!

Pošto smo osmislili putanju traženja kroz sve Četiri tabele, preostaje nam da tu logiku preslikamo u odgovarajući upit, što daje sledeće:

select department.name irom c l ient, assignment, employee, department wh re client . name= 'Telco Inc '

Page 54: Prirucnik Za MySQL

I'U91č1VIJe l ::IIUZeniJI Ufllll

and client.clientiD = assignment.clientiD and assignment.employeeiD = employee.employeeiD and employee.departmentiD = department.departmentiD;

Nakon izvršavanja upita, dobijamo ove rezultate:

+--------------------------+ l name +--------------------------+ l Research and Development l +--------------------------+ l row in set (0.00 sec)

U upitu koji smo napisali uočićete da smo morali navesti sve tabele u putanji koju smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom slučaju imamo jedan običan uslov- client. name = 'Tel co Inc' - i više spojnih uslova. Obratite pažnju na to da smo spojili četiri tabele pomoću tri spojna uslova.

Primenom ovog pravila možete proveriti da li ste zadali sve potrebne uslove. Kada spajate n tabela, u većini slučajeva, trebaće vam po jedna veza između svakog para tabela, što znači da ćete imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani su na slici 7.1.Jasno se vidi zbog čega je za četiri tabele potrebno tri (n-1) spoja.

assignment.employeeiD=employee.employeeiD

assignment.departmentiD=department.departmentiD

Slika 7.1 Za povezivanje četiri tabele potrebna su tri spoja.

Spajanje tabele same sa sobom - samospoj Kao što jednu tabelu spajamo s drugom, isto tako možemo je spojiti i sa samom sobom. Zašto bismo to uradili? Ponekad ćete tražiti veze između redova u istoj tabeli. Pretpo­stavimo da želimo da saznamo imena svih zaposlenih koji rade u istoj službi kao Nora Edwards. Da bismo došli do tih podataka, prvo moramo u tabeli employee pronaći šifru službe (kolona department ID) u kojoj radi Nora, a zatim ćemo u tabeli employee potra7iti i sve ostale zaposlene koji rade u toj službi.

To možemo obaviti pomoću sledećeg upita:

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

Vrste spoJeva 1zmeau tall' 1:1

Kao što vidite, u ovom upitu deklarisali smo dva različita alijasa za tabelu employee. Time smo opisali MySQL-u da ćemo raditi kao da imamo dve zasebne tabele, el i e2, koje slučajno sadrže iste podatke. Zatim smo te tabele spojili, na isti način kao što bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potražili red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a zatim smo u tabeli e2 potražili redove koji u koloni departmentiD sadrže istu šifru službe kao ona u kojoj radi Nora (el. department ID = e2. department ID).

Možda će vam trebati malo vremena da se naviknete, ali ako možete da zamislite da radite s dve različite tabele, ne bi trebalo da imate većih teškoća.

Ovo su rezultati prethodnog upita:

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

Ajay Patel l Nora Edwards l Candy Burnett

l l l

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

Prikazani su svi zaposleni koji rade u istoj službi kao Nora. Kao što se vidi, na listi se nalazi i Nora. Upitu možemo lako dodati nov uslov koji će je isključiti is skupa rezultata:

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

Vrste spojeva između tabela Postoji više vrsta spojeva koji se mogu uspostaviti između MySQL-ovih tabela.

Osnovni spoj U prethodnom odeljku, pomenuli smo koncept Dekartovog proizvoda. On se ponekad naziva punim spojem (engl. full join) ili unakrsnim spojem (engl. cross join), ali bez obzira na ime, sastoji se od skupa svih mogućih kombinacija redova tabela. Kada tom spoju dodamo određeni uslov (kao što je employee. department ID = department. de­partmentro), dobijamo nešto što se ponekad nazivajednakovredni spoj (engl. equij"oin), koji ograničava broj redova u skupu rezultata.

Page 55: Prirucnik Za MySQL

ruyli:IVIJt: l .:>IULt:nljl Upili

Dosad smo u odredbi FROM zadavali listu tabela razdvojenih operatorom zarez. Time se dobija unakrsni spoj, kao što je već opisano, koji se pretvara u jednakovredni spoj kada mu dodamo odredbu WHERE. MySQL podržava više oblika sintakse za ou vrstu spoja.

Pogledajmo izvorni upit:

select employee.name, department . name from employee, department where employee.departmentiD ; department.departmentiD;

Umesto zareza, može se zadati neobavezna rezervisana reč JOIN:

select employee.name, department.name from employee join department where employee.departmentiD ; department.departmentiD;

Osim reči JOIN, možete zadati i CROSS JOIN ili INNER JOIN. Kada zadate ovu vrstu spoja, MySQL pretražuje sve tabele koje ste zadali i pokušava

da pronađe najefikasniji način spajanja, pri čemu ne spaja tabele obavezno redosledom koji ste naveli. Događa se i to da upit ne bude uvek najbolje optimizovan, što ćemo detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako želite da zanemarite rezultate optimizatora i naložite MySQL-u da spoji tabele baš redosledom koji ste naveli, zamenite reč JOIN rečima STRAIGHT JOIN.

Levi i desni spoj Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezer­visane reČi JOIN, CROSS JOIN, INNER JOIN ili možda STRAIGHT JOIN, i tražili pove­zane redove u dve ili više tabela. Šta ako želimo da pronađemo sve redove u jednoj tabeli za koje ne postoje odgovarajući redovi u drugoj tabeli?

Razmotrimo slučaj u kojem želimo da pronađemo zaposlene koji još nisu radili na poslovima za spoljne klijente kompanije, tj. zaposlene čije šifre (vrednosti u koloni employeeiD) ne postoje u tabeli assignment . To se može uraditi pomoću levog spoja, odnosno operatora LEFT JOIN, na sledeći način:

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

Ovaj upit daje sledeće rezultate:

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

Ako pogledate sadržaj tabela, lako ćete se uveriti da su rezultati tačni, ali kako smo do njih došli ?

Podu piti

Levi spoj radi tako što za sve redove tabele na levoj strani spoja (u ovom primeru to ll' tabela employee) traži odgovarajuće redove u tabeli na desnoj strani spoja. Pronađeni 1 ·dovi se postavljaju pored leve tabele. Za svaki red iz leve tabele koji nema parnjaka u desnoj tabeli, operator LEFT JOIN dodaje red vrednosti NULL. Redove iz leve tabele bez parnjaka u desnoj možete pronaći ako zadate uslov daje vrednost ključa u desnoj tabeli NULL.

Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za nekog spoljnog klijenta, dobićemo red s podacima o zaposlenom i o poslu koji je obavio. Kada za nekog zaposlenog ne postoji odgovarajući red u tabeli assignment, levi spoj generiše "prazan red" u kojem sve kolone sadrže vrednost NULL. Te prazne redove možemo pronaći tako što potražimo sve zaposlene koji su nešto radili za spoljnog klijenta čija šifra (kolona clientiD) sadrži vrednost NULL. (Ne bi trebalo da takav s l učaj postoji u tabeli assignment budući daje clientiD polje ključa.)

U verzijama MySQL-a pre 4.1, ta tehnika se često koristila jer nije bilo podu pita. Podupiti su objašnjeni u nastavku ovog poglavlja.

U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da upotrebimo i operator RIGHT JOIN, koji deluje na isti način, s tom razlikom što je desna tabela osnova, a nedostajući redovi iz tabele na levoj strani dopunjuju se vred­nostima NULL.

Pod upiti Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit čiji se rezultat koristi u drugom upitu. Ponekad se nazivaju i ugnežđenim upitima (engl. nested queries). Pod upiti su novina uvedena u MySQL-u 4.1. Tu mogućnost korisnici su već duže vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti često lakše razu­nlljivi kada se, umesto složenih spojeva između tabela, upotrebe podupiti .

Već ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i ažuri­ranje redova u više tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje, brisanje i ažuriranje podataka" ,jedna su vrsta specijalizovanog pod upita.

U ovom poglavlju opisaćemo upotrebu podupita u komandama SELECT. MySQL-u su dodate dve osnovne vrste podupita:

• Podupiti za izvedene tabele

• Podupiti za izraze.

Podupiti za izraze zadaju se u odredbi WHERE komande SELECT. Oni se dele na dve podvrste:

• Pod upite čiji je rezultat jedna vrednost ili red

• Podupite za izraze logičkog tipa

Pogledaćemo redom po jedan primer svake pomenute vrste pod upita.

Page 56: Prirucnik Za MySQL

l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill

Podupiti za izvedene tabele , . . . Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU zadava~Je u~lta u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu. Pogledajte sledeći jednostavan upit:

select employeeiD, name from employee where job='Programmer';

Jasno je da ovaj upit učitava šifre i imena zaposlenih koji su programeri. Ovaj upit možemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat:

select programmer.name from (select employeeiD, name from employee where job='Programmer')

as programmer, assignment

where programmer.employeeiD = assignment.employeeiD;

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

employee where j ob= • Programmer ') da bismo formirali izvedenu tabel u čiji redovi sadrže samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'pro­

grammer •. Tu tabel u možemo potom pretraživati na isti način kao bilo koju drugu tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili za spoljne klijente i dobili smo sledeće rezultate:

+--------------+ l name +--------------+ l Nora Edwards l +--------------+ 1 row in set (0.01 sec)

Podupiti koji daju jednu vrednost Kao u prethodnom odeljku, počećemo jednostavnim upitom:

select max(hours) from assignment;

Rezultat ovog upita je jedna vrednost, koja predstavlja najveći broj radnih sati utro­šenih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo pominjali: to je funkcija max () , koja pronalazi najveću vrednost u zadatoj koloni_ tabele. Funkcijom max () bavićemo se više u poglavlju 8, "Upotreba MySQL-ov1h ugrađenih funkcija u komandi SELECT". U pod upitima koji vraćaju jednu vrednost (engl. single-value subqueries), često se ova vrsta funkcija koristi za dobijanje međurezul­tata koji se potom koristi za druge proračune.

Kao u prethodnim odeljcima, ovaj upit ćemo upotrebiti unutar drugog upita. Rezultat upita koji vraćaju jednu vrednost jeste određena vrednost koja se potom

obično poredi s nekom drugom vrednošću. Pogledajte sledeći upit:

select e.employeeiD, e.name from employee e, assignment a where e.employeeiD = a.employeeiD and a.hours = (select max(hours) from assignment);

Pod upiti

U ovom primeru tražimo zaposlenog koji bi mogao zaslužiti "titulu" najvrednijeg 1.1dnika u firmi. Pita~ e je sledeće: koji je zaposleni proveo najviše radnih sati dnevno 11~ nekom poslu?

Ovo su rezultati izvršavanja upita:

1--- ----------+---------- ----+ l employeeiD l name

l -- ----------+--------------+ l 7513 l Nora Edwards l 1-- -----------+------------ --+ l row in set (0.42 sec)

Mogu se napisati i upiti koji umesto jedne vrednosti, vraćaju red s više vrednosti, ali .Jl: korist od toga često ograničena. U nastavku teksta obradićemo primer takvog upita.

Podupiti za izraze logičkog tipa Podupiti za izraze logičkog tipa (engl. Boolean expression subqueries) omogućavaju da se u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima l ogičkog tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME.

Rezervisana reč IN omogućava poređe~e s grupom vrednosti. Pogledajte sledeći upit: ne lect name I r om employee where employeeiD not in

(select employeeiD from assignment);

Ovaj upit daje jednake rezultate kao razmatrani upit u primeru za operator LEFT

JOIN (levi spoj), a to su zaposleni koji nisu obavili nijedan posao za nekog spoljnog klijenta. Rezervisana reč IN omogućava da utvrdite da li se data vrednost nalazi u određenom skupu mogućih vrednosti. U ovom slučaju dobijamo jednake rezultate kao one koje smo dobili u primeru upita za operator LEFT JOIN:

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

Zanimljivo je da se pomoću operatora IN podaci upita mogu porediti i s listom navedenih vrednosti, kao u narednom primeru:

nelec t name Irom employee where employeeiD not in (6651, 1234);

Page 57: Prirucnik Za MySQL

102 Poglavlje 7 Složeniji upiti

Rezervisana reč EXISTS deluje na malo drugačiji način od rezervisane reči IN. U upitima u kojima je zada to EXISTS, pod upit zapravo koristi podatke iz spoljnog (glavnog) upita. To se ponekad zove kore/iran (engl. correlated) pod upit.

Pogledajte sledeći upit:

select e.name, e.employeeiD from employee e where not exists

(select * from assignment where employeeiD = e.employeeiD);

U ovom primeru takođe tražimo zaposlene koji nisu nikad radili na poslovima za spoljne klijente.

Pod upit učitava redove u kojima je ispunjen uslov da je vrednost u koloni employee ID tabele assignment jednaka vrednosti u koloni employee. employee ID. Vrednost e. employee ID potiče iz glavnog upita. Evo šta MySQL zapravo radi: za svaki red iz tabele employee ispituje rezultate podupita; ako u tom skupu ne postoji nijedan red, tj. skup je prazan (WHERE NOT EXISTS), podatke o zaposlenom prosleđuje u konačan skup rezultata upita.

Mada će neki korisnici lakše razumeti ovu sintaksu, rezultate jednake onima iz prethodnog odeljka dobijamo i pomoću upita s levim spojem (LEFT JOIN). Ovaj upit daje potpuno jednake rezultate:

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

+---------------+-------------+ l Ajay Patel l 6651 l

l Candy Burnett l 9006 l

l Ben Smith l 9842 l

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

Rezervisane reči ALL, ANY i SOME omogućavaju poređenje sa skupom vrednosti koje vraća podupit.

Pretpostavimo da Nora Edwards, koje se možda sećate kao programera koji najviše radi, želi da dokaže da niko nema više radnih sati od programera . Da bi dokazala tu činjenicu, smislila je sledeći upit:

select e.name from employee e, assignment a where e.employeeiD = a.employeeiD and a.hours > all

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

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

Opcije komande SELECT

veći od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL, gde se utvrđuje da li je broj radnih sati zaposlenog veći od broja radnih sati svakog programera pojedinačno.

Neće vas iznenaditi informacija da ovaj upit ne vraća nijedan red podataka, čime dokazuje da niko u toj firmi ne radi više od programera.

Opcije komande SELECT Kada smo prvi put razmatrali komandu SELECT, opisali smo skraćeni oblik opšte sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli šta još ne znamo.

U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima sledeći opšti oblik: SELECT [STRAIGHT_JOIN)

[SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT) [SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY) [DISTINCT l DISTINCTROW l ALL) - - -

izraz_za_učitavanje, ...

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

[WHERE uslov]

[GROUP BY {celobrojna vrednost ime kolone l formula} [ASC l DESC) , . .. J -(HAVING uslov]

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

Većinu odredaba već poznajete. Pogledajmo ukratko one koje dosad nismo pominjali:

• Odredba STRAIGHT JOIN na samom početku komande nalaže optimizatoru upita da spoji tabele baš redosledom koji ste zadali. Učinak ove opcije jednak je kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao što je napomenuto u prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proširenja ANSI standarda za jezik SQL.

• Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT omoguća­vaju optirnizovanje upita. Pomoću opcija SQL_SMALL RESULT i SQL BIG RESULT obeveštavate MySQL da očekujete da će se skup rezul~ata upita sastoJati od malog, odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalaže MySQL-u da skup rezultata smesti u privremenu tabel u. Tu opciju možete iskoristiti kada znate da će slanje skupa rezultata klijentskom programu potrajati prilično dugo, a želite da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se učitaju. Ove opcije su MySQL-ova proširenja ANSI standarda za jezik SQL.

Page 58: Prirucnik Za MySQL

104 Poglavlje 7 Složeniji upiti

• SQL CACHE i SQL NOCACHE nalažu MySQL-u da rezultate smešta, odnosno ne smeŠta u ostavu (i~eš). O oš jedno proširenje ANSI standarda za jezik SQL.)

• SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL izraČuna koliko bi ~kup no -redova upit vratio kada ne bi sadržao odredbu LIMIT. Taj broj redova se zatim može učitati pomoću opcije select found_rows () ; U oš jedno proširenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala, isti rezultat je mogao da se postigne tako što se najpre izvrši upit s funkcijom COUNT (*),a zatim i drugi upit SELECT koji sadrži opciju LIMIT.

• HIGH PRIORITY obaveštava MySQL da taj upit treba da ima prednost nad svim komandama UPDATE koje čekaju pristup tabelama navedenim u upitu .

• Već smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima suprotan efekat (učitava sve duplikate) a to je i podrazumevana opcija.

• SELECT INTO OUTFILE deluje suprotno od komande LOAD DATA INFILE koju smo razmatrali u poglavlju 5, "Umetanje, brisanje i ažuriranje podataka". Ova komanda smešta rezultate komande SELECT u zadatu datoteku. Odredba opcije_pri_izvozu ima isto značenje kao u komandi LOAD DATA INFILE (više detalja o tome naći ćete u poglavlju 5).

• Odredba PROCEDURE omogućava da zadate proceduru koja se poziva pre nego što se skup rezultata pošalje klijentskom programu. Ta procedura mora biti napisana na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba više informacija, potražite ih u MySQL-ovoj dokumentaciji .

• Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaŠa mašina baze podataka zaključava podatke na nivou stranice ili reda. U praksi, opcija je upo­trebljiva ako koristite mašine InnoDB i BDB.Ako zadate FOR UPDATE, zaključa­

vanje podataka će biti isključivo, a ako zada te LOCK IN SHARE MODE, zaključavanje

će biti deljeno.Vrste zaključavanja razmotrićemo u poglavlju lO",Upotreba trans­akcija u InnoDB tabelama".

Sažetak

Spojevi • Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u

odredbi FROM, zajedno s vrstom spoja. Treba takođe zadati i uslov koji opisuje na koji način bi tabele trebalo da budu spojene.

• Operator zarez i rezervisane reči JOIN, INNER JOIN i CROSS JOIN deluju na isti na čin, tj. kombinuju zadate tabele tako da omoguće traženje podataka u svim tim tabelama.

• Lev i desni spojevi omogućavaju pronalaženje redova u jednoj tabeli koji nemaju odgovarajuće redove u drugoj tabeli .

rrranJa

Pod upiti • Pod upit je upit ugnežđen unutar drugog upita.

• Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se koristiti i za ispitivanje logičkih uslova pomoću operatora SOME, ALL ili ANY

• Pomoću operatora EXISTS može se utvrditi da li u rezultatima podupita postoji red koji je povezan s nekim redom glavnog upita.

Opcije komande SELECT • Komandi SELECT mogu se pridružiti razne opcije koje optirnizuju izvršavanje te

komande.

• Pomoću komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u spoljnu datoteku, slično načinu na koji smo u poglavlju 5 učitavali podatke iz datoteke u tabelu pomoću komande LOAD DATA INFILE.

• Komandi se mogu dodati procedure (napisane na jeziku C++) koje obrađuju podatke pre prenošenja u MySQL ili iz MySQL-a.

Pitanja 1. De kart ov proizvod je

a) skup svih mogućih kombinacija redova iz dve ili više tabela

b) skup kombinacija redova iz dve ili više tabela koji su logički povezani

e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele

d) nije ništa od prethodnog

2. Levi spoj je

a) skup svih mogućih kombinacija redova iz dve ili više tabela

b) skup kombinacija redova iz dve ili više tabela koji su logički povezani

e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele

d) nije ništa od prethodnog

3. Jednakovredni spoj je

a) skup svih mogućih kombinacija redova iz dve ili više tabela

b) skup kombinacija redova iz dve ili više tabela koji su logički povezani

e) skup redova iz jedne tabele kojima su dodati odgovarajući redovi iz druge tabele, a gde to nije moguće, rezultujući red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele

d) nije ništa od prethodnog

Page 59: Prirucnik Za MySQL

106 Poglavlje 7 Složeniji upiti

4. Korelirani podupit se tako zove zato što uspostavlja korelaciju između

a) redova različitih tabela

b) redova iste tabele

e) dva spoja

d) redova glavnog upita i redova podupita

5. Razlika između upita označenih sa 5.1 i 5.2 u nastavku teksta je sledeća

a) nema razlike

b) učitavaju različite podatke

e) učitavaju iste podatke ali je verovatno da će se levi spoj (upit 5.1) brže uči tavati

d) učitavaju iste podatke ali je verovatno da će se podupit (upit 5.2) brže uči tavati

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

Upit 5.2: select e.name, e.employeeiD from employee e where not exists

Vežbe

(select * from assignment where employeeiD e. employeeiD) ;

1. Napišite upit koji prikazuje imena zaposlenih i njihove stručne kvalifikacije.

2. Napišite upit koji pomoću operatora LEFT JOIN formira listu klijenata za koje nijedan od zaposlenih nije obavio nijedan posao.

3. Upit iz vežbe broj 2 napišite tako da koristi operator EXISTS.

Odgovori

Pitanja 1. a

2. e

3. b

4. d

5. e

Vežbe 1.

select name, skill from employee, employeeSkills

u s1eaecem poglaVlJU

where employee.employeeiD = e mpl oyee Skills.employeeiD; 2.

3.

select client.clientiD, name from client left join assignment on client . clientiD = assignment. clientiD where employeeiD is NULL;

select clientiD, name from client where not exists

(select * from assignment where assignment . clientiD client.clientiD);

U sledećem poglavlju U poglavlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT", razmatraćemo funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT.

Page 60: Prirucnik Za MySQL

8 Upotreba MySQL- ovih ugrađenih

funkcija u komandi SELECT

MYSQL SADRŽI ŠIROK OPSEG UGRAĐENIH OPERATORA I FUNKCIJA koji mogu biti korisni pri pisanju upita. Većina je namenjena upotrebi i odredbama SELECT i WHERE.

Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi GROUP BY. Već smo koristili osnovne operatore za poređenje i funkcije count () i max (). U MySQL-u je na raspolaganju veliki broj ugrađenih funkcija. U ovom pogla­vlju razmotrićemo najkorisnije među njima. Ovu knjigu nismo zamislili kao referentni priručnik za MySQL-ove funkcije, već samo pokušavamo da predočimo sliku funkcio­nalnosti koja je na raspolaganju.

Razmotrićemo sledeće teme:

• Operatori

• Funkcije za upravljanje tokom izvršavanja

• Funkcije za rad sa znakovnim vrednostima

• Numeričke funkcije

• Funkcije za rad s datumima i vremenima

• Funkcije za konverziju tipova podataka

• Druge funkcije

• Funkcije za upotrebu u odredbama GROUP BY.

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

Page 61: Prirucnik Za MySQL

Poglavlje 8 Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT

u ovom poglavlju koristićemo komandu SELECT bez navođenja tabela u njoj. Komanda SELECT može se upotrebiti kao jednostavan kalkulator. N a primer, ako

za date

select 2+2;

dobićete rezultat

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

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

Možete izvršavati izraze koji ne sadrže imena tabela i u kojima možete zadavati širok opseg matematičkih i drugih operatora i funkcija. Izračun~ :ranje 2+2 je ~aista trivijalno, ali to svakako ne važi za izvršavanje matematičkih operaciJa u komandi SELECT. Na primer, to vam omogućava da uradite finansijsku analizu vrednosti u tabelama i da

zatim prikažete rezultate u obliku izveštaja. U svim MySQL izrazima možete zadavati zagrade da biste upravljali redosledom

kojim se izračunavaju pojedini delovi izraza, na isti način kao u bilo kom drugom pro­

gramskom jeziku. Pogledajmo najpre operatore.

Operatori . . u MSQL-u postoje tri glavne grupe operatora: aritmetički, za poređenJe vrednosti i logički . Operatore smo ukratko već opisali u poglavlju 6, "Korišćenje upita u

MySQL-u". Sada ćemo ih detaljnije razmotriti.

Aritmetički operatori v • • • •

MySQL podržava uobičajene aritmetičke operatore koje biste ocekivali: sabiranJe(+), oduzimanje (-), množenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL.

Operatori za poređenje vrednosti . . N ajvažnije što bi trebalo da zapamtite ~vezi vs~ ope;atorima za poređenJe vr:~nosu j este sledeće : izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL,

uvek daje NULL. To važi i za poređenje NULL s NULL:

se lect NULL=NULL;

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

NULL l ·-----------+ 1 row i n set (0 . 00 sec )

Uporedite to sa sledećim upitom:

select NULL IS NULL;

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

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

Ovaj primer ističe ono što smo napomenuli u poglavlju 6, a to je da morate opre­zno korisiti operatore za poređenje ukoliko se među podacima može pojaviti i NULL.

Druga činjenica koju bi trebalo da zapamtite jeste da se u većini slučajeva , pri pare­đenju vrednosti znakovnog tipa u MySQL-u ne pravi razlika između malih i velikih slova. Ako želite da se znakovne vrednosti porede tako da se ipak pravi razlika između malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer,

select * from department where name='marketing';

Ovaj upit će pronaći reč 'marketing' bez obzira na to kako je napisana, a rezultati izgledaju ovako:

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

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

Ako je potrebno razlikovanje malih od velikih slova, dodajte rezervisanu reč binary, na sledeći način:

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

Ovako napisan upit ne učitava nijedan red iz baze podataka employee:

Empty set (0.18 sec)

Posle ovog uvoda, možemo preći na operatore za poređenje. Najčešće se koriste operatori navedeni u tabeli 8.1.

Tabela 8.1 Operatori za poređenje

Operator Značenje

!= ili <>

<

<=

>

>=

Jednako

Različito od

Manje od

Jednako ili manje od

Veće od

Jednako ili veće od

Page 62: Prirucnik Za MySQL

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

Tabela 8.1 Operatori za poređenje (nastavak)

Operator Značenje

n BETWEEN min AND max Poređenje da li se n nalazi u opsegu vrednosti od min do max.

n IN (skup vrednosti) Pripadnost skupu vrednosti koji se može zadati u obliku liste vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah, breskva)

<=>

n IS NULL ISNULL(n)

Logički operatori

Operator za jednakost koji se može upotrebiti i za NULL. Kada se pored e dve vrednosti NULL, rezultat je l (true).

Ispituje da li n ima vrednost NULL

Ispituje da li n ima vrednost NULL.

MySQL podržava sve uobičajene logičke operatore koji povezt~u delove izraza. Logički izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga, MySQL tumači kao true (istinito, tačno) svaku vrednost različitu od nule i različitu od NULL.

Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo drugačiji od onog što biste očekivali. Tabela 8.2 prikazuje logičke operatore.

Tabela 8.2 Logički operatori

Operator

AND ili &&

OR ili ll

NOT ili

XOR

Primer

n && m

n ll m

NOT n

n XOR m

Značenje

Logičko I. Tabela istine izgleda ovako:

true&&true = true

false&&bilo šta = false

Svi ostali izrazi svode se na NULL.

Logičko ILI. Tabela istine izgleda ovako:

true l lbilo šta= true

NULLI l false= NULL

NULL l l NULL = NULL

false! l false = false

Logičko NE. Tabela istine izgleda ovako:

!true = false

!false = true

!NULL = NULL

Logičko isključivo ILI. Tabela istine izgleda ovako:

true XOR true = false

true XOR false = true

false XOR true = true

NULL XOR n = NULL

n XOR NULL = NULL

runkCIJe za upravlJanje tokom izvršavanja komandi

Funkcije za upravljanje tokom izvršavanja komandi Najpre ćemo razmotriti grupu funkcija za upravljanje tokom izvršava~a komandi. Među njima su najkorisnije IF i CASE, koje deluju slično iskazu if, odnosno switch ili case iz većine programskih jezika.

Prototip funkcije IF izgleda ovako

IF (el, e2, e3)

Ako izraz el ima vrednost true, funkcija IF vraća rezultat e2; u suprotnom, rezultat funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee, možemo zadati sledeći upit:

select name, if(job='Programmer', "nerd", "not a nerd") from employee;

Ovaj upit daje sledeće rezultate:

+---------------+--------------------------------------------+ l name l if(job='Programmer', "nerd", "not a nerd") l +---------------+--------------------------------------------+ l Ajay Patel nerd l Nora Edwards nerd l Candy Burnett not a nerd l Ben Smith not a nerd +---------------+--------------------------------------------+ 4 rows in set (0.00 sec)

Funkcija CASE ima sledeće moguće prototipe (prema MySQL-ovoj dokumentaciji):

CASE vrednost

WHEN [vrednost-za-poređenje] THEN rezultat [WHEN [vrednost-za-poređenje] THEN rezultat .. . ] [ELSE rezultat]

END

ili

CASE WHEN [uslov] THEN rezultat [WHEN [uslov] THEN rezultat ... ] [ELSE rezultat]

END

Ovu funkciju možete upotrebiti da biste izdvojili jednu vrednost iz skupa od ~ih nekoliko. Primera radi, pogledajte sledeći upit:

select workdate, case when workdate e 2000-01-01 then "archived" when workdate e 2003-01-01 then "old" else "current" end

from assignment;

Page 63: Prirucnik Za MySQL

1'14 PoglavlJe 8 Upotreba My:>UL-ovlh ugrađenih tuni<CIJa u 1<omand1 :>tLtCI

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

Funkcije za rad sa znakovnim vrednostima MySQL-ove funkcije za rad sa znakovnim vrednostima dele se u dve kategorije: funk­cije za obradu znakovnih vrednosti i funkcije za poređenje znakovnih vrednosti. Verovatno ćete ustanoviti da su funkcije iz druge grupe korisnije od onih iz prve.

Funkcije za obradu znakovnih vrednosti Tabela 8.3 prikazuje najkorisnije funkcije za obradu znakovnih vrednosti. U doku­mentaciji su opisane i mnoge druge.

Tabela 8.3 Funkcije za obradu znakovnih vrednosti

Funkcija Namena

concat(s1, s2, ... )

conv(n, izvorna_baza, nova_baza)

length (s)

load file (ime_ datoteke)

Spaja znakovne vrednosti sl, s2, ....

Pretvara broj n iz baze izvorna_baza u broj baze nova_ baza. (Možda vas je iznenadilo to što je ova funkcija navedena među funkcijama za rad sa znakovnim vrednostima, ali se za notaciju nekih baza koriste slova, kao u heksadecimal­noj bazi.) Vraća ukupan broj znakova sadržanih u s.

Vraća sadržaj datoteke ime_ datoteke kao jedan niz znakova.

locate (igla,plast_sena, Vraća početnu poziciju niza znakova igla u nizu pozicija) plast_sena. Traženje počinje od pozicije pozicija.

lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova. quote (s)

replace(izvor, nađi,

za mena)

soundex(s)

substring(s, početak, ukupno)

trim (s)

Preslikava niz znakova s u oblik pogodan za smeštanje u bazu podataka. To podrazumeva uokvirivanje znakovnog niza polunavodnicima i umetanje obrnute kose crte. Vraća niz znakova izvor u kojem je podniz nađi zamenjen nizom zamena na svim mestima gde se pojavljuje. Vraća soundex oblik izvornog niza znakova s. Soundex oblik znakovne vrednosti predstavlja način na koji znakovna vrednost treba da se izgovara na engleskom jeziku. Na primer, ponekad je lakše pronaći ime osobe ako se traži sound ex oblik a ne kako je ime napisano. Vraća ukupno znakova iz niza s, počev od početak.

Uklanja početne i završne beline iz niza znakova s. (Pomoću

funkcije l trim () možete ukloniti samo početne beline, a funkcija rt rim () uklanja završne beline.)

runKCIJe za raa sa znaKovnim vreanost1ma

Funkcije za poređenje znakovnih vrednosti Osim operatora jednakosti, u MySQL-u postoji i više drugih funkcija za poređenje dve znakovne vrednosti:

• LIKE: Poređenje s džokerskim znacima.

• RLIKE: Poređenje s regularnim izrazima.

• STRCMP: Poređenje znakovnih vrednosti, slično funkciji strcmp () u jeziku C.

• MATCH: Tekstualno pretraživanje.

U ovom odeljku objasnićemo funkcije LIKE, RLIKE i STRCMP. Tekstualno pretraži­vanje je na raspolaganju samo u My ISAM tabelama. Više informacija o tome naći ćete u poglavlju 9, "Tipovi tabela u MySQL-u".

Poređenje s džokerskim znacima pomoću funkcije LIKE Pogledajmo primer upotrebe operatora LIKE:

select * from department where name like '%research%';

U ovom primeru ne tražimo nazive jednake reči 'research', već nazive koji bilo gde sadrže reč 'research'. Rezultati su sledeći:

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

128 l Research and Development l +---------------+------ --------------------+ l row in set (0.04 sec)

Funkcija LIKE podržava dva načina poređenja s džokerskim znacima. Znak za pro­cenat (%), upotrebljen kao u navedenom primeru, utvrđuje poklapanje s grupom zna­kova bilo koje dužine (uključujući i nula). To znači da se izraz '%research%' poklapa sa svakom znakovnom vrednošću koja sadrži reč research. Imajte u vidu da se pri poređenju znakovnih vrednosti obično ne pravi razlika između malih i velikih slova, kao što je objašnjeno u prethodnom delu ovog poglavlja.

Stariji džokerski znak je podvlaka U, kojim se utvrđuje poklapanje s jednim zna­kom. Na primer, '_at' se poklapa sa znakovnim vrednostima • cat •, • mat •, • bat • itd.

Poređenje s regularnim izrazima pomoću funkcije RUKE Funkcija RL IKE omogućava poređenje znakovnih vrednosti s regularnim izrazima.

Regularan izraz je šablon koji opisuje opšti oblik znakovne vrednosti. Uslovi koje bi trebalo da ispunjavaju znakovni nizovi koje tražimo, opisuju se posebnom notaci­jom. Razmotrićemo ukratko tu notaciju.

Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To znači da se šablon 'cat' poklapa s rečju 'cat'. Međutim, poklapanje važi i za • catacomb • i • the cat sat on the mat'. Šablon 'cat' pronalazi niz znakova • cat • na svim mestinu unutar većeg niza znakova.

Page 64: Prirucnik Za MySQL

116 Poglavlje 8 Upotreba MySQL-ovih ugrađenih tunkciJa u komano1 ::,tLtLI

Ako želite da šablon pronalazi samo reč 'cat', onda ga morate izmeniti u '"'cat$'. Znak karet ("') znači "fiksni početak niza znakova"; drugim rečima, niz znakova koji tražimo mora da počinje rečju 'cat'. Znak za dolar($) znači "fiksni kraj niza zna­kova"; drugim rečima, niz znakova koji tražimo mora da se završava rečju 'cat'. Prema tome, šablon '"'cat$' prihvata samo reč 'cat' i ništa drugo.

U regularnim izrazima podržani su i džokerski znaci, isto kao u funkciji LIKE. Međutim, džokerski znak je drugačiji. Postoji samo jedan - tačka (.) - koji određuje poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' utvrđuje poklapanje s 'cat', 'bat', 'mat' itd.

Dovoljan je samo jedan džokerski znak jer se u traženom nizu znakova može zadati i ponavljanje znakova (uključujući i džokerske znakove) određen broj puta.

Kada iza nekog znaka postavite specijalni znak *, to znači da se prethodni znak može pojaviti nula ili više puta. Na primer, šablon 'n*' prihvata ' ', 'n', 'nn', 'nnn' itd. Znaci se mogu grupisati između zagrada, tako da šablon ' (cat)*' prihvata ' ', 'cat', 'cat cat', 'catcatcat' itd. Moguća je i upoteba džokerskih znakova, pa šablon ' . * ' prihvata neograničen broj znakova, što praktično znači svaki niz znakova.

Slično tome, znak plus(+) znači da se znak ili niz znakova ispred njega može poja­viti jedanput ili više puta, a upitnik (?) znači jednom ili nijednom. Možete zadati i opseg vrednosti, tako da šablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i 'catcatcatcat'.

Osim pojedinačnih znakova i nizova znakova, možete zadavati i skupove znakova, koji se pišu između uglastih zagrada. Na primer, šablon ' [a-z] ' prihvata bilo koje pojedinačno slovo, dok šablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g broja znakova.

I najzad, postoji više klasa znakova, koje su zapravo unapred definisani skupovi uslova. Na primer, [ [:al num: JJ prihvata svaki alfanumerički znak.

Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL podržava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih regularnih izraza.

A sada, pogledajmo primer upotrebe šablona s funkcijom RLIKE. Razmotrite sle­deći upit:

select * from department where name rlike 'an';

Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadrže niz zna­kova 'an':

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

42 Finance 128 l Research and Development l 129 l Human Resources l

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

Numeričke funkcije

. Regularni izrazi mogu biti veoma moćni, ali i veoma složeni. Ako vam treba više pnmera i opširniji opis sintakse, na Webu ćete naći mnogo dobrih tekstova na tu temu.

Poređenje nizova znakova pomoću funkcije STRCMP() ~a .funkciju s:RCMP (). ~ MySQL-u važe iste konvencije kao i u drugim programskim JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako: STRCMP(sl, s2)

a funkcija vraća sledeće vrednosti:

• o ako su nizovi znakova jednaki

• -l ako je sl maqji od s2 - ~· ako po redosledu sortiranja sl dolazi ispred s2

• l ako je sl veći od s2 - tj. ako po redosledu sortiranja sl dolazi iza s2

Rezultati narednih upita izgledaju ovako:

mysql> select strcmp ('cat •, • cat •) ; +- ---------------------+ l strcmp ('cat', 'cat') 1 +- ---------------------+ l o l +- ---------------------+ l row in set (0.42 sec)

mysql> select strcmp('cat', 'dog'); · - -------------- -------+ l strcmp( 'cat', 'dog') 1 +- ---------------------+ l -1 l 1- ---------------------+ l row in set (0.00 sec)

mysql> select strcmp('cat', 'ant'); · -- --------------------+ l strcmp( 'cat', 'ant') 1

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

row in set (0.00 sec)

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

Numeričke funkcije l'.1bela 8.4 prikazuje nekoliko korisnih numeričkih funkciia. U MySQL- · d k _

. .. " , ~ OVOJ O ll 111\'lltnc~p nar1 rete opise mnogih drugih funkcijn iz ll' kategorije.

Page 65: Prirucnik Za MySQL

118 Poglavlje 8 Upotreba MySQL-ovih ugrađemh tunKCIJa u KomanOI ;:,tLtLI

Tabela 8.4 Numeričke funkcije

Funkcija

abs (n)

ceiling (n)

floor (n)

mod (n, m) i div

power (n, m)

rand(n)

round (n[, d])

sqrt (n)

Svrha Vraća apsolutnu vrednost n, a to je vrednost bez predznaka.

Vraća vrednost n zaokruženu naviše na najbliži ceo broJ.

Vraća vrednost n zaokruženu naniže na najbliži ceo broj.

Ove dve funkcije dele n sa m. Funkcija di v vraća celo brojni rezultat, a funkcija mod () vraća celo brojni ostatak deljenJa.

Vraća n podignuto na stepen m. .. Vraća slučajno generisan broj u opsegu o~ O do l. Parametar n mJe . obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za g~nensanJe pseudoslučajnih brojeva. ~Za istu vrednost n prosleđenu funkciJI rand

generiše se ista pseudoslucaJna vrednost.) Vraća n zaokruženo na najbližu celobrojnu vrednost. Ako zadate i parametar d, n vrednost se zaokružuje na d dectmalruh mesta.

Vraća kvadratni koren od n.

. . · · u e zi sa ovim funkcijama Pogledajmo primer upotrebe funkClj3 mod() l d~ v.. v

zbunjujuće je sledeće: dok se mod može napisati u obhku

mod(9, 2)

ili

9 mod 2

ili čak

9 % 2

funkcija di v može se napisati samo kao

9 div 2

Primera radi

div(9, 2)

neće raditi već će izazvati sintaksnu grešku.

U b fi k ·· d i div u MySQL-u daje sledeće rezultate: potre a un CIJa mo

mysql> select 9 mod 2;

+---------+ l 9 mod 2 l +---------+

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

mysql> select 9 div 2; +---------+ l 9 div 2 l +-- - -- ----+

4 l ·----

L-------~--~ --l _o_w __ l_n~n--__ (o .oo ae:c~) --------------~------------------------------~---

Funkcije za rad s datumima i vremenima

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

Zahvaljujući MySQL-ovoj orijentisanosti na analizu podataka, skup funkcija za rad

s datumima i vremenima veoma je bogat. Naredni spisak daleko je od potpunog.

Tabela 8.5 Funkcije za rad s datumima i vremenima

Funkcija Namena

adddate(datum , INTERVAL n tip) i subdate (datum, INTERVAL n tip)

curdate(), curtime(), now()

date_format(datum, format) i time_format(vreme, format)

dayname (datum)

extract(tip FROM datum)

unix_timestamp( [datum])

Ove funkcije služe za sabiranje i oduzimanje datuma. Vrednosti zadatoj parametrom datum dodaju, odnosno od nje oduzim~u period zadat pomoću rezervisane reči INTERVAL. Morate zadati i količinu n i tip te količine.

Parametar tip može imati vrednost SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude izraženo u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR ('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'), DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s').

Ove funkcije su zaista korisne, ali pošto je gotovo nemoguće zapamtiti sve formate za datume i vremena Qer se razlikuju), moraćete da ih potražite u MySQL-ovoj dokumentaciji.

Ove funkcije vraćaju tekući datum, tekuće vreme, odnosno tekući datum i vreme.

Pomoću ovih funkcija možete izraziti datume i vremena u gotovo svakom fom1atu koji zamislite. To se radi tako što se zada format u obliku niza znakova, kao u sledećem primeru: date_format(workdate, '%W %D of %M, %Y'). Navedeni format prikazuje datum u obliku, na primer, 'Monday 16th of June, 2003 '. Pošto je spisak mogućih formata prilično dugačak, detaljnije informacije potražite u dokumentaciji.

Ova funkcija daje englesko ime dana u nedelji zadatog u parametru da t um (na primer, ' Monday ').

Ova funkcija izdvaja iz datuma datum komponentu čiji tip zadajete parametrom tip. Na primer, ako zadate YEAR, funkcija izdvaja godinu iz datuma. Tipovi komponente su isti kao u parametrima funkcija adddate () i subdate ().

Ova funkcija daje tekući datum i vreme u Unixovom formatu timestamp. (Vrednost je broj sekundi koji je protekao od 1. januara 1970. godine.) Ako zadate i datum, rezultat je timestamp vrednost koja odgovara tom da t umu.

Pogledajmo primer upotrebe funkcije adddate (). Datumu 1. januar 1990. doda­

jemo godinu i šest meseci:

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

Page 66: Prirucnik Za MySQL

120 Poglavlje 8 Upotreba MySQL-ovih ugrađenih funkcija u komandi ~tltCI

Rezultat je sledeći:

+--------------------------------------------------+ l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l +------------------- ----------------------- --------+ l 2000-07-01 l +------------------------------------------------- -+ 1 row in set (0.41 sec)

U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom

programu, to možda neće biti najpogodniji oblik prosleđivanja datuma. Unixov for­

mat timestamp nije razumljiv čoveku, ali su vrednosti zadate u tom formatu potpuno

kompatibilne sa API funkcijama drugih programskih jezika.

Isti upit, ali s funkcijom unix_timestamp ()

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

YEAR_ MONTH) ) ;

generiše rezultat neupotrebljiv za čoveka ali direktno upotrebljiv u drugom program­

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

+------------------------------------------------------------------+ l unix_timestamp(adddate("l999-01-0l", INTERVAL "1-6" YEAR_MONTH)) l +------------------------------------------------------------------+

962373600 l +------------------- -- ---------------------------------------------+ 1 row in set (0.01 sec)

Funkcije za konverziju tipova podataka Postoje samo dve funkcije za konverziju tipova podataka, cast () i convert (), koje

daju isti rezultat, ali se sintaksa malo razlikuje. Ove funkcije omogućavaju konverziju

tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer)

u drugi (na primer, char). Prototipovi ovih funkcija su sledeći:

cast(izraz AS tip) convert(izraz, tip)

Funkcija cast () podržana je u ANSI standardu, a funkcija convert () podržana je

u ODBC standardu. Parametar tip može imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED

(INTEGER) i UNSIGNED (INTEGER).

Većina konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba;

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

Fukcije za upotrebu u odredbi GROUP BY

Druge funkcije U MySQL-u postoje i funkcije koje se mogu svrstati u grupu "ostalo". Na primer, postoje funkcije za generisanje heš vrednosti i šifrovanje, ali i mnoge druge veoma

korisne funkcije. U tabeli 8.6 navedene su najčešće korišćene funkcije.

Tabela 8.6 Ostale funkcije

Funkcija Namena

benchmark (broj, izraz)

encrypt(s[,zrnce])

found_rows ()

last_insert_id ()

md5 (s)

password(s)

Izračunava vrednost izraza izraz zadati broj puta, Ova funkcija uvek vraća nulu - njena svrha je da meri vreme potrebno za izračunavanje izraza i prikaže dobijena vreme.

Šifruje vrednost s pomoću Unixove sistemske funkcije crypt. Neobavezni parametar zrnce je niz od dva znaka. Ako funkcija crypt nije na raspolaganju u vašem sistemu Qer imate, na primer, Windows), funkcija vraća rezultat NULL.

Daje podatak o ukupnom broju redova koji bi uči tao poslednji upit kada ne bi sadržao odredbu limit. Deluje samo ako je u komandi SELECT zadata opcija SQL_CALC_FOUND_ROWS, kao što je opisano u poglavlju 7.

Vraća poslednju vrednost AUTO_INCREMENT koja je bila automat­ski generisana. To je korisno kada u tabel u dodate nov red i potre­ban vam je njegov identifikator da biste ga upisali kao vrednost spoljnog ključa u drugu tabelu.

Vraća 128-bitni heš ulaznog niza znakova s u MDS formatu. Ako pišete aplikaciju koja čuva imena korisnika i lozinke, to je prepo­ručljiv oblik skladištenja lozinki u bazu podataka.

Algoritmi za šifrovanje podataka imaju ograničen vek upotreblji­vosti. Budući da snaga računara neprekidno raste, neophodni su i sve snažniji algoritmi za šifrovanje podataka. MDS se zasad smatra prilično sigurnim.

Izračunava šifrovan oblik za lozinku zadatu parametrom s. To nije oblik u kojem se interno čuvaju lozinke korisnika MySQL-a, što je opisano u poglav~ u 11, "Upravljanje pravima korisnika". Upotreba funkcije password () za šifrovanje lozinki koje se čuvaju u bazi podataka ne preporučuje se.

Fukcije za upotrebu u odredbi GROUP BY Postoje funkcije posebno namenjene upotrebi u odredbi GROUP BY. One se ponekad

naziVaJU grupne ili agregatne funkcije. Možete ih primeniti i na ceo skup rezultata

upita, pri Čemu se svi redovi obrađuju kao pripadnici jedne grupe. To smo već upo­trebili u upitima kao što je sledeći:

select count(*) from employee;

Ovaj upit daje ukupan broj redova u tabeli employee.

Page 67: Prirucnik Za MySQL

122 Poglavlje B Upotreba MySQL-ovih ugrađenih funkcija u komandi SELI::CI

Ove funkcije se obično primenjuju na grupe podataka , kao u sledećem primeru:

select job, count(job} from employee group by job;

Ovaj upit prebrojava koliko ima zaposlenih na svakom radnom mestu. Tabela 8.7 prikazuje listu najkorisnijih grupnih funkcija .

Tabela 8.7 Funkcije za rad s grupama podataka

Funkcija

avg (kolona)

count(kolona) min (kolona)

max (kolona)

std (kolona)

sum (kol ona)

Sažetak

Namena

Vraća prosek vrednosti sadržanih u koloni kolona .

Vraća ukupan broj vrednosti u koloni kolona.

Vraća najmanju vrednost u koloni kolona.

Vraća n;Uveću vrednost u koloni kolona.

Vraća standardni otklon za vrednosti sadržane u koloni kol ona.

Vraća zbir vrednosti sadržanih u koloni kolona.

• MySQL pruža izbor aritmetičkih i logičkih operatora, kao i operatora za pere­đenje vrednosti. Pri upotrebi operatora morate naročito obratiti pažnju na mogućnost pojave vrednosti NULL jer u tom slučaju rezultati neće uvek biti kakve očekujete.

• MySQL pruža bogat izbor funkcija za rad s vrednostima znakovnog i numerič­kog tipa, za rad s datumima, za konverziju tipova podataka i druge funkcije .

• Funkcije za rad s grupama podataka deluju na grupe vrednosti u kolonama tabela. Te grupe se formiraju ako je zadata odredba GROUP BY, ali ako nije, funk­cije deluju na sve vrednosti u koloni tabele .

Pitanja l . Koji se od sledećih operatora ne mogu upotrebiti za ispitivanje da li je određena

vrednost jednaka NULL?

a) ISNULL ()

b) <=>

e) IS NULL

d)

2. Rezultat ovog pozivanja funkcije strcmp ( 'fred' , 'Fred') jeste

a) -1

b) o e) 1

d) 2

Odgovo1

3. Koju biste od sledećih funkcija upotrebili da dobijete ime meseca u datumu? a) dayname ()

b) extract()

e) subdate ()

d) now()

4. Koju od sledećih funkcija poziva MySQL kada interno šifruje lozinke svojih korisnika?

a) password()

b) encrypt ()

e) rodS()

d) sha()

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

Vežbe

a) to je sintaksna greška

b) cela tabela se obrađuje kao jedna grupa

e) ceo skup rezultata se obrađuje kao jedna grupa

d) svaki red se obrađuje kao jedna grupa

l. Napišite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad nog mesta 'Programmer', treba da se prikaže 'Analyst 1 Programmer'.

2. Napišite upit koji u kolonu department dodaje novu službu čiji je naziv Property Services. Zatim napišite upit koji dodaje novog zaposlenog, čije je ime Fred Smith a radno mesto DBA i radi u toj službi. Upotrebite funkciju last_insert_id (} da biste dobili identifikator nove službe.

3. Napišite upit koji učitava najnoviji posao iz tabele assignment. Savet: upotrebite grupnu funkciju max () .

Odgovori

Pitanja l. d

2. b

3. b

4. a

5. e

Page 68: Prirucnik Za MySQL

124 Poglavlje 8 Upotreba MySOL-ovih ugrađen ih funkcija u komane11 ~tLtLI

Vežbe l.

2.

3.

select name, replace(job, 'Programmer', 'Analyst/Programmer') from employee;

insert into department values (NULL, 'Property Services');

insert into employee values (NULL, 'Fred Smith', 'DBA', last_insert_id());

select max(workdate) from assignment;

U sledećem poglavlju Ovo poglavlje završava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi tabela i transakcije u MySQL-u", razmotrićemo pojedine mašine baze podataka koje MySQL podržava i posebne mogućnosti koje one pružaju.

I~ Tipovi tabela i transakcij

u MySOL-

9 Tipovi tabela u MySQL-u

10 Upotreba transakcija u InnoDB tabelama

Page 69: Prirucnik Za MySQL

9 Tipovi tabela u MySQL-u

u OVOM POGLAVLJU RAZMOTRIĆEMO TIPOVE TABELA koje su na raspolaganju projektantu MySQL aplikacija. U dosadašnjim primerima koristili smo uglavnom InnoDB ili My ISAM tabele, ali postoje i druge.

Projektovanje sistema za upravljanje bazama podataka, slično projektovanju sistema za druge namene, podrazumeva mnogo kompromisa. Na primer, poželjno je da se mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo, treba više vremena i troši se više prostora na disku i veća količina memorije. Deo posla pronalaženja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta baze podataka, tako što su vam prepustili izbor tipa tabela koje ćete koristiti. Možete se opredeliti zajedan od tipova koji podržavaju transakcije, ukoliko je to neophodno u vašoj aplikaciji, ili možete izabrati tip tabela koji obezbeđuje bolje performanse, ali ne podržava transakcije. U oba slučaja morate biti svesni kompromisa koje morate da napravite.

Možda ćete čuti da se tipovi tabela nazivaju mašine za skladištenje (engl. storage engine). To odražava činjenicu da je za upotrebu nekih tipova tabela neophodna zna­čajna količina posebnog programskog koda koji upravlja smeštanjem podataka, indek­siranjem, zaključavanjem podataka i pristupanjem disku. To takođe odražava suštinu baze podataka: skladištenje podataka.

Izrazi transakcij"a ili podrška za transakcije pojavljivaće se često u ovom poglavlju. To je važan uslov o kojem treba da vodite računa kada birate tip tabele. U primerima koje smo dosad naveli u ovoj knjizi, SQL upiti su se izvršavali potpuno izolovana do drugih korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne dešava.

Zamislite da imate bazu podataka o prometu na bankovnim računima. Ako želite da prebacite 1.000 dinara s jednog računa na drugi, potrebna su vam najmanje dva SQL upita- jedan, koji na prvom računu smanjuje stanje za 1.000 dinara i drugi, koji povećava stanje na drugom računu za 1.000 dinara. Bilo bi prava katastrofa kada bi se

Page 70: Prirucnik Za MySQL

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

zbog nečeg (na primer, prestanka napajanja) prvi upit izvršio do kraja, ali ne i drugi. U takvim slučajevima bilo bi neuporedivo bolje da se izvrše ili oba upita, ili nijedan, jer baza podataka mora uvek biti u usklađenom stanju.

Tabele koje podržavaju transakcije omogućavaju da za date da je određena grupa upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do kraja, a ako to nije moguće, baza podataka mora da je po11išti (engl. roll back), odnosno da se vrati u stanje u kojem je bila pre početka transakcije.

Transakcije i MySQL-ova sintaksa za njihovu upotrebu opisane su u poglavlju 10, "Upotreba transakcija u InnoDB tabelama".

U MySQL-u se mogu koristiti sledeći tipovi tabela:

• ISAM

• MyiSAM

• InnoDB

• BerkeleyDB (BDB)

• MERGE

• HEAP

Sve navedene tipove tabela objasnićemo pojedinačno, ali najviše prostora posveti­ćemo najčešće upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB podržavaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne čine.

U ovom poglavlju objasnićemo i posebne mogućnosti koje pružaju My ISAM tabele, a to su komprimovane tabele i tekstualno pretraživanje. Celo poglavlje 1 O posvećeno je posebnim mogućnostima mašine za skladištenje InnoDB.

ISAM tabele ISAM tabele su uključene u MySQL samo radi podrške starijim aplikacijama. Budući daje njihova funkcionalnost u potpunosti održana MyiSAM tabelama, nećemo ih detaljno razmatrati. Planirano je da budu uklonjene iz buduće verzije MySQL-a 5.0.

Naredni kod pravi ISAM tabelu, ukoliko vam je iz nekog razloga potrebna:

create table asset

assetiD int not null, description varchar(255} type=ISAM;

ISAM tabele omogućavaju brz pristup podacima ali ne podržavaju transakcije. Veći deo onoga što ćemo reći o My ISAM tabelama važi i za ISAM tabele, pri čemu za sta­rije ISAM tabele postoji više ograničenja.

IVIYIJMIVI ldU~I .

MyiSAM tabele su uvele sledeća poboljšanja:

• Prenosivost tabela. Tabele smešten e na disk ili na druge medije mogu se prene ti na drugi računar na kojem radi MySQL, bez obzira na platformu. To ne važi za ISAM tabele.

• Podrška za veoma velike tabele. Veličina ISAM tabela je ograničena na 4 GB. MyiSAM omogućava da tabela bude velika onoliko koliko to dozvoljava ope­rativni sistem. Budući da će to biti važno samo nekim korisnicima, moraćete pažljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi sistemi za rad s datotekama ograničavaju veličinu datoteka na najviše 2 GB. (Imajte u vidu da to ograničenje možete zaobići ako upotrebite MERGE tabele.)

• Efikasnije iskorišćenje prostora na disku. Manji su rascepkanost i praznine na disku.

• Manja ograni{enja klju{eva. ISAM tabele podržavaju najviše 16 ključeva po tabeli, a podrazumevana maksimalna dužina ključa je 256 bajtova. My ISAM tabele podržavaju 64 ključa po tabeli, a podrazumevana maksimalna dužina ključa je 1024 bajta.

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

MyiSAM tabele Mnogi ljudi godinama koriste MySQL ne znajući da može da radi i s tabelama drugog tipa. Razlog je to što se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a.

My ISAM tabele omogućavaju veoma brz pristup podacima ali ne podržavaju transakcije. One obezbeđuju visoke performanse u mnogim situacijama, čak i kada projektant napravi određene greške, a u rukanu stručnog administratora mogu da podrže i veoma obimne i/ili veoma opterećene baze podataka.

Naredni kod formira MyiSAM tabelu:

create table article (

} ;

articleiD int not null auto_increment primary key, title varchar(255}, body text

Nije obavezno, ali na kraj možete dodati sledeći red

type=MyiSAM;

i dobićete isti rezultat. MyiSAM tabele mogu biti jedne od sledeće tri vrste: dinamičke, statičke ili kompri

movane.Tabela automatski postaje dinamička ili statička u zavisnosti od definicija njenih kolona. Komprimovane tabele možete praviti samo ručno, pomoću alatke myisampack.

Page 71: Prirucnik Za MySQL

IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U

Tabele čiji su redovi fiksne dužine automatski se prave kao statičke, dok se tabele s redovima promenljive dužine prave kao dinamičke tabele. Po čemu možemo utvrditi da li tabela ima redove fiksne ili promenljive veličine?

Tip podataka char i svi numerički tipovi su fiksne veličinc .Veličina kolona tipa varchar, text i b lob menja se u zavisnosti od sadržaja. Tabela čije su sve kolone tipa char ili numeričkog tipa, biće statička, ali tabela koja sadrži barem jednu kolonu tipa varchar, text ili blob biće dinamička.

U odeljku "Tekstualno pretraživanje My ISAM tabela", napravićemo tabel u koju ćemo nazvati article. To će biti dinamička tabela zato što sadrži kolonu tipa varchar i kolonu tipa text. Prostor na disku koji će biti potreban za skladištenje svakog reda tabele zavisiće od tekućih podataka u poljima tabele.

Statička tabela pruža više prednosti. Pretražuje se brže od dinamičke ili komprimo­vane tabele. Baza podataka može veoma lako učitati zapis pronađen na osnovu indeksa kada se svaki zapis nalazi na određenom pomaku od početka datoteke. Tabela se veoma lako smešta u ostavu (keš). Manja je verovatno ća nepovratnog oštećenja podataka u slučaju ozbiljnog kvara sistema- alatka za popravku tabela obično uspeva da restaurira sve redove osim oštećenog.

Nedostatak statičkih tabela jeste to što se pri umetaqju stvarnih podataka u kolone fiksne veli čne gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite uko­liko se veličina vaših podataka ne razlikuje previše. Na primer, to važi za imena i pre­zimena ljudi. Međutim, cena će vam možda biti previsoka ako se podaci veoma mnogo razlikuju po veličini. Ako smatrate da će prezimena zaposlenih imati uvek maqje od 80 znakova, možda nećete želeti da nepotrebno rasipate po 75 znakova svaki put kada se neko preziva Perić ili Jović.

Za dinamičke tabele potrebno je složenije upravljanje unutar samog MySQL-a. Posao keširanja, učitavanja ili popravljaqja zapisa nije tako jednostavan za mašinu za skladištenje. Razlog je delimično to što je veličina tabele promenljiva, ali i to što tabela postaje rascepkana (fragmentirana).Ako je zbog promene sadržaja red postao veći, deo podataka će ostati na izvornom mestu, a deo će biti smešten u novi blok unutar dato­teke. To znači da se ne može garantovati da segment datoteke koji je operativni sistem učitao u keš sadrži sve delove reda. Osim toga, oštećenje tabele može biti teže popra­vljivo jer ako se izgube blokovi podataka ili veze između njih, ne može se lako utvrditi koji delovi kojim redovima pripadaju.

Da biste popravili ili defragmentirali My ISAM tabelu, možete s komandne linije upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opšir­nije objašnjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje baze podataka, ali bez popravljanja, možete upotrebiti MySQL-ovu komandu OPTI­

MIZE TABLE. (To je opširnije opisano u poglavlju 18",0ptimizovanje baze podataka".)

IVIYI.li'IIVI liiUCIC

KomprimovanjeMyiSAM tabela Iako tabele nastaju kao statičke ili dinamičke bez vašeg izričitog zahteva (ali kao rezultat odluka koje ste doneli pri projektovanju), tabele se ne komprimuju automatski. Da biste komprimovali tabelu, morate upotrebiti alatku myisampack s komandne linije. (Postoji pack_isam, njena verzija isključivo za ISAM tabele, ukoliko ih koristite.)

Mada se komprimovanje na prvi pogled čini korisno, trebalo bi da ga primenjujetc samo za neke aplikacije jer se komprimovane tabele mogu samo čitati. Ako treba da izmenite strukturu komprimovane tabele, ili da ažurirate podatke u njoj, ili da joj dodate nove, morate da dekomprimujete celu tabelu, unesete odgovarajuće izmenc i zatim ponovo komprimujete tabelu.

Postupak komprimovanja koji obavlja alatka myisampack čini kombinacija pravog komprimovanja (Hafinanovim kodom) i više optimizacija čiji je cilj sažimanje kolona, na primer, konverzijom postojećih tipova podataka u manje, i konverzijom sadržaja kolona u nabrajanja . Budući da se svaki zapis komprimuje zasebno, dekomprimovanje pojedinačnog zapisa je relativno jednostavno. Na sporijim uređajima za skladišteqje podataka trajanje operacije dekomprimovanja može čak biti i zanemarljivo u pare­đenju s trajanjem učitavanja podataka s diska.

Tekstualno pretraživanje MyiSAM tabela Jedna od mogućnosti koju zasad pružaju samo My ISAM tabele jeste tekstualno pretra­živanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba pronaći vrednost jednaku traženoj, ali često se traže reči ili nizovi znakova unutar blokova tek­sta. U takvim slučajevima tekstualno pretraživanje je korisnije.

Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno pretraživanje:

create table article ( articleiD int not null auto increment primary key, title varchar(255), body text, fulltext (title,body)

) ;

Naredni upit učitava sve zapise koji sadrže re č 'merger • :

select title from article where match (title,body) against ('merger');

Moguća su i složenija pretraživanja. Naredni upit učitava zapise koji sadrže bilo koju re č iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'.

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

Page 72: Prirucnik Za MySQL

l ..lL 1 u~tdVIJI;;: ~ ,,._,uv1 LdUCid u tvty..JuL.-u

Obratite pažnju na to da učitavamo zapise koji sadrže barem jednu od navedenih reči. U ovom slučaju ne tražimo nizove znakova niti zapise koji sadrže sve navedene reči. Pomoću modifikatora IN BOOLEAN MODE, koji ćemo objasniti u nastavku teksta, mogu se zadati obe vrste pretrage istovremeno. . ,

Reči • acquire' i • acquis i tions' morali smo da navedemo odvojeno zato sto MySQL zasad još ne podržava pretraživanje od korena (engl. stemming). Tehni~a pre­traživanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe. Ona omogućava da sistem prepoznaje da određeni skup reči ima zajednički koren. Na primer, 'acquire' je koren drugih reči kao što su 'acquire s', 'acquired' 1

'acquisition'. Za svako otkriveno poklapanje izračunava se koeficijent povezanosti s traženim

pojmom (engl. relevance value), a rezultati se automatski sortiraju po opadajuć.oj vred-. nosti tog koeficijenta. Ako želite, možete pogledati i koeficijente povezan os tr za svaki učitani zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki zapis koji ima koeficijent nula nije ni po Čemu povezan s traženim pojmom i zato se ne učitava.

select title, match (title,body) against ('merge acquisition acquire takeover') as relevance from article;

Obratite pažnju na to da relevance nije rezervisana reč, već samo alijas za . match(title,body) against ('merge acquisition acquire takeover').Zad~r smo je samo zato da bi rezultati bili lakše čitljivi.

Korisniji je sledeći upit, koji prikazuje naslove i koeficijente povezanosti učitanih dokumenata. Budući da imamo uslov MATCH u odredbi WHERE, rezultati će biti sorti­rani, a redovi koji se ne odnose na traženi pojam biće zanemareni.

select title, match (title,body) against ('merge acquisition acquire takeover') as relevance from article where match (title,body) against ('merge acquisition acquire takeover');

Postoje određene reči koje se ne mogu tražiti. Da bi se poboljšale performanse, određene reči su isključene iz indeksa ili se zanemaruju pri pretraživanju.

Kratke reči se ne indeksiraju. Standardno se zanemaruju i sve reči koje sadrže manje od četiri slova. Na nekim instalacijama, kao što je Slashdot.org, to je ozbiljan problem, pošto su troslovni akronimi često važan deo sadržaja tehničkih tekstova.To ograniče-nje možete zaobići ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU vrednost, ali onda morate ponovo generisati sve indekse.

U indeksima za tekstualno pretraživanje možete zadati nebitne reči (engl. stop words). Nebitna reč je bez semantičke vrednosti. To su uglavnom reči koje su važne za sasta­vljanje rečenice, ali za koje je malo verovatno da će biti važne za sadržaj teksta.

MyiSAM tabele

U engleskom jeziku, reči kao što su 'the', 'and', 'then' i 'soon' neophodne su, ali najčešće nisu korisni pojmovi za traženje. U MySQL-u postoje standardne liste takvih reči (za engleski j ezik) , a možete i sami sastaviti takve liste za tekstove na drugim govornim jezicima koje indeksirate.

Budući da je tekstu~no pretraživanje veoma složen posao, važno je imati na umu činjenicu da postoje ozbiljna ograniČe!* u pogledu performansi . Kada MySQL-ove tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse tekstu~nog pretraživanja osetno se pogoršavaju. U manjim aplikacijama to ne bi treb~o da pred­stavlja problem, ~i imajte tu činjenicu na umu kada pravite složenije aplikacije.

Reči koje su Česte među podacima ne koriste se pri pretraživanju.Ako vaša tabela sadrži tekstove objavljene u biltenu vaše kompanije Acme PTY Ltd., verovatno će nmogi tekstovi u zaglavlju sadržati reč 'Acme'. Pretraga po toj reči će verovatno gene­risati mnogobrojne rezultate, koji ipak neće biti upotrebljivi. Ako 50% ili više zapisa sadrži određenu reč, smatra se da ta reč nema vrednosti za izračunavanje koeficijenta povezanosti.

Logičko tekstualno pretraživanje

Pri pretraživanju možete imati veći stepen kontrole ako upotrebite modifikator IN BOOLEAN MODE.

Naredni upit će uči tati samo zapise koji sadrže reč 'linux' i izraz "Open source", ali ne i reč 'desktop'. Reči 'Java' i 'Oracle' nisu obavezne, ali kada se određuje koeficijent povezanosti, reč 'Java' povećava rang zapisa, a reč 'oracle' smanjuje rang zapisa. Redosled traženih reči u nizu znakova ili u zapisu nije bitan. nelect title from article where match (title,body)

against ('+linux +"Open Source" -desktop Java -Oracle' IN BOOLEAN MODE) ;

Tabela 9.1 prikazuje listu svih operatora.

lobela 9.1

()pcrator

Operatori za logičko pretraživaqje

Značenje

( )

ll ll

Ova reč je obavezna.

Ova reč ne treba da se pojavi u rezultatima. Ova reč je manje važna. Ova reč je važnija. Grupiše reči u podizraz.

Ova reč se može pojaviti u rezultatima ali smanjuje rang zapisa.

Džokerski sufiks . Na primer, merge neće pronaći i merger, ali merge* će pronaći i merge i merger. Može se upotrebiti samo na kraju reči za prctragu.

vo je izraz. Pronalazi samo identičan sadržaj, u istom redosledu . --------------------

Page 73: Prirucnik Za MySQL

134 Poglavlje 9 Tipovi tabela u MySQL-u

Za logičko pretraživanje nije neophodno da postoje indeksi za tekstualno pretraži­vanje. Tako se mogu pretraži vati i neindeksirane tabele, ali je postupak veo~a s po~.

Još jedna mala razlika između tekstualnog pretraživanja i logičkog p~etr_až_lvanJa jeste to što se pri logičkom pretraživanju zanemaruju reči koje se često poJaVlJUJU _me~u podacima. U tom slučaju ne važi pravilo 50%. Ako pretražujemo tekstove obJaVlJene u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno učitao gotovo sve

redove, dok bi rezultat upita iza njega bio prazan skup.

select title from article where match (title,body) against ('Acme' IN BOOLEAN MODE);

select title from article where match (title,body) against ('Acme');

lnnoDB tabele Sada ćemo razmotriti InnoDB tabele. InnoDB je mašina za skladištenje koja je brza i podržava transakcije. Njene mogućnosti transakcione obrade su toliko važne da ćemo njihovoj primeni posvetiti celo naredno poglavlje.

InnoDB table omogućavaju

• Transakcionu obradu.Videti poglavlje 10. • Zakiju{avanje podataka na nivou reda. To znači da samo red koji se trenutno obra­

đuje u nekom upitu nije na raspolaganju drugim korisnicima.Većma drug1h . mašina za skladištenje (osim BDB-a) primenjuje zaključavanje podataka na mvou cele tabele, tj. kada jedan proces ažurira jedan red tabele, cela tabela nije dostupna

drugim procesima. • Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste

spoljni ključevi neće raditi s tabelama drugog tipa.

• Dosledno u{itavanje podataka bez zakiju{avanja u komandama SELECT. (Ideja je

pozajrnljena iz Oraclea.)

InnoDB ima vlastite konfiguracione opcije, vlastiti direktorijum i vlastiti način skla­dištenja podataka. Dok My ISAM smešta svaku tabelu u zasebnu datoteku, InnoDB smešta sve tabele i indekse u tabelarni prostor, što znači da se delovi jedne tabele mogu nalaziti u više datoteka. Zahvaljujući tome, InnoDB može raditi s veoma obimnim tabelama za čiju veličinu ne važe ograničenja koja nameće operativni sistem. Međutim, imajte u vidu da u poređenju s MyiSAM tabelama,jedna InnoDB tabela zauz1ma

znatno više prostora na disku za skladištenje istih zapisa. . . . , . Celo naredno poglavlje, 10, posvećeno je upotrebi ovih speclJalmh mogucnost1

JnnoDB-a. Podešavanje InnoDB-a zahteva određeni napor. Osnovnu ~onfiguracij~ opisali :~10

u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr­

nijl! u poglavlju 12",Podešavanje MySQL-a" .

BerkeleyDB (BDB) tabele

Iako je razvijen odvojeno od većeg dela MySQL-a, InnoDB se može koristiti pod jednakim uslovima dve vrste licence.

Mnoge opsežne i veoma posećene Web lokacije koje koriste MySQL, kao što su Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l finance. yahoo. com), koriste mašinu InnoDB. Naročito je pogodna za obradu velikih količina podataka, velikom brzinom i u okruženju koje podržava transakcije.

InnoDB je jedan od najbržih sistema na svetu koji podržava transakcije, ali po cenu izvesnih žrtava. Pri većini upotreba, My ISAM će biti brži, ali razlika najčešće neće biti tako značajna.

InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najno­vije informacije o InnoDB-u naći ćete na www. innodb. com.

BerkeleyDB (BDB) tabele Druga mogućnost koju imate kada za MySQL birate mašinu za skladištenje koja podr­žava transakcije jeste BerkeleyDB (obično se skraćuje na BDB). BDB se može nabaviti od kompanije Sleepycat software (www. sleepycat. com) . Ova mašina se koristi za trans­akcionu obradu u MySQL-u ređe nego InnoDB. Mada je BDB mašina već duže vreme na tržištu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj dokumentaciji stoji da je kvalitet usklađenosti s MySQL-om nivoa "gama". To znači da je pouzdanost bolja od verzije beta, ali postoje određeni problemi. Ne zaboravite, u MySQL-ovoj kvalifikaciji beta verzije, pouzdanost je bolja nego u verzijama softvera koje mnoge druge kompanije kvalifikuju kao "zlatno izdanje".

BDB primenjuje zaključavanje podataka na nivou stranice, usled čega su perfor­manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite veći broj tabela.

Sve BDB tabele moraju imati primarni ključ (što i nije neki problem, pošto se to ionako preporučt~e) . U stvari, primarni ključ će automatski biti napravljen ako ga sami izričito ne zadate.

BDB tabele se čuvaju u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite to s drugim tipovima tabela za koje se indeksi čuvaju u obliku b-stabala. Posledica je sporije sekvencijalno učitavanje redova tabele (što se primenjuje, npr. kada bezuslovno učitavate sve redove tabele ili izvršavate upite u kojima su indeksi neupotrebljivi). Osim toga, BDB tabele zauzimaju više mesta na disku.

Važno ograničenje BDB tabela jeste to da ne možete po meri ti postojeće podatke na drugo mesto na disku. Razlog je to što se zajedno s podacima tabele skladišti i apso­lutna putanja do tih podataka. Kada pravite rezervne kopije BDB tabela, morate oba­vezno napraviti i rezervnu kopiju datoteka dnevnika jer bez njih nećete moći da pokrenete bazu podataka.

Page 74: Prirucnik Za MySQL

Poglavlje 9 Tipovi tabela u MySQL-u

MERGE tabele MERGE tabele predstavljaju vešt način zaobilaženja ograničenja maksimalne veličine datoteka koja nameće operativni sistem. Pošto se svaka MyiSAM tabela smešta u zasebnu datoteku, veličina tabele je ograničena na maksimalnu veličinu datoteke koju operativni sistem dozvoljava. To se može zaobići pomoću MERGE tabele,j:r one omogućavaju da se u upitima više My ISAM tabela obrađuju kao Jedna log1cka tabela.

Pogledajmo primer. Listing 9 .l sadrži kod koji formira MERGE tabel u od tn

tabele dnevnika promena.

Listing 9.1 A MERGE Table Example

create database logs; use logs;

create table log2003Jan (logid int auto_increment primary key, logts datetime, entry char(255)); insert into log2003Jan values (NULL, '2003-01-01', 'first jan entry');

create table log2003Feb (logid int auto increment primary key, logts datetime, entry char(255)); insert into log2003Feb values (NULL, • 2003-02 -01', 'first feb entry');

create table log2003Mar (logid int auto increment primary key, logts datetime, entry char(255)); insert into log2003Mar values (NULL, '2003-03-01', 'first mar entry');

create table logs (logid int auto increment primary key, logLs datetime, • ntry char(255))

ype • merge Ullion • (log2003Jan, log2003Feb, log2003Mar) insert_method = last;

U ovom listingu napravili smo tri tabele s jednakom strukturom, log2003Jan, lo~2003Fcb i log2003Mar. MERGE tabele se često primenjuju za beleženje promena,

k.10 što ćete videti u nastavku teksta. N n kon umetanja nekih pro bnih podataka u te tri tabele, od njih smo naravi li jednu

M ERG E tabclu.To smo uradili tako što smo napravili tabelu logs, koj;l 1111.1 ''''lk·ćc

IVICn\JC taUt'll"

osobine: ima istu strukturu kao tri tabele koje ćemo grupisati, njen tip je MERGE, a sadržaj je unija (UNION) tekućeg sadržaja sve tri tabele. Osim toga, zadali smo last (poslednja) kao vrednost opcije INSERT_ METHOD. To znači da će nov red koji unesemo u ovu MERGE tabel u biti fizički smešten u poslednju tabelu u grupi, u ovom slučaju, log2003Mar. Ostale mogućnosti su FIRST (podaci se umeću u prvu tabelu u grupi) ili NO (umetanje novog reda nije dozvoljeno u MERGE tabelu).

Tako smo formirali tabelu s kojom možemo da radimo na uobičajeni način i koja prividno sadrži sve podatke iz svih tabela u grupi. Ako izvršimo upit

select * from logs;

dobićemo sledeće rezultate:

+-------+--------------- ------+-------- ---------+ l logid l logts l entry +-------+---------------------+----- ------------+

l l 2003-01-01 00:00:00 l first jan entry l

l l 2003-02-01 00:00:00 l first feb entry l

l l 2003-03-01 00:00:00 l first mar entry l

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

Kao što vidite, prikazani su podaci iz sve tri tabele. Zaista je važno da zapamtite da, iako smo zadali da je kolona log id primarni ključ MERGE tabele, mehanizam radi malo drugačije od načina na koji obično rade primarni ključevi. Njihove vrednosti obično moraju biti jedinstvene, ali pošto MERGE tabela upravlja istovremeno s tri skupa primarnih ključeva, nipošto nije isključeno da postoji više od jednog reda koji sadrže istu vrednost primarnog ključa, kao što je prikazano u rezultatima navedenog upita.

Čak i kad su tabele koje čine njene komponente grupisane u MERGE tabel u, nad njima i dalje možemo izvršavati upite na uobičajeni način. Međutim, komande DROP, ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se viŠe izvršiti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE) ipak možete izvršiti ukoliko MERGE tabela trenutno nije otvorena. Možete je zatvoriti pomoću komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon komande FLUSH možete izvršiti i bilo koju od navedenih komandi, ali mi smo ustanovili da to nije uvek sasvim tačno. Na primer, u vreme pisanja ove knjige, ako se pomoću komande DROP izbriše jedna od tabela u grupi, automatski se briše i sama MERGE tabela. Ako je potrebno da neku od navedenih komandi izvršite nad jednom od tabela u grupi, najbolje je da prethodno izbrišete MERGE tabel u i da je zatim ponovo napra­vite. Brisanje MERGE tabele ni na koji način ne utiče na njene komponente niti na podatke u njima.

Tabele koje čine MERGE tabelu možete komprimovati pomoću alatke myisam­pack. To je naročito korisno u slučajevima kao što je naš primer u kojem skladištima datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati budući da se novi podaci upisuju samo u poslednju datoteku.

l '

Page 75: Prirucnik Za MySQL

138 Poglavlje 9 Tipovi tabela u MySOL-u

HEAP tabele HEAP tabele su izuzetno brze i cele se čuvaju u memoriji. Brzina se postiže zahvalju-

jući upotrebi heširanih indeksa. Nedostatak čuvanja cele tabele u memoriji jeste, naravno, to da u slučaju problema

s napajanjem računara, podaci iz HEAP tabele nestaju zauvek. Međutim, tabele tog

tipa su savršene za čuvanje privremenih podataka. Tabelu tipa HEAP možete napraviti na sledeći način:

create table testHeap (id int not null primary key,

data char(lOO)) type=heap max_rows = 100;

Kao što vidite, tip tabele zadali smo kao HEAP. Osim toga, primenili smo i dobro praktično pravilo ograničavanja maksimalnog broja redova u tabeli. Ako vaša HEAP tabela previše naraste, lako se može dogoditi da vam ponestane memorije. Maksimalan broj redova u HEAP tabeli može se zadati u konfiguracionoj opciji

max_heap_table_size. HEAP tabele imaju sledeća ograničenja:

• Nisu podržane kolone tipa AUTO_ INCREMENT.

• Nisu podržani tipovi podataka BLOB i TEXT .

• U HEAP tabelama ne mogu se tražiti redovi na osnovu početnog dela indeksa. (Ako ne znate šta tačno ovo znači, više informacija o indeksiranju naći ćete u

poglavlju 19.) • Indeksi se mogu koristiti pri pretraživanju redova tabele samo u upitima koji u

uslovima za pretragu sadrže operatore = ili <=>.

Sažetak • MySQL podržava šest tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE

i HEAP. • Samo tabele tipa InnoDB i BDB podržavaju transakcije. • Samo MyiSAM tabele podržavaju tekstualno pretraživanje i indeksiranje.

ISAM • ISAM je zastareli tip tabela, zamenjen tipom My ISAM.

• ISAM tabele imaju ograničenu veličinu od najviše 4 GB.

• ISAM tabele nisu prenosive između dva sistema. • Jedna tabela može imati najviše 16 ključeva, a svaki može sadržati 256 bajtova

(znakova).

.Jdl.l:ldl\

MyiSAM • My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podržava transakcije.

• MyiSAM podržava komprimovanje tabela.

• ":eličina ~yiSAM tabela je ograničena na maksimum koji dozvoljava operativni s1stem, al1 se to ograničenje može zaobići pomoću MERGE tabela.

• Datoteke u koje su smeštene My ISAM tabele prenosive su između različitih ope­rativnih sistema.

• Jedna tabela može imati najviše 64 ključa a svaki može sadržati najviše 1024 bajta.

lnnoDB • InnoDB tabele podržavaju transakcije.

• InnoDB podržavaju zaključavanje na nivou redova.

• Ne postoji teorijska gornja granica veličine tabele jer jedna tabela može biti smeštena u više datoteka.

• InnoDB omogućava dosledno učitavanje redova bez zaključavanja u komandama SELECT.

• InnoDB tabele su prenosive između različitih operativnih sistema.

• InnoDB tabele zauzimaju više prostora na disku od MyiSAM tabela.

• InnoDB tabele podržavaju spoljne ključeve .

BDB • Kao i InnoDB tabele, BDB tabele podržavaju transakcije. BDB tabele ređe se

koriste u MySQL-u od InnoDB tabela .

• BDB podržava zaključavanje podataka na nivou stranice.

• BDB tabele nisu prenosive.

MERGE • MERGE tabele omogućavaju da se više My ISAM tabela tretira kao jedna

logička tabela, zahvaljujući čemu se zaobilazi problem najveće dozvoljene veličine MyiSAM tabela .

HEAP • HE~ t~bele se u celini čuvaju u memoriji i njihova se veličina mora ograničiti

da b1 se Izbegla prevelika potrošnja memorije .

• ~o~aci ~mešteni u HEAP tabelu nisu trajni i gube se u slučaju prestanka napa­JanJa racunara .

• HEAP tabele su superbrze, pod uslovom da imate dovoljno fizičke memorije u koju ćete ih smestiti.

• I lEA l' tabele ne podržavaju kolone tipa AUTO_INCREMENT, TEXT i BLOB.

Page 76: Prirucnik Za MySQL

140 Poglavlje 9 Tipovi tabela u MySUL-u

Pitanja 1. Potrebne su nam transakcije i tabele koje se lako mogu preneti na drugi opera-

tivni sistem. Za tu namenu pogodne su tabele tipa

a) ISAM

b) MyiSAM

e) InnoDB

d) BDB

2. Potrebna nam je privremena tabela za brzo pretraživanje. Trebalo bi da upotre-bimo tabelu tipa

a) ISAM

b) MyiSAM

e) MERGE

d) HEAP

3. Potrebne su nam izuzetno velike tabele. Za tu namenu nisu pogodne tabele tipa

a) ISAM

b) MERGE

e) InnoDB

d) nijedan od prethodnih

4. Potrebno nam je tekstualno pretraživanje. Za tu namenu pogodne su tabele tipa

a) MyiSAM

b) InnoDB

e) BDB

d) HEAP

S. Pogledajte sledeći upit za tekstualno pretraživa~e: select title from article where match (title,body)

against ('+php +pdf pdflib >tutorial -reference' IN BOOLEAN MODE);

Koja od sledećih tvrdnji o ovom upitu nije tačna?

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

b) Rang rezultata koji sadrže reč 'reference' biće povećan.

e) Rezultati pretrage moraju sadržati re č 'ph p' .

d) Rezultati pretrage koji sadrže re č 'pdfl ib' biće rangirani više od onih koji je ne sadrže.

u ~1euecem poglaVlJU

Vežbe Za ovo poglavlje nema formalnih vežbi, ali bi bilo korisno da vežbate pravljer~je 1 upotrebu tabela pojedinih tipova.

Odgovori

Pitanja 1. e

2. d

3. a

4. a

5. b

U sledećem poglavlju U sled ećem poglavlju, "Upotreba transakcija u Inn oD B tabelama", razmatraćemo šta ta čno znači pojam transakcija, zbog čega su transakcije tako važne i kako se one pri­menJUJU u InnoDB tabelama.

Page 77: Prirucnik Za MySQL

10 Upotreba transakcija

u lnnoDB tabelama

u OVOM POGLAVLJU BAVIĆEMO SE transakcijama u MySQL-u. U praktičnim pri­merima koristićemo tip tabela InnoDB, ali gotovo sve što bude rečeno važiće podjed­nako i za Berkeley DB tabele.

Razmotrićemo sledeće teme:

• Šta je transakcija

• Upotreba transakcija u MySQL-u

• InnoDB-ov model transakcije i usklađenost s ACID pravilima

Šta je transakcija? U ovom poglavlju, prvo moramo razjasniti šta je transakcija. U kontekstu sistema za upravljanje bazama podataka, transakcija je niz povezanih komandi koje se moraju obrađivati kao nedeljiva celina. Drugim rečima, sve što treba da bude urađeno u trans­akciji mora se uraditi u celini, ili ne sme ništa uraditi. Ovaj koncept je poznat kao nedelji vost (engl. atomicity). Kaže se da je transakcija atom obrade jer se ne može razbiti na manje delove - obrađuje se u celini ili se uopšte ne obrađuje.

Ovaj koncept ima važne posledice kada se razmatra pristup podacima u okruženju s više korisnika, procesa i niti izvršavanja (engl. threads) istovremeno, a važan je i za obna­vljanje podataka nakon kvara. Savremenim računarima često pristupa više korisnika istovremeno. Na njihovim računarima obično je aktivno više programa u isto vreme, a često koriste i programe kao što je softver za Web server koji formiraju više istovreme­nih procesa ili niti izvršavanja. Svakom od tih korisnika, programa, procesa ili niti izvršavanja može biti neophodan pristup serveru baze podataka.

Više niti izvršavanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako dođe do greške, pri obnavljanju podataka baza podataka mora završiti otvorene trans­akcije. To znači da se baza podataka mora vratiti u stanje u kojem je bila pre početka

Page 78: Prirucnik Za MySQL

Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

transakcije, ili mora da izvrši celu transakciju do kraja. Uglavnom je bolje izgubiti celu transakciju koja se sastoji od međusobno povezanih izmena nego doći u stanje deli­mično unetih izmena čiji rezultat može biti neusklađenost sadržaja baze podataka.

Ovaj koncept se može izraziti formalno, ali je verovatno najbolje da na primeru shvatite o čemu se tačno radi. Recimo da imate vrlo jednostavnu (ali potencijalno veoma važnu) bazu podataka u kojoj se čuvaju podaci o prometu na bankovnim raču­nima. Za svaki račun postoje barem podaci o identifikatoru računa i tekućem stanju.

Tabelu bankovnih računa, accounts, možemo napraviti sa sledećom strukturom:

create table account

number int not null auto increment primary key, balance float type = InnoDB;

Verovatno vas neće iznenaditi način na koji ćemo otvoriti tri nova računa pomoću

sledećih upita:

insert into account (balance) values (O. O); insert into account (balance) values (1000.0); insert into account (balance) values (2000.0);

Pošto dosad ništa nije moglo da krene baš naopako, trebalo bi da rezultati budu sle­

deći podaci:

+--------+---------+ l number l balance l + ------- +---------+ l l l

l l 2 l 3 l

o l 1000 l 2000 l

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

Ako ništa unapred ne određujemo u vezi s brojevima računa koji se generišu u koloni tipa auto-increment, nevažan je redosled kojim ćete izvršiti ove upite. Sasvim je nebitno da li ćete ih izvršiti istovremeno s tri interaktivna klijentska računara i ne

možete znati koji će upit biti izvršen prvi. To često nije tačno kada se izvršavaju složeniji upiti ili grupe upita . Pogledajte

naredne dve komande koje uplaćuju SOO dolara na račun broj 2:

# najpre učitavamo tekuće stanje na računu select balance from account where number = 2; ll upit daje rezultat od 1000 dolara ll sada upisujemo novo stanje \lpdate account set balance = 1500 where number= 2;

Ova dva upita su međusobno povezana i moraju se izvršiti zajedno. Ako klijentski programi s drugih računara mogu da izmene stanje na ovom računu između naše pro­vere stanja i našeg ažurira~a stanja, može se dogoditi da ne dobijemo rezultate koje

SiliO očekivali.

.. JI.d j\. ll dllltU\l.ljtll

Ukoliko dva klijentska programa izvršavaju parove ovakvih upita istovremeno, rezultati će zavisiti od toga koji se u kom trenutku izvršio. Ako smo pomoću ovih upita pokušali da upišemo uplatu od 500 dolara, a drugi klijentski program je pomoću naredna dva upita pokušao da uplati 1 OO dolara, konačno stanje računa može biti 11 OO dolara ili 1500 -a nijedno od toga neće biti tačan rezultat.

# najpre učitavamo tekuće stanje na računu select balance from account where number = 2; # upit daje rezultat od 1000 dolara # sada upisujemo novo stanje update account set balance = 1100 where number = 2;

Jasno je da bi to bilo neprihvatljivo, ali se u ovom sučaju problem može lako rešiti. Ako izmene zadamo kao relativne a ne kao apsolutne, postaće nedeljive jedinice i rešili smo problem. Naredni upit će davati ispravne rezultate, bez obzira na to da li se u isto vreme izvršavaju i drugi upiti:

update account set balance = balance + SOO where number = 2;

U MySQL-u je jedna komanda update uvek nedeljiva. Ne može je prekinuti druga komanda, niti se može izvršiti samo delimično. Izvršiće se cela, ili će u slučaju greške cela biti poništena.

Složeniji slučajevi su malo teže shvatljivi . Pogledajte naredni par upita čija je svrha prenošenje iznosa od 1000 dolara sa računa 2 na račun l:

update account set balance = balance - 1000 where number = 2; update account set balance = balance + 1000 where number = l;

Oba upita unose izmenu u relativnom obliku, ali je važno da se oba upita izvrše da bismo dobili smislene rezultate. Trebalo bi da nakon izvršavanja upita iznos novca u sistemu bude isti kao pre izvršavanja upita. Novac treba da bude prebačen s jednog računa na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako dođe do prekida napajanja između izvršavanja prvog i drugog upita, podaci više neće biti usklađeni.

U jednostavnim slučajevima, problem se može zaobići tako što se oba upita združe u jednu SQL komandu. U ovom prim eru možemo napisati sledeći upit:

update account as source, account as dest set source.balance = source.balance - 1000,

dest.balance = dest.balance + 1000 where source.number = 2 and dest.number = l;

Pošto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili smo da izmena postane nedeljiva i da se u potpunosti izvrši ili da se uopšte ne izvrši. Ne moramo da brinemo da li će server prestati da radi tokom izvršavanja nekog dela operacije koju smo zahtevali.

U ovom slučaju "stradala" je jedino razumljivost upita. Ovako kombinovan upit je slabije razumljiv i teže se otkrivaju greške nego u prvoj verziji koju smo naveli.

Page 79: Prirucnik Za MySQL

ruyldVIjt: lU UJJUllt:Ud lldll~dr\\:ljd U IIIIIUUD l.dU'Cidllld

U mnogim slučajevima neće biti moguće združi vanje svih povezanih upita u jedan kao u navedenom primeru.Jedino rešenje u takvim slučajevima, ukoliko želite razu­mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi označite kao transakciju, time obaveštava te bazu podataka da je to povezan i nedeljiv skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvršiti ili sve komande u skupu ili nijedna od njih. Pomenuta dva upita možete izvršiti kao jednu transakciju pomoću sledećih SQL komandi:

s tart transaction; update account set balance update account set balance commit;

balance 1000 where number balance + 1000 where number

2 o

' l·

'

Važna osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu završene i potvrđene (tj. izmene unete u bazu podataka). Nijedna druga nit izvršavanja (proces) ne može da čita neusklađene podatke iz tabele ili tabela dok se ne završi postupak ažuriranja koji ste započeli.

Druga prednost transakcija jeste to da se delimično izvršene transakcije mogu poništiti. Ako transakciju poništimo pre nego što je potvrdimo (engl. commit), sve izmene koje su načinili upiti koji čine transakciju biće poništene.

U našem primeru prenošenja novca na drugi račun, ako dodamo komandu SELECT

da bismo proverili da ne skidamo više novca sa izvornog računa nego što ga ima na njemu, možemo upotrebiti rezervisanu reč ROLLBACK ukoliko želimo da poništimo rclu transakciju. Sintaksa upita izgledala bi ovako:

aLart transaction; update account set balance = balance - 1000 where number 2; \lpda t e account set balance = balance + 1000 where number l; s lec t balance from account where number = 2; ll select kaže da je stanje na računu broj 2 negativno! ll bolj e da poništimo promenu rollback;

Komanda ROLLBACK prekida transakciju i poništava sve izmene načinjene od početka transakcij e. Transakcija koja je bila poništena umesto da bude potvrđena ne ostavlja nikakav trag na podacima. Budući da delimični rezultati nisu bili vidljivi iz drugih lt .msa kcija , konačno stanje baze podataka isto je kao da transakcija nije ni bila započeta.

Upotreba transakcija u MySOL-u l >.t biste mogli da koristite transakcije kako je opisano u prethodnom odeljku, morate upotrebiti tip tabela koji podržava transakcije- to može biti InnoDB ili BDB. Postoje Lt l' !i č it c sintakse koje daju isti konačan rezultat.

Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Možda Ćete kori stiti jedan od ovih oblika da bi vaš kod ostao kompatibilan s drugom bazom poda­l ;tka koju imate, ali uglavnom se preporučuje sintaksa START TRANSACTION, budući da Jl' propisana standardom SQL-99 .

UjJUllt:Ui:l lli:lll~i:ll\\:ljCI u IVIY;)UL- U

Podešavanje automatskog potvrđivanja transakcije U MySQL-uje standardno uključeno automatsko potvrđivanje transakcija (režim rada autocommit). Svaki upit koji pokrenete, automatski se izvršava u okviru vlastite transakcije. Možete zamisliti da se sve odvija kao da ste izričito zadali komande START

TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita kao što su sledeći

update account set balance = balance - 1000 where number update account set balance = balance + 1000 where number

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

s tart transaction; update account set balance commit; s tart transaction; update account set balance commit;

Ukoliko upišete

s tart transaction;

balance - 1000 where number

balance + 1000 where number

ništa se neće dogoditi dok ne upišete i

commit;

2· '

l· '

2;

l· '

Automatsko potvrđivanje transakcija možete isključiti pomoću komande SET na sledeći način:

set autocommit=O;

Kao što biste i sami zaključili, sledeća komanda vraća MySQL u režim autocommit:

set autocommit=l;

Pošto je promenljiva autocommi t lokalna za sesiju, izmena režima rada važi samo za upite koje pokreće tekuća sesija, dok je ta sesija aktivna.

Ako isključite automatsko potvrđivanje transakcija, nije potrebno izričito zadati komandu START TRANSACTION da biste započeli transakciju. Nipošto ne zaboravite da povremeno izdate komandu COMMIT da biste izmene koje ste načinili trajno preneli u bazu podataka.

Bez obzira na to da li je režim autocommit uključen ili isključen, u određenim slu­čajevima se izmene koje načinite automatski potvrđuju (i prenose u bazu).Ako koristite tip tabela koji ne podržava transakcije, kao što je My ISAM, sve izmene koje načinite odmah se prosleđuju u bazu, bez obzira na vrednost promenljive autocommit. Slobo­dno možete grupisati komande između komandi START TRANSACTION i COMMIT, ali to neće imati nikakvog uticaja ako tabela ne podržava transakcije. Možete čak upotrebiti i komandu ROLLBACK. Time nećete izazvati grešku, ali u tabeli koja ne podržava trans­akcije, ta komanda prosto neće imati nikakvog efekta ni na šta što ste izmenili.To može biti korisno kada testirate kod ili kada iz datoteke slike stanja učitava te podatke na server koji radi s drugim tipom tabela.

l

Page 80: Prirucnik Za MySQL

ruyldVIJt: lU UfJUllt:Ud lldll~d"~IJ<l U IIIIIUUD ldUt:ldllld

U tabelama koje podržavaju transakcije, postoje akcije (osim izričitog izdavanja komande COMMIT) koje će automatski pokrenuti komandu COMMIT. Ako zahtevate zaključavanje podataka, time ćete implicitno potvrditi sve započete upite.

Zaključavanje podataka Druga mogućnost da iskoristite deo prednosti transakcija jeste da ručno zaključavate i otključavate tabele.

Ako zaista želimo da primer koda za deponovanje novca na bankovni račun napi­šeme s dva odvojena upita, to bi izgledalo ovako:

lock tables account write; select balance from account where number = 2; update account set balance = 1500 where number = 2; unlock tables;

Komanda LOCK TABLES pokušava da zaključa sve tabele koje navedete da bi tekuća nit izvršenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES oslobađa sve blokade koje je tekuća nit postavila. Postupak deblokade tabela vrlo je jednostavan. Ukoliko ste zaključali tabel u, imajte u vidu da je morate što pre osloboditi da biste što manje ometali druge niti. Zaključavanje tabela je složenije pitanje.

Sve tabele koje vam trebaju morate zaključati istom komandom. U prethodnom prim eru zahteva se zaključavanje samo jedne tabele, ali ako nameravate da pristupate grupi tabela istovremeno, ili čak različitim alijasima iste tabele, morate ih sve navesti u istoj komandi, na primer:

lock tables account write, account as a read, othertable low_priority write;

Pošto komanda LOCK TABLES oslobađa sve blokade koje ste pre nje postavili, ako pokušate da grupišete blokade koje su vam potrebne za više komandi, sve prethodne blokade biće ukinute a blokada će važiti samo za poslednju komandu u grupi.

Postoje dve vrste blokada: za čitanje i za pisanje. Ako vam je potreban pristup tabeli radi upisivanja podataka i ne možete dozvoliti da druge niti pristupaju tabeli u isto vreme kad i vi, blokada za pisanje će sprečiti da bilo koja druga nit čita tabelu ili piše u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da čitate tabelu, nema nik:lkvc štete ako dozvolite da i druge niti čitaju tabelu u isto vreme. Blokada za čitanje sprcbva druge niti da pišu u tabel u samo dok je vaša nit blokira.

nlokada za pisanje može se zadati sa opcijom low_priority (nizak prioritet). U sva­kon! sistemu koji omogućava blokiranje tabela, uključujući i MySQL, neophodna su pr.1v1Ll koja određuju ko će u slučaju sukobljenih zahteva moći prvi da postavi blokadu. MySQL obično daje veći prioritet zahtevima za blokade radi pisanja da bi omogućio da mncnc uskladištenih podataka budu obavljene što pre. Ako vam takvo ponašanje ne odgov:mt, možete zahtevati blokadu za pisanje niskog prioriteta kao što smo uradili "·' tabel u othertable u prethodnom primeru. Međutim, postoji začkoljica. Kad god :t.illtcvatc blokadu tabele, može se dogoditi da morate sačekati da ona bude odobrena.

H<~n~čiKtiOnl moae1 1nn on

Blokada niskog prioriteta biće odobrena samo ako nema nijedne druge niti koja je zahtevala blokadu za čitanje ili pisanje u toj tabeli. Međutim, ako je server veoma opte­rećen, takva situacija se možda nikad neće dogoditi.

Verovatno nećete često ručno upravljati blokadama na ovakav način, ali postoje izvesni razlozi zbog kojih biste to ipak učinili. Ako imate aplikaciju koja treba da obez­bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu­čajevima, može biti isplativije da koristite brze tabele koje ne podržavaju transakcije i da ručno postavljate blokade da biste rešili problem nemogućnosti transakcione obrade.

Još jedan čest slučaj u kojem ćete izdavati komande LOCK TABLES jeste kada direktno manipulišete MySQL-ovim datotekama s podacima. Na primer, ako želite da obezbedite da sadržaj datoteka na disku ostane usklađen i nepromenjen dok pravite njihove rezervne kopije, morate zaključati te datoteke.

Najvažnije što treba da zapamtite u vezi sa zaključavanjem podataka jeste da morate što pre ukinuti sve blokade koje ste postavili inače će drugi sistemi i korisnici morati da vas čekaju. Imajte u vidu da neki poslovi za čije obavljanje ćete postavljati blokade, kao što su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri­lično dugo.

Transakcioni model lnnoDB Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-više iste ciljeve ali uz primenu različitih pristupa problemu. Da bi izolovao transakcije jedne od drugih, InnoDB primenjuje zaključavanje podataka na nivou reda tabele. To znači da se različite transakcije mogu odvijati nad sadržajem iste tabele u isto vreme, pod uslovom da samo čitaju tabelu ili da ne menjaju iste redove kada upisuju podatke.

Nepotvrđene izmene sprečavaju da druge niti pristupaju samo redovima na koje deluje tekuća transakcija, ali ne i celoj tabeli. Zahvaljujući toj osobini, InnoDB obezbe­đuje visoke performanse uz prednosti koje biste očekivali od jednog savremenog sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste usklađenost s gru­pom pravila ACID.

Usklađenost sa ACID pravilima Važan pojam iz terminologije baza podataka koji još nismo definisali jeste ACID. To je akronim od engleskih reči Atomicity, Consistency, Isolation i Durability (nedeljivost, usklađenost, izolovanost i trajnost). Mnogima smeta činjenica da pri korišćenju MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele, MySQL je usklađen sa ACID pravilima.

Atomicity (nedeljivost) znači da je svaka transakcija nedeljiva celina. U bazu poda­taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U slučaju spoljne greške, jasno je da bi bilo savršeno kada bi postupak obnavljanja baze podataka bio u stanju da dovrši sve transakcije koje su bile započete u trenutku greške; među­tim, prihvatljivo je i da te transakcije budu poništene.

Page 81: Prirucnik Za MySQL

Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Consistency (usklađenost) znači da svaka operacija nad podacima treba da prebaci bazu podataka iz jednog ispravnog stanja u drugo ispravno stanje. N~ sme biti "među­stanja" u kojima podaci nisu potpuno usklađeni. Osim toga, trebalo b1 da baza pvodataka sprečava operacije koje narušavaju usklađenost podataka. Ako u baz1 podataka :u vate bankovne račune koji pripadaju klijentima banke, ne b1 trebalo da bude moguce da neko otvori račun koji pripada nepostojećem klijentu, niti bi trebalo dozvoliti brisanje klijenta iz tabele klijenata ukoliko u tabeli računa ima računa koji mu pripadaju ....

Isolation (izolovanost) znači da transakcije ne deluju jedna na drugu dok se odviJaJU. Svaka transakcija vidi svet oko sebe kao da je jedina koja čita i menja podatke.~ stvar~ nosti to nije uvek tako, ali se pomoću blokada može postići takav priv1d. U zav1snost1 od načina podešenosti baze podataka i opcija koje upotrebite, u praksi ćete imati raz­ličite nivoe izolovanosti. (Opširnije objašnjenje naći ćete u sledećem odeljku.)

Durability (trajnost) znači da izmene koje je transakcija načinila a prosleđene su bazi podataka, treba da postanu trajne. Ovaj uslov se može lako ispuniti u jednostavn~~ programu, ali u složenom sistemu za upravljanje relacionim bazama podataka, kojl zaključava podatke i održava više verzija istih podataka u isto vreme, problem se pret­vara u pravo "minsko polje". Osim toga, trajnost znači i to da bi u slučaju kvara trebalo da postoji mogućnost povratka baze podataka u tekuće stanje. Ako se pres~~nak napa­janja, kvar diska ili druga katastrofa dogodi između trenutka u kojem J~ klljentski pro­gram poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI mogućnost da se, pomoću kombinacije rezervnih ko~ija baze podat~ka 1 dnev~1ka . transakcija, baza podataka vrati u stanje pre kvara, pa cak 1 da se dovrse transakciJe koje

su bile započete ali ne i potvrđene. Ako koristite Inn oD B tabele (ili Berkeley DB tabele), MySQL je usklađen sa ACID

pravilima. Nedeljivost je obezbeđena upotrebom sinta~se za trans.a~cije. Transakcije i spoljni ključevi obezbeđuju usklađenost podataka. Mozete podes1~1 mvo 1Zolovanost1 transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka ob~z­beđuju trajnost izmena. (Replikovanje omogućava izgradnju sistema s vrlo v1sokun

stepenom trajnosti bez ijedne neusklađenosti.)

Izolovanost transakcija InnoDB tabele mogu da se rade s četiri nivoa izolovanosti transakcija. Redosledom od

najjačeg ka najslabijem, to su sledeći:

• Serializable (transakcije se serijalizuju) • Repeatable read (podaci su ponovljivi pri svakom čitanju) • Read committed (dozvoljava se čitanje podataka iz potvrđenih transakcija)

• Read uncommitted (dozvoljava se čitanje podataka iz nepotvrđenih transakcija)

Kao i u mnogim drugim slučajevima, morate napraviti kompromis između robu-

snesti i performansi.

l ransakciOni model lnnoDB

Nivo izolovan osti serializable je savršen gledano iz ugla usklađenosti i robusnosti izme~~ podat~a. S ti~ ~ivoom izlov~osti , čitanje podataka i njihove izmene odvijaju se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego što b.u~e dozvoljeno sledeće čitanje istog podatka. Transakcije ne moraju da se uvek ?dVIJaJU bez međusobnog preplitanja da bi se dobio privid serijalizovanih transakcija Jer su mnoge potpuno nezavisne jedna od druge, ali ako dve transakcije deluju na iste podatke u isto vreme, one će biti serijalizovane. Pošto u tom slučaju mora doći do z~klju.čavanja podataka i čekanja na njih, kombinovano s obavezom ispitivanja i pred­viđanp koje se transakcije međusobno prepliću, konačan rezultat je to da je nivo izo­lovanosti serializable naj sporiji način transakcione obrade. Ako želite da radite s tim nivoom izolovan osti, komanda je sledeća:

se t transaction isolation level serializable;

Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadržaj k;o na početku transakcije. Garantuje se da je čitanje reda ponovljivo, tj. da se iz istog reda svaki put učitavaju isti podaci. Ako na početku transakcije pozovete

select * from account where number=l;

a zatim isti upit ponovo izvršite kasnije u transakciji, oba puta dobićete isti rezultat. Međutim, možete dobiti i ono što se zove jm1tomski podaci (engl. phantom reads). Može se dogoditi da druga transakcija koja se završi pre vaše doda nove redove u tabelu.Ako dvaput izvršite isti upit koji sadrži određeni uslov, kao sledeći

select * from account where balance>lOOO;

može se dogoditi da pri drugom čitanju dobijete nove redove - fantomske redove -kojih nije bilo prvi put.

Trebalo bi da u praksi vrlo retko naiđete na fantomske podatke u MySQL-u. lnnoDB rešava problem pomoću algoritma nazvanog blokiranje sledećeg ključa (engl. 11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana. Verovatno već znate da InnoDB primenjuje zaključavanje podataka na nivou redova. ~ad~ se transakcija odnosi na određeni red tabele, taj red se zaključava da bi transakcija bila Izolovana od drugih. Osim zaključavanja redova na koje se transakcija odnosi, ,tlgoritam blokiranja sledećeg ključa blokira i razmake između redova koje nađe u tndeksu. Pošto se problem fantomskih podataka rešava na taj način, nivo izolovanosti wrializ able moraćete da koristite samo u malom broju sistema .

_Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo više nece b1t1 ~asv1m 1z~~ovane. Ako izvršite neki upit, a zatim ga kasnije u transakciji pono­VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u međuvremenu izmenila podatke i prenela izmene u bazu. Ako vam baš to odgovara, komanda je sledeća

Hl'L transaction isolation level read committed;

Page 82: Prirucnik Za MySQL

2 Poglavlje 1 O Upotreba transakCIJa u lnnouts taoe1ama

Pri korišćenju najnižeg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja­da li su transakcije izolovane i usklađene, pa prema tome, ne krše ACID pravila, i da li se uopšte može pričati o transakcijama. U ovom režimu rada, transakcije mogu da čitaju izmene koje su druge transakcije načinile a da te izmene još nisu potvrđene (prenete u bazu podataka). To se zove čitanje prljavih podataka (engl. dirty reads) i može sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da će sve aktivne niti samo čitati ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read uncommitted, upotrebite sledeću komandu:

set transaction isolation level read uncommitted;

Tabela 10.1 prikazuje osobine svakog nivoa izolovanosti.

Tabela 10.1 Osobine nivoa izolovanosti transakcija

Prljavi podaci

Read Uncommitted Mogući

Read Committed Nisu mogući

Repeatable Read Nisu mogući

Serializable Nisu mogući

Sažetak

Neponovljivi podaci

Mogući

Mogući

Nisu mogući

Nsu mogući

Fantomski podaci

Mogući

Mogući

Mogući (ali malo verovatni)

Nisu mogući

• Transakcija je grupa SQL upita koja se obrađuje kao nedeljiva celina. Izvršava se u potpunosti ili se poništava u potpunosti.

• Standardna SQL-ova sintaksa za definisa~e transakcije izgleda ovako start transaction; # do work commit;

ali postoji i više drugih ekvivalentnih načina da se postigne isti rezultat.

• ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost, usklađenost, izolovanost i trajnost). Trebalo bi da zapamtite šta ove reči znače inače drugi zaluđenici za računare neće hteti da razgovaraju s vama.

• Redosledom od najjačeg ka najslabijem, nivoi izolovanosti transakcija su sledeći: serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u Inn o DB tabelama je repeatable read.

Pitanja l. Ako je režim autocommit isključen, transakcija će biti potvrđena

a) kada se izda komanda COMMIT

b) kada se zahteva blokada tabele

e) i a) i b)

d) ni u jednom od navedenih slučajeva

2. Nedeljivost transakcije znači sledeće:

a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava

b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo

e) transakcije ne utiču jedna na drugu

d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne

3. Izolovanost transakcije znači sledeće:

a) se izvršavaju sve operacije koje transakcija zahteva ili se nijedna ne izvršava

b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo

e) transakcije ne utiču jedna na drugu

d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne

4. Trajnost transakcije znači sledeće:

a) izvršavaju se sve operacije koje transakcija zahteva ili se nijedna ne izvršava

b) operacije prebacuju bazu podataka iz jednog usklađenog stanja u drugo

e) transakcije ne utiču jedna na drugu

d) izmene koje su načinile potvrđene transakcije treba da ostanu trajne

5. U režimu ponovljivog čitanja može se dogoditi da

Vežbe

a) učitate prljave podatke

b) učitate neponovljive podatke

e) učitate fantomske podatke

d) nijedno od prethodnog

Dokumentacija za MySQL/InnoDB sadrži mnogo saveta za poboljšanje performansi sistema kada se koriste InnoDB tabele. Primenite što veći broj na svoj sistem.

Možete početi od ovog mesta:

www.innodb.com/ibman.html#InnoDBTuning

Na serveru koji nije previše važan za poslovanje firme, srušite MySQL dok ste usred neke transakcije. Nije neophodno da gurnete kućište čvrstih diskova s velike visine, niti da iščupate kabi za napajanje iz utičnice. Dovoljno je da prekinete rad MySQL-ovog procesa. Pregledajte sadržaj dnevnika izmena i posmatrajte šta se događa kada ponovo pokrenete server.

Page 83: Prirucnik Za MySQL

154 Poglavlje 10 Upotreba transakcija u lnnoDB tabelama

Odgovori

Pitanja l. e

2. a

3. e

4. d

5. e

U sledećem poglavlju U poglavlju ll razmotrićemo MySQL-ov složen sistem upravljanja pravima korisnika . Na raspolaganju je bogat izbor mogućnosti za moć koju ćete dati korisnicima baze podataka. U tom poglavlju savladaćete postojeće opcije i načine na koje se njima upravlja.

v Administriranje MySQL-a

11 Upravljanje pravima korisnika

12 Podešavanje MySQL-a

13 Administriranje baze podataka

14 Izrada rezervnih kopija i obnavljanje podataka

15 Zaštita MySQL servera

16 Replikovanje baze podataka

Page 84: Prirucnik Za MySQL

11 Upravljanje pravima korisnika

J EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov složen sistem prava korisnika. U ovom poglavlju bavićemo se pravljenjem korisničkih naloga, pravima koja su na raspolaganju i načinom na koji su ta prava predstavljena u MySQL-ovim l<lbelama. Razmotrićemo sledeće teme:

• Pravljenje korisničkih naloga pomoću komandi GRANT i REVOKE

• Nivoi korisničkih prava

• Tabele prava

Pravljenje korisničkih naloga pomoću komandi GRANT i REVOKE Prava za pristup podacima dodeljuju se korisničkim nalozima pomoću komande GRANT,

n ukidaju se pomoću komande REVOKE. To su standardne SQL-ove komande koje možete izvršiti na isti način kao i bilo koju drugu komandu navedenu u ovoj knjizi. Svi podaci o korisnicima MySQL-a i njihovim pravima pristupa čuvaju se u MySQL-ovoj bazi podataka, potpuno isto kao i podaci s kojima rade aplikacije koje ste vi napravili.

Da biste mogli da izvršavate komande koji se pominju u ovom odeljku, potreban vam je određen nivo prava za pristup podacima. Ako ste sami instalirali MySQL, imate pristup nalogu root, pa prema tome i odgovarajući nivo prava. Ako MySQL koristite na računaru koji neko drugi administrira (kao što je računar na poslu ili iznaj­mljeni računar), možda nemate odgovarajući nivo prava da biste izvršavali te upite. U tom slučaju, dobićete poruku o grešci nalik na sledeću:

ERROR 1045: Access denied for user: 'laura®127.0.0.1' (Using pass­word: YES)

Dodeljivanje prava Najpre ćemo razmotriti komandu GRANT, koja omogućava da pravite nove korisničke naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk­cija mn. Pogledajte sledeći primer:

gran l liU (e

Page 85: Prirucnik Za MySQL

158 Poglavlje 11 Upravlj anje pravima korisn ika

Ova komanda fomura nalog za korisnika čije je ime l uke kada on pokuša da se pri­javi na MySQL server s računara localhost. Tom nalogu dodeljuje lozinku (reč lozinka, koju je vrlo teško pogoditi - razume se, vi ćete zadati nešto bolje!). Reč usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage znači da korisnik može samo da se prijavi na server i ništa više. U odredbi ON zadajemo objekte na koje se odnose prava koja dodeljujemo korisniku. Budući da korisniku dodeljujemo samo pravo da se prijavi na server, ta odredba je u ovom slučaju izlišna.

Opšti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, sledeći:

GRANT vrsta_prava [(lista_kolona)] [, vrsta_prava [(lista_kolona)] ... ] ON {ime_tabele l * l *.* l ime_baze.*} TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']

[, ime_korisnika [IDENTIFIED BY 'lozinka'] . .. ] [REQUIRE

NONE l [{SSLI X509}] [CIPHER način_šifrovanja [AND]] [ISSUER davalac_sertifikata [AND]] [SUBJECT subjekt]]

[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l MAX_UPDATES_PER_HOUR # l MAX CONNECTIONS_PER_HOUR #]]

U odredbi GRANT treba da navedete prava koja dodeljujete. Koja sve prava postoje, saznaćete u narednom odeljku . Neka prava su globalna (odnosno, važe za sve baze podataka na serveru), dok druga važe samo za određene objekte (baze podataka, tabele ili pojedine kolone tabela).

U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete. To može biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim tabelama (oblik ime_baze. *). Umesto imena objekta, možete zadati i *. *, što ozna­Čava sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete važe samo za tekuću otvorenu bazu podataka. Ako nije otvorena nijedna baza poda­taka, prava se dodeljuju kao da ste zadali *. * u odredbi ON.

U odredbi TO treba da navedete korisnika kome dodeljujete prava. Ako taj korisnik već ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL će ga napraviti . U ovoj odredbi možete zadati više od jednog korisnika te imena računara s kojih se mogu prijavljivati, na primer, fred®localhost. Ako imate teškoća pri prija­vUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite i ime računara s kojeg se prijavljujete. Ime MySQL-ovog korisničkog naloga ne mora biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime kori­snika može sadržati najviše 16 znakova.

Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova lozinka postojećem korisniku.

Korisnici mogu da menjaju svoje lozinke pomoću komande:

seL password = password('novalozinka');

Korisnikovu lozinku možete izmeniti ako izdate komandu, na primer,

set password for fred®localhost = password('novalozinka');

Da biste to uradili, morate imati pristup bazi podataka mysql.

Nivoi prava

Odredba WITH GRANT OPTION je specijalno pravo koje korisniku omogućava da svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne možete da dodeljujete prava drugim korisnicima, razlog je to što vam nedostaje ovo pravo. Osim toga, dru­gom korisniku ne možete dodeliti pravo koje sami nemate.

Odredbu WITH možete upotrebiti i da biste po satu ograničiti broj izvršenih upita, unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih parametara je nula, što znači da nema ograničenja.

Odredba REQUIRE omogućava da zahtevate da se korisnik prijavljtije isključivo putem zaštićene veze . Da biste mogli daje koristite, moraćete da podesite MySQL na odgovarajući način. To ćemo podrobnije razmotriti u poglavlju 15, "Zaštita MySQL

" servera .

Nivoi prava Prava koja možete dodeliti pomoću komande GRANT dele se u dve osnovne kategorije: prava za obične korisnike i prava za adnunistratore.

Prava za ob i čne korisn ike Prava za obične korisnike pobrojana su u tabeli 11.1.

Ta be la 11 .1 Prava za obične korisnike

Pravo Značenje

CREATE Korisniku je dozvoljeno pravljenje tabela.

CREATE TEMPORARY TABLES Korisniku je dozvoljeno prav ljene privremenih tabela. DELETE

EXECUTE

INDEX

INSERT

LOCK TABLES

SELECT

SHOW DATABASES

UPDATE

USAGE

Prava za administratore

Korisniku je dozvoljeno da briše redove iz tabela.

Korisniku je dozvoljeno da izvršava procedure.

Korisniku je dozvoljeno da pravi indekse.

Korisniku je dozvoljeno da umeće nove redove u table.

Korisniku je dozvoljeno da zaključava tabele.

Korisniku je dozvoljeno da učitava redove.

Korisniku je dozvoljeno da izdaje komandu SHOW DATABA­SES da bi dobio listu baza podataka koje postoje na serveru.

Korisniku je dozvoljeno da ažurira podatke.

Korisniku je dozvoljeno da se prijavi na server, ali osim toga, ne može da radi ništa drugo.

U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3 . Neka među njima možete dodeliti i određenim korisnicima, ako procenite da bi to bilo ispravno, ali nijedno od tih prava ne treba da se podrazumeva za obične korisnike.

Page 86: Prirucnik Za MySQL

Poglavlje 11 Upravljanje pravima korisnika

Tabela 11.2 Prava za administratore

Pravo Značenje

ALL Korisnik ima sva prava osim WITH GRANT OPTION.

ALTER Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo možete dodeliti korisnicima koji imaju dovoljno stručnog znanja, ali budite oprezni pri tome jer se može (zlo)upotrebiti i za promenu sadržaja tabela prava.

DROP Korisniku je dozvoljeno da briše tabele. Ovo pravo možete dodeliti korisnicima u koje imate dovoljno poverenja.

FILE Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili menja sadržaj druge datoteke. Ovo pravo takođe možete dodeliti korisnicima u koje imate dovoljno poverenja. Pazite se korisnika koji pokušavaju da proslede podatke u datoteku koju slobodno izaberu, kao što je /etc/passwd ili slična datoteka!

PROCES S Korisniku je dozvoljeno da prikaže listu svih procesa- tj. da vidi sve tekuće procese koje MySQL izvršava.

RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda ima više namena. U nastavku ovog poglavlja razmotrićemo komandu FLUSH PRIVILEGES, a komandom FLUSH bavićemo se detaljnije u poglavlju 13.

REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni serven.

REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na zavisnom serveru.Više informacija o tome naći ćete u poglavlju 16.

SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin shutdown.Više informacija o tome naći ćete u poglavlju 13.

SUPER Korisniku je dozvoljeno da se prijavljuje na server čak i kada je s MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih veza i može da izvršava komande CHANGE MASTER, KILL (thread) , mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL.

WI TH GRANT OPTION Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam 1ma.

Postoji još jedno pravo koje se zove REFERENCES. Rezervisano je za buduću upo­

trebu i mada ga možete dodeljivati, zasad nema nikakvog efekta.

Utvrđivanje ukupnih prava Pomoću komande GRANT možete dodeliti prava na četiri nivoa:

• Globalna prava koja važe za sve baze podataka na serveru. Zadaju se pomoću niza znakova*.* u komandi GRANT. Na primer:

grant all on*.* to fred;

• Prava koja važe samo za određenu bazu podataka. Zadaju se izrazom

irne_ba z e . * u komandi GRANT:

q n mL a ll on empl oy ee .* to fred;

.............. ,., ..... .

• Pravo pristupa određenoj tabeli. Dodeljuje se tako što se navede ime te tabele u komandi GRANT: grant select on department to fred;

• Prava pristupa određenoj koloni. Dodeljuje se tako što se zada ime kolone u odredbi GRANT komande GRANT. Na primer:

grant select (employeeiD) on employee to fred;

Kada utvrđuje da li korisnik ima pravo da izvrši određeni posao, MySQL kombi­

nuje pomoću operatora OR korisnikova globalna prava, prava koja ima za bazu poda­

taka, prava koja ima za tabelu i prava koja ima za kolonu.

Upotreba komande REVOKE Komanda REVOKE suprotna je komandi GRANT i služi za ukidanje prava koja korisnik

ima. Na primer:

revoke all on employee.* from fred;

Opšti oblik komande revoke izgleda ovako:

REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l ... l ON {irne_tabele l * l *·* l ime_baze.*} FROM ime korisnika [, ime_korisnika ... l

Kao što vidite, odredbe su u suštini iste kao u komandi GRANT i omogućavaju uki­

danje odgovarajućih prava.

Tabele prava Podaci koje menjate pomoću komandi GRANT i REVOKE čuvaju se u bazi podataka koja se zove mysql. Umesto pomoću komandi GRANT i REVOKE, tabele u toj bazi podataka

možete me~ati i direktno, ukoliko tačno znate šta treba da uradite. Osim toga, podatke iz tih tabela možete i da učitavate da biste lakše rešili probleme u vezi s pra­

vima ukoliko se pojave.

Ako sadržaj tih tabela menjate direktno, morate izdati komandu

flush privileges;

da bi izmene počele da važe.

U bazi podataka mysql nalazi se šest tabela:

• user • tables_priv

• db • columns_priv

• host • func

Prvih pet tabela koristi se za čuvanje podataka u vezi s pravima korisnika. (U tabeli

func skladište se podaci koji se tiču funkcija koje korisnici pišu, ali to je tema koja izlazi izvan okvira ove knjige.)

Page 87: Prirucnik Za MySQL

t"091CIVIjt: ll Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d

Prve tri tabele- user, db i host -koriste se kada se utvrđuje da li imate pravo pri­stupa bazi podataka. Svih pet tabela se koristi kada se utvrđuje imate li pravo da

izvršite određenu komandu.

Tabela user Tabela user sadrži podatke o globalnim pravima korisnika.

Ova tabela ima sledeće kolone:

• Kolone za opseg vidljivosti Na osnovu sadržaja ovih kolona utvrđuje se koji red treba učitati. Ovoj grupi pripadaju sledeće kolone:

Host: Ime računara s kojeg korisnik uspostavlja vezu

user: Ime korisnika

Password: Korisnikova lozinka, u formatu šifrovanom pomoću funkcije

PASSWORD ()

• Kolone za prava Svaka kolona odgovara jednom globalnom pravu i može sadržati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo­balno pravo). Ovoj grupi pripadaju sledeće kolone:

Select_priv

Insert _pri v

Update_priv

Delete _pri v

Index _pri v

Alter _pri v

Create_priv

Drop _pr iv

Grant _pri v

References _pri v

Reload_priv

Shutdown_priv

Process_priv

File _pri v ' i' 'shOW'_ db _pri v

Super _pr iv

Create_tmp_table_priv

Lock_tables_priv

Execute _pr iv

Repl_slave_priv

Repl_client_priv

• Kolone za uspostavljanje zaštićene veze Odgovaraju podacima koji se zadaju u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju sledeće kolone:

ssl_type ssl_cypher x509_issuer x509_subject

• Kolone za ograničavanje upotrebe resursa Sadrže podatke o eventualnim ograniče­njima upotrebe određenih resursa koje zadajete na kraju komande GRANT. Ovoj

grupi pripadaju sledeće kolone:

max_ questions max_updates max_ connections

Tabela db U ovoj tabeli čuvaju se podaci o pravima korisnika za pojedine baze podataka. Tabela se sastoji od sledećih kolona:

• Kolone za opseg vidlj'ivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji red treba učitati. Ako imate različita pravila za različite računare, ostavite polje host prazno, a u tabeli host dodajte odgovarajuću grupu redova da biste obezbe­dili detaljnije podatke. Ovoj grupi pripadaju sledeće kolone:

Host Db User

• Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host, Db i User. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za prava su sledeće:

Select_priv

Insert _pr iv

Update_priv

Delete _pri v

Index _pri v

Alter _pri v

Tabela host

Create _pri v

Drop _pri v

Grant_priv

Create_tmp_table_priv

Lock_tables_priv

MySQL pretražuje tabelu host kad god naiđe na prazno polje u tabeli db. Takvo ponašanje ne možete zadati komandom GRANT, ali možete ga ručno podesiti. Tabela ima sledeće kolone:

• Kolone za opseg vidljivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji red treba u čitati. Svaki red u ovoj tabeli sadrži podatke o jednoj bazi podataka kojoj se pristupa s jednog računara. Ovoj grupi pripadaju sledeće kolone:

Host Db

• Kolone za prava Njihov sadržaj određuje koja sve prava ima kombinacija Host i Db. Ove kolone takođe mogu sadržati samo vrednosti Y ili N. Kolone za prava su sledeće:

Select _pri v

Insert_priv

Update_priv

Delete_priv

Index _pr iv

Alter _pri v

Create _pri v

Drop _pr iv

Grant_priv

Create_tmp_table_priv

Lock_tables_priv

Page 88: Prirucnik Za MySQL

ou-.

Tabela tables_priv U tabeli tables_priv čuvaju se podaci o pravima koje korisnici imaju za pojedine tabele. Ova tabela ima sledeće kolone:

• Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U ovom slučaju imamo i kolonu Table_name, koja sadrži podatke o tabeli na koju se pravo odnosi. Kolone za opseg vidljivosti su sledeće:

Host Db User Table name

• Kolone o dodeli Čuvaju podatke o tome ko je i kada dodelio pravo. Ovoj grupi pripadaju sledeće kolone:

Gran tor Time stamp

• Kolona Table_priv Čuva podatak o pravu koje je dodeljena kombinaciji Host/Db/User za tabelu navedenu u koloni Table_name. Kolona može sadržati jednu iz skupa sledećih vrednosti: Select, Insert, Update, Delete, Create, Drop, Grant, References, Index i Al ter.

• Kolona Column _pri v Čuva podatak o pravu koje korisnik ima za sve kolone tabele. Može sadržati jednu iz skupa sledećih vrednosti: Select, Insert, Update

i References. Ako je ova kolona prazna, MySQL će potražiti u tabeli columns_priv detaljnije podatke o tome šta jeste a šta nije dozvoljeno u kolonama tekuće tabele.

Tabela columns_priv U tabeli columns _pri v čuvaju se podaci o pravima korisnika za pojedine kolone. Tabela ima sledeće kolone:

• Kolone za opseg vidlj"ivosti Na osnovu njihovog sadržaja, MySQL utvrđuje koji red treba učitati. Ovoj grupi pripadaju sledeće kolone:

Host Db User Table name Column_name

• Kolona column _pri v Čuva podatak o pravu dodeljenom kombinaciji vrednosti navedenoj u kolonama za opseg vidljivosti. Može sadržati jednu iz skupa sle­dećih vrednosti: Select, Insert, Update i References.

• Kolo/la Time stamp Pokazuje kad je pravo bilo dodeljena.

Sa ela

Sažetak

GRANT i REVOKE • Komanda GRANT omogućava da korisniku dodelite prava pristupa ili da napravite

nov korisnički nalog. Format komande je sledeći:

GRANT vrsta_prava [ (lista_kolona) J [, vrsta_prava [ (lista_kolona) J ... ] ON {ime_tabele l * l *.* l ime_baze.*) TO ime_korisnika [IDENTIFIED BY [PASSWORD] 'lozinka']

[, ime_korisnika [IDENTIFIED BY 'lozinka'] ... ] [REQUIRE

NONE l [{SSLI X509}J

[CIPHER način_§ifriranja [AND]] [ISSUER davalac_sertifikata [AND]] [SUBJECT subjekt]]

[WITH [GRANT OPTION l MAX_QUERIES_PER_HOUR # l MAX_UPDATES_PER_HOUR # l MAX_CONNECTIONS_PER_HOUR #JJ

• Komanda REVOKE ukida prava dodeljena korisniku. Format komande je sledeći: REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) J ... ] ON {ime_tabele l * l *.* l ime_baze.*) FROM ime_korisnika [, ime_korisnika ... ]

Prava • Prava se mogu dodeljivati korisnicima pojedinačno.

• Ovo su prava namenjena običnim korisnicima:

CREATE

CREATE TEMPORARY TABLES

DELETE

EXECUTE

INDEX

INSERT

LOCK TABLES

SELECT

SHOW DATABASES

UPDATE

U SAGE

• Ovo su prava name~ena administratorima:

ALL REPLICATION CLIENT ALTER

DROP

FILE

PROCES S

RE LOAD

REPLICATION SLAVE

SHUTDOWN

SUPER

WITH GRANT OPTION

Page 89: Prirucnik Za MySQL

G Poglavlje 11 Upravljanje pravima korisnika

Tabele prava • Podatke o korisničkim nalozima i njihovim pravima MySQL čuva u bazi poda­

taka mysql.

• Postoji pet tabela prava.

• U tabeli user čuvaju se imena korisnika, njihove lozinke i podaci o globalnim pravima .

• U tabeli db čuvaju se podaci o pravima za pojedine baze podataka.

• U tabeli host čuvaju se podaci o tome kojoj se bazi podataka s kojeg računara može pristupati.

• U tabeli tables _pri v čuvaju se podaci o pravima za pojedine tabele.

• U tabeli columns_priv čuvaju se podaci o pravima za pojedine kolone u tabelama.

Pitanja l . Pravo GRANT OPTION omogućava korisniku da

a) učitava podatke iz datoteke

b) drugima dodeljuje prava koja sam ima

e) se prijavljuje na server, ali ništa više

d) izdaje komandu FLUSH

2. Pravo USAGE omogućava korisniku da

a) učitava podatke iz datoteke

b) drugima dodeljuje prava koja sam ima

e) se prijavljuje na server, ali ništa više

d) izdaje komandu FLUSH

3. Pravo RELOAD omogućava korisniku da

a) učitava podatke iz datoteke

b) drugima dodeljuje prava koja sam ima

e) se prijavljuje na server, ali ništa više

d) izdaje komandu FLUSH

4. Pravo FILE omogućava korisniku da

a) učitava podatke iz datoteke

b) drugima dodeljuje prava koja sam ima

e) se prijavljuje na server, ali ništa više

d) izdaje komandu FLUSH

U sledećem po!Jiavl u

5. Podatak u koloni tables_priv.table_priv

a) opisuje pravo koje korisnik ima za tu tabel u u obliku jedne iz skupa vrednosti

Vežbe

b) ima vrednost Y ili N kada je korisniku dozvoljen pristup toj bazi podataka

e) opisuje jedno od prava koje korisnik ima za tu tabel u

d) pokazuje da li za tu tabelu postoji odgovarajući red u tabeli columns_priv

l. Napišite komandu GRANT koja pravi korisnički nalog bill, čija je lozinka secret i kome je dozvoljeno da učitava podatke iz tabele department, ažurira ih, dodaje u tabelu i briše iz ~e.

2. Napišite komandu REVOKE koja ukida prava tog korisnika.

Odgovori

Pitanja l. b

2. e

3. d

4. a

5. a

Vežbe l.

2.

grant select, update, insert, delete on employee.department to bill®localhost identified by 'secret';

revoke select, update, insert, delete on employee.department from bill;

U sledećem poglavlju U sledećem poglavlju, "Podešavanje MySQL-a", razmotrićemo mnogobrojne opcije za podešavanje MySQL-a.

Page 90: Prirucnik Za MySQL

12 Podešavanje MySOL-a

U OVOM POGLAVLJU nadovezujemo se na kratak uvod u podešavanje MySQL-a iz poglavlja l, "Instaliranje MySQL-a". Razmotrićemo razne opcije za podešavanje MySQL servera, s posebnim osvrtom na internacionalizovanje servera.

Obradićemo sledeće teme:

• Podešavanje MySQL-ovih konfiguracionih opcija

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

• Internacionalizovanje

Podešavanje MySQL-ovih konfiguracionih opcija Kao što ste iz dosadašnjeg čitanja ove knjige saznali, mnogi programi za rad s MySQL­-om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji, ali u mnogim slučajevima možete ih zadati i u obliku datoteke opcija. U istoj datoteci opcija možete zadati vrednosti opcija za komandne linije više programa za rad s MySQL-om, kao što su mysql, mysqladmin, mysqld, mysqld_safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack.

Prednost upotrebe datoteke opcija jeste to što vam omogućava da na jednom mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL podržava i upotrebu zasebnih datoteka opcija koje važe za ceo server i za pojedinačne korisnike.

Rešenje s datotekama opcija naročito je pogodno kada upravljate s više servera. Ako svi serveri imaju istu konfiguraciju, što je čest slučaj kada se primenjuje replika­vanje, možete koristiti istu konfiguracionu datoteku za svaki server.

Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada ćemo ih ponovo razmotriti, ali opširnije. Datoteku ili datoteke opcija naći ćete u direktorijumima navedenim u nastavku teksta.

Kada je MySQL instaliran na Windowsu, datoteku opcija možete smesti ti u sistem­ski direktoriju m Windowsa i nazvati je my. ini, a možete je smesti ti i u kore nski din:ktorijulll diska na koji je instaliran server (na primer, C :\) i nazvati my. cnf. To j~: glob.dn.t d.tlnlt·~ .1 opcija tj. vrednosti opcija u njoj vah• 1'<1 sve korisnike serv~.:r,t

Page 91: Prirucnik Za MySQL

170 Poglavlje 12 Podešavanje MySQL-a

Kada je MySQL instaliran na Unixu, možete imati jednu globalnu datoteku opcija, po jednu datoteku opcija za svaki MySQL server instaliran na računaru i po jednu datoteku opcija za svakog korisnika. (Na jednom fizičkom računaru može raditi istovremeno više MySQL servera, što je objašnjeno u nastavku ovog poglavlja.)

Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za pojedine korisnike nalaze se u matičnom direktorijumu svakog korisnika. Imajte u vidu da imena datoteka opcija za korisnike imaju prefiks tačku- tj. ime datoteke je

.my.cnf a ne my.cnf. Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer

sintakse za tu vrstu datoteka. Njen sadržaj ponovo prikazujemo u listingu 12.1.

Listing 12.1 Primer datoteke opcija my.cnf

[mysqld] # binarno beleženje i beleženje sporih upita log-bin log-slow-queries

# podešavanje za InnoDB tabele # ovo je osnovna datoteka opcija predložena u dokumentaciji. # Datoteke za podatke treba da omoguće # skladištenje podataka i indeksa. # obezbedite dovoljno slobodnog # prostora na disku. innodb_data_file_path = ibdatal:lOM:autoextend # podesite veličinu rezerve za bafere na # so-so% količine memorije # na računaru set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=lOM # podesite veličinu dnevnika na približno # 25% veličine rezerve za bafere set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=BM # podesite .. flush_log_at_trx_commit # na o ako možete da prihvatite gubljenje u nekoliko poslednjih transakcija innodb_flush_log_at_trx_commit=l

Pogledajmo format ove datoteke. Prvi red u datoteci je

[mysqld]

To znači da su opcije navedene iza ovog reda namenjene programu mysqld. Ako želite da zadate opcije za drugi program, navedite njegovo ime na početku grupe opcija. Imc mora biti napisano unutar uglastih zagrada.

ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll upnJA

Na isti način kao što zadajete opcije za pojedine programe, možete zadati i grup11 opcija [client], koje će važiti za sve programe.

Redovi koji počinju znakom # su komentari . Postoje tri oblika sintakse za zadavanje vrednosti opcija:

• Možete navesti ime opcije koju želite da uključite; na primer: log-bin

Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije.

• Možete navesti ime opcije i vrednost koju joj dodeljujete; na primer: innodb_flush_log_at_trx_commit=l

• Možete navesti ime opcije i do deli ti joj vrednost pomoću sintakse set -vari a­ble; na primer: set-variable = innodb_log_buffer_size=BM

Treći oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Pošto ćete nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da znate šta on znači. Na primer, to je slučaj s primerom datoteke my. cnf, koju smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija za lnnoDB.

Neke opcije koje određuju kako će se koristiti datoteke opcija važe za sve programe:

• --no-defaults znači da nema datoteka opcija čiji bi sadržaj trebalo učitati.

• - -print-defaults prikazuje sve vrednosti opcija koje važe za tekući program.

• --defaults-file=/putanja/do/datoteke nalaže programu da koristi zadatu datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena konfiguracije.

• --defaults-extra-file=/putanja/do/datoteke učitaće navedenu datoteku nakon učitavanja globalne datoteke opcija, ali pre učitavanja datoteka opcija za pojedinačne korisnike.

Opcije za mnoge programe koje možete podesiti pomoću datoteka opcija opisane su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmo­trićemo najvažnije i najkorisnije opcije za komandnu liniju programa MySQL server.

Opcije za program mysqld Naredna lista opcija nije potpuna, a svrha joj je da predoči najčešće korišćene opcije za mysqld. Svaka opcija se može zadati na komandnoj liniji pri pokretanju programa mysqld ili, kao što smo već pomenuli, putem datoteke opcija.

Listu svih opcija (upozorenje: prilično je dugačka) dobićete ako na komandnoj liniji otkucate

mysqld --help

Page 92: Prirucnik Za MySQL

1/2 Pog lavlje 12 Podešavanje MySQL-a

Evo nekoliko korisnih opcija:

• ansi: Pokreće server u režimu kompatibilnosti sa standardom ANSI. U tom slu­čaju, MySQL prihvata samo sintaksu koja je u skladu sa standardom ANSI-99 SQL.

• basedir: Zadaje kerenski direktorijum instalacije ukoliko želite da server radi u nestandardnom direktorijumu.

• datadir: Isto kao basedir, ali za direktorijum data.

• log-bin: Uključuje binarno beleženje u dnevnik izmena. Možete zadati ime i direktorijum datoteke dnevnika izmena.

• log-error: Uključuje beleženje grešaka. Možete zadati ime i direktorijum dato­teke dnevnika grešaka.

• log-slow-queries: Uključuje beleženje sporih upita.

• port: Zadaje TCP priključak na kojem server osluškuje. Podrazumeva se priključak broj 3306.

• user: Zadaje ime korisničkog naloga pod kojim MySQL server treba da radi.

Tokom ovog poglavlja razmotrićemo još nekoliko drugih opcija, a to ćemo uraditi i u poglavlju 17, "Optimizovanje MySQL Servera".

Opcije za lnnoDB U primeru datoteke koji smo naveli, postoji i nekoliko opcija koje se odnose na InnoDB. Komponentu InnoDB možete koristiti i ako ne zadate izričito vrednosti za te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sle­deće opcije:

• innodb_data_file_path = ibdatal : lOM:autoextend

Ova opcija opisuje MySQL-u gde da smešta podatke kojima upravlja InnoDB. Za razliku od My ISAM tabela koje su smeštene svaka u svojoj datoteci, InnoDB tabele se čuvaju u deljenom prostoru za tabele, koji se može sastojati od jedne ili od više datoteka. U ovom primeru nalažemo MySQL-u da sve InnoDB podatke smešta u istu datoteku čije je ime ibdatal, a početna veličina 10 MB automatski se povećava (u koracima od po 8 MB) kada se prostor za tabele popuni.

Opšti format ove opcije je imedatoteke : veličina [; imedatoteke:veličina; .. . ] [ :autoex­tend [:max: veličina]]

Opcija autoextend omogućava da se veličina prostora za tabele povećava prema potrebama. Opcija max omogućava da zadate maksimalnu veličinu do koje dato­teka može da naraste.

• innodb_buffer_pool_size=70M Ova opcija podešava veličinu bafera koji se koristi kao ostava za (keš) pri radu s podacima u InnoDB tabelama i indeksima . Kao i svaka druga ostava, što veća, to bolja- omogućava manje direktnih pristupa disku . Koliko ćete memorije odvojiti za rezervu bafera zavisiće od toga da li na serveru ima i drugih aplikacija i kmisnik.l, ali i ml količine memorijl' s kojo111 raspolažete .

• innodb_additional_mem_pool_size=lOM

Ova opcija odvaja memoriju koja će služiti za smešta~e MySQL-ovih internih struktura podataka. Ako MySQL- u ponestane ove vrste memorije, počeće da upisuje upozorenja u dnevnik grešaka .

• innodb_log_file_size=20M

Ova opcija podešava veličinu datoteka dnevnika . InnoDB ciklično popunjava n

datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_ log_files_ in _group; podrazumevana vrednost je 2 i preporuč uje se.

• innodb_log_buffer_size=8M

Ova opcija podešava veličinu bafera u koji sc upisuje dnevnik izmena pre nego što se upiše na disk.

• innodb_flush_log_at_trx_commit=l

Ako ovoj opciji zadate vrednost 1, to znači da se sadržaj dnevnika izmena iz bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponašanje. Kada je ova opcija podešena na vrednost nula, dnevnik se upisuje i prenosi na disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upi­suju u dnevnik kad god potvrdite transakciju, ali se sadržaj bafera prazni i upisuje na disk jedanput svake sekunde.Vrednosti o ili 2 poboljšavaju performanse, ali verovatno ne treba da objašnjavamo koliko je to rizično.

Postoje i druge konfiguracione opcije za InnoDB. Više informacija o tome naći ćete u MySQL-ovoj dokumentaciji.

Konfiguracione opcije za više instalacija na istom računaru Često je korisno omogućiti da više MySQL servera radi na istom računaru. Na pri­mer, korisnici dobavljača Internet usluga mogu imate vlastite instalacije. Ovu odliku MySQL-a koristimo kada želimo da polaznicima kursa o MySQL-u omogućimo da svako podešava svoj server.

Za svaki server koji pokrećete morate zadati različite vrednosti sledećih opcija za mysqld:

• port: Svaki server mora osluškivati na drugom TCP priključku.

• socket: Na Unixu, svaki server mora koristiti drugu datoteku utičnice. Na Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server koristi. U oba slučaja, vrednost opcije socket mora biti različita za svaki server.

• shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti drugi blok deljene memorije.

pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju upisuje identifikator svog procesa (picl).

• Opcije za beleženje podataka u dnevnike izmena: Ako zadate vrednost bilo koje opcije koja se odnosi na datoteke dnevnika, za svaki server moraćctc da zadatl~ 1h 111-1i direktorij um za datoteke dnevnika.

Page 93: Prirucnik Za MySQL

1 14 Poglavlje 12 Podešavanje MySUL-a

Jednostavan način da to postignete jeste da opciji basedir dodelite različitu vred­nost za svaki server. Tako će direktorijumi data i datoteke dnevnika automatski biti različiti. Toplo preporučujemo da svaki server ima svoj direktorijum data, tako izbe­gavate razne neprijatnosti.

Opcija --defaults-fileje veoma korisnajer omogućava da se svaki server pokrene s različitim skupom podrazumevanih vrednosti opcija (ili da se svaki server instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija).

Važno je da zapamtite sledeće: kada na istom računaru radi više servera, klijentskim programima i drugim programima koji uspostavljaju veze sa serverom, kao što je mys­qladmin, morate zadati server s kojim treba da se povežu. U takvim situacijama može biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u kojoj ćete zadati odgovarajući broj TCP priključka- tako korisniku omogućavate da automatski uspostavi vezu sa svojim serverom.

lnternacionalizovanje Postoje dve opcije za mysqld koje omogućavaju da se zada podrazumevani skup zna­kova i jezičkih pravila. Skup znakova je skup simbola koji se može koristiti na serveru. Jezička pravila određuju način na koji se parede nizovi znakova iz tog skupa- čime se određuje i redosled sortiranja- što zavisi od govornog jezika.

Podrazumevani skup znakova možete zadati pomoću opcije --default -charac­ter-set. Svakom skupu znakova pridružen je i podrazumevani skup jezičkih pravila, ali možete zadati i neki drugi pomoću opcije --default-collation option. Ako kombinacija skupa znakova i skupa jezičkih pravila nije ispravna, mysqld će prikazati poruku o grešci.

Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup jezičkih pravila latinl_swedish_ci. Taj skup znakova se takođe označava kao IS0--8859-1 West European. Jezička pravila latinl_swedish_ci određuju redosled sor­tiranja teksta na Švedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l. (Možda niste znali da za reči napisane istim slovima važe različita pravila sortiranja u različitim jezicima.) Postoje i jezička pravila koja se mogu pridružiti skupu znakova latinl koja opisuju kako se sortira tekst na nemačkom, danskom i norveškom jeziku.

Više informacija o skupovima znakova koje MySQL podržava, naročito ako vas z~nima baš određeni skup, potražite u MySQL-ovoj dokumentaciji.

Sažetak • MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server,

mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack podržavaju upotrebu zajedničkih datoteka opcija.

• Opcije možete podesiti tako da važe na globalnom nivou, na nivou pojedinač­nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno.

• Sintaksa datoteke počinje imenom programa između uglastih zagrada, Čl'lllll

slede opcije koje se odnose na taj program. Komentari počinju znakom ll. Sv.d.;,1 opcija može se zadati u obliku opcija, opcija=vrednost, ili set-variabl opcija=vrednost.

• Listu svih opcija za program mysqld možete dobiti pomoću komande mysqlcl --help.

• Više MySQL servera može raditi na istoj mašini u isto vreme, pod uslovom da podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate zadati različite brojeve TCP priključka, utičnica i datoteka dnevnika.

• U datoteci opcija možete zadati podrazumevani skup znakova i jezičkih pravila koja će važiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola . Jezička pravila određuju redosled sortiranja.

Pitanja l. Opcija --no-defaults za mysqld znači

a) ne važe podrazumevane vrednosti, već samo vrednosti zadate u datoteci opcija

b) ne učitavati ništa iz datoteka opcija

e) učitati vrednosti samo iz globalnih datoteka opcija

d) nijedno od prethodnih

2. Opcija za Inn oD B koja podešava veličinu prostora za tabele je

a) innodb_buffer_pool_size

b) innodb_data_file_path

e) innodb_log_buffer_size

d) nijedna od prethodnih

3. Opcija za InnoDB koja podešava veličinu bafera za podatke je

a) innodb_buffer_pool_size

b) innodb_data_file_path

e) innodb_log_buffer_size

d) nijedna od prethodnih

4. Kada više servera radi na istom računaru, nUe neophodno da sledeći elementi budu odvojeni:

a) datoteke dnevnika

b) TCP priključci

e) utičnice

d) klijentski programi

Page 94: Prirucnik Za MySQL

~G Poglavlje 12 Podešavanje MySOL-a

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

Vežbe

a) Jedan skup jezičkih pravila može se pridružiti samo jednom skupu znakova.

b) Jedan skup jezičkih pravila može se pridružiti svakom skupu znakova.

e) Jednom skupu znakova može se pridružiti samo jedan skup jezičkih pravila. d) Nijedno od prethodnih.

Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj računar. Podesite sistem tako da imate i tekuću i stariju verziju servera koje rade na istom fizičkom računaru Pokušajte da uspostavite vezu sa obe verzije. .

Odgovori

Pitanja l. b

2. b

3. a

4. d

S. a

U sledećem poglavlju U sledećem poglavlju, "Administriranje baze podataka", razmotrićemo uobičajene t svakodnevne poslove održavanja koje treba obavljati u MySQL-ovoj bazi podataka.

1 Administriranje baze podataka

u OVOM POGLAVLJU RAZMOTRIĆEMO uobičajene poslove koji su neophodni za upravljanje MySQL-ovom bazom podataka. To obuhvata sledeće aktivnosti:

• Pokretanje i spuštanje srevera

• Prikazivanje podataka o serveru i bazama podataka na njemu

• Podešavanje serverskih promenljivih

• Uništavanje niti

• Pražnjenje ostava

• Analiziranje tabela

• Pregledanje datoteka dnevnika izmena

Mada prvenstveno objašnjava poslove koje treba da obavlja administrator baze podataka, ovo poglavlje opisuje i jedan važan skript, mysqladmin, koji omogućava da automatizujete neke od tih poslova.

Zadavanjem odgovarajućih parametara, skript mysqladmin se može upotrebiti za obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja naći ćete njihov spisak.

U ovom poglavlju razmotrićemo i upotrebu skriptova mysqlshow i mysqlcheck, te SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE.

Pokretanje i spuštanje MySQL servera Kao što smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server ćete naj­verovatnije podesiti tako da se automatski pokreće zajedno sa operativnim sistemom. Međutim, postoje situacije u kojima ćete morati da spustite, pa da ponovo pokrenete server jer je došlo do greške.

Već smo objasnili kako se pokreće MySQL server. Način na koji ćete to uraditi zavisi od vašeg operativnog sistema, sadržaja standardnih putanja i opcija koje ste izabrali kada ste instalirali MySQL server. Na Linuxu, server možete pokrenuti pomoću komande

/t Lc/lnit ,d/mysqld start

Page 95: Prirucnik Za MySQL

18 Poglavlje 13 Administriranje baze podataka

ali samo ako imate kopiju izvršne datoteke mysqld u direktorijumu koji se podrazu­meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, moraćete da zadate tačnu putanju. Više informacija o tome naći ćete u poglavlju l. Server možete pokrenuti i pomoću skripta

safe_mysqld

Ovaj skript najpre pokušava da automatski odredi odgovar~uće opcije za pokre­tanje MySQL-a, a zatim pokreće MySQL s tim opcijama.Ako skript nije na vašoj podrazumevanoj putanji, moraćete da zadate celu putanju na kojoj se on nalazi.

Da biste na Linuxu spustili MySQL server, imate dve mogućnosti. Možete izdati komandu

/etc/init.d/mysqld stop

ili

mysqladmin -u root -p shutdown

Razume se, možete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je uvek upotrebljiv. Nalozi pod kojima rade obični korisnici ne bi trebalo da imaju pravo spuštanja servera.

Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji način da pokrenete bilo koji servis jeste da otvorite Control Panel i pređete u Admini­strative Tools, Services. Ako izaberete servis MySQL,Windows će vam za njega ponuditi opcije Stop (spuštanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao što je prikazano na slici 13.1. (Pošto je ovo ekranska slika iz Windowsa XP Professional, sadržaj vašeg ekrana će se možda malo razlikovati, što zavisi od verzije operativnog sistema.)

Server možete spustiti i pomoću skripta mysqladmin za Linux, na opisani način.

Prikazivanje podataka o serveru i bazama podataka na nJemu Skript mysqlshow i SQL-ova komanda SHOW pružaju vam, kao administratoru, puno informacija o onome što se odvija u bazama podataka i na samom serveru.

Prikazivanje podataka o bazama podataka Skript mysqlshow prikazuje podatke o bazama podataka. Ako ga pokrenete bez para­metara, na sledeći način:

mysqlshow

prikazaće se lista baza podataka u koje vam je dozvoljen pristup pod vašim tekućim korisničkim nalogom. Rezultat je isti kao kada zada te

show databases;

u programu mysql ili u nekom drugom korisničkom interfejsu.

III~UL.I.UIIJ'- f'i'"""" ... '-""''"'..,- ... ...,,._,_. -----.---------~

1'1-0Yidosn.., ....... ~o ... ........ (alecb ..... ..

~'-·· Cohdtpe ... fnobiH• ... 51:•ted Atltritvw:t ... 51:•ted ........ loadJNe. ... St•ted -l'rl;wlcle$p . .• St•ted ... .-........ ....... Crut••··· 5t•ted ........ Mlnoqei: • ... ....... PnNidest ... ~t ... ENbletrl ... St•ttd .........

......... Offeru-. ..

~- ... 5l•ted ......... su..-... ..... ........ Sl4IPCIUI'i ... ..... -St•t..:l -J~W~eoet:e ... ....... fNtllessu .. .

~·- · · Tr.:boy~. .. 5t•t..:l ..... ... .-..... -Slika 13.1 Prozor Services alatke Windows

Administrative Tools.

toc•~

Locd~~Sys;t~

'"""""' Lout5o,ostem NetWOik.S ... ,...,"..,. Local~ , .... "..,

Locals-,.tem LCIUIISyod:em

"""""-Loct/Sysl:.-!1 LQ(also,stem

"""-Net.-lo.S ... lCIUIISerw;• , .... "._

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

Loul Sylt ..

LouoiSeMc:e , .... ,.,... loc .. s.r.t:e Lauls,.st .. Loul~

LocdiiSytten~

Kao i većinu skriptova koji se pokreću s komandne linije, skript mysqlshow možete pokrenuti s parametrom -u kojem sledi ime korisničkog naloga, i parametrom -p, kojim se prosleđuje lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate

mysqlshow --help

prikazaće se lista svih opcija na raspolaganju. Jedna od njih omogućava da zadate ime baze podataka da biste prikazali podatke

samo o određenoj bazi koja vas zanima. Na primer, ako ime baze podataka zadate u sledećem obliku, prikazaće se lista tabela u toj bazi podataka:

mysqlshow -u ime_korisnika -p ime_baze

Ako na kraj ovog reda dodate i parametar --status, dobićete detaljnije podatke o tabelama. Isprobajte to na bazi podataka employee, na sledeći način:

mysqlshow -u imekorisnika --status employee

Rezultati su malo teže čitljivi zbog dugačkih redova, ali se za svaku tabelu prika­zuju podaci o mašini za skladištenje podataka koja se koristi, količini podataka u tabeli, tekućoj vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci o skupu znakova koji važi za tabelu.

Page 96: Prirucnik Za MySQL

l tlU

Podatke o bazi podataka i stanju servera možete pribaviti i pomoću SQL-ove komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre­balo da već znate da izdate komande

show databases;

show tables;

da biste prikazali podatke o bazama podataka i tabelama u njima. Međutim, komanda SHOW ima veliki broj drugih opcija koje možete iskoristiti.

Na primer, zadajte

show columns from ime_tabele;

da biste dobili iste podatke kao pomoću komande DESC. Slično tome, možete zadati

show table status

da biste dobili iste podatke kao pomoću skripta mysqlshow --status.

Prikazivanje statusa servera i vredn..asti serverskih promenljivih Da biste dobili podatke o !l!!rveru i načinu na koji radi, pogledajte status servera i vred­nosti serverskih promenljivih

Da biste saznali kakav je tekući-sta~us MY_SQL-a, možete izdati komandu

SHOW STATUS

unutar MySQL-a, ili komandu

mysqladmin -u imekorisnika -p -extended-status

na komandnoj liniji. Time ćete dobiti veću količinu statističkih podataka o tome šta se sve događalo na

serveru od trenutka pokretanja. Može vas zanimati da pogledate vrednosti svih pro­menljivih čije ime počinje s com_*- na primer, promenljiva com_ select pokazuje koliko je server izvršio komandi select.

Ovo su neke od najzanimljivijih vrednosti:

• threads_connected: Broj otvorenih i aktivnih veza između korisnika i servera.

• slow _queries: Ukupan broj upita koje je server izvršio i čije je izvršavanje trajalo duže od granične vrednosti zadate u serverskoj promenljivoj long_query_time.

Ti upiti se beleže u dnevnik sporih upita (Slow Query Log). Sporim upitima bavićemo se više u poglavlju 19",0ptimizovanje upita".

• uptime: Broj sekundi koji je protekao od trenutka pokretanja servera.

Da biste videli vrednosti serverskih promenljivih, možete izdati komandu

show variables;

unutar MySQL-a, ili komandu

mysqladmin -u imekorisnika -p variables

na komandnoj liniji.

l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'--· •-·- • ..,._"_,.._ . .,,.,_. r----~---- ··-''l "'

Vrednosti većine serverskih promenljivih možete zadati u konfigur a<:tonoj datoteci, na komandnoj liniji kada pokrećete server ili dinamički, unutar MySQL· ,t, pontoć u kon1ande SET. Podešavanje servera opisano je u poglavlju 12",Podešavanjc MyS(~J .t'',

a upotreba komande SET opisana je u nastavku ovog poglavlja.

Prikazivanje podataka o procesima Koji su sve procesi aktivni na serveru možete videti ako unutar MySQL-a izdate sle-

deću komandu:

show processlist;

Prikazaće se podaci barem o upitu koji ste upravo poslali (show processlist).

Iste podatke možete dobiti i s komandne linije, ako zadate

mysqladmin -u imekorisnika -p showprocesslist

Prikazivanje podataka o dodeljenim pravima Koja su sve prava dodeljena određenom korisniku možete saznati pomoću sledeće

komande

show grants for imekorisnika@imeračunara;

Rezultat je izražen u obliku komande GRANT pomoću koje možete zadati drugom korisniku ista prava kao tekući korisnik. Na primer,

mysql> show grants for root@localhost;

na mom sistemu daje sledeće rezultate:

+--------------------------------------------------------------------+ l Grants for root@localhost l +--------------------------------------------------------------------+ l GRANT ALL PRIVILEGES ON* · * TO 'root'@'localhost' WITH GRANT OPTION! +--------------------------------------------------------------------+ l row in set (0.40 sec)

Možete se podsetiti i koja sve prava postoje ako zadate

show privileges;

Time ćete prikazati spisak svih prava koja postoje u sistemu.

Prikazivanje sistemskih podataka o tabelama Saznaćete koji se sve tipovi tabela mogu koristiti u sistemu ako zadate

show table types;

Ako vas zanima kako bi izgledala komanda create koja formira određenu tabelu

koja postoji u sistemu, zadajte

show create table ime_tabele;

Na primer, ako u bazi podataka employee zadate

show create table department;

Page 97: Prirucnik Za MySQL

182 Poglavlje 13 Administriranje baze podataka

dobićete sledeći rezultat:

CREATE TABLE 'department' 'departmentiD' int(ll) NOT NULL auto_increment, •name' varchar(30) default NULL, PRIMARY KEY ('departmentiD') TYPE=InnoDB CHARSET=latinl

(Obratite pažnju na to da su, za svaki slučaj, imena ko~ona napisa~:. između polu­navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada

smo napravili tabel u).

Podešavanje serverskih promenljivih .. . . Komanda SET omogućava da zadajete vrednosti serverskih promenljlVlh - koje ste mogli da vidite pomoću komande show variables. Sintaksa komande izgleda ovako:

set promenljiva=vrednost;

Na primer, možete zadati:

set sql_safe_updates=l;

Time se uključuje bezbedno ažuriranje podataka (isto se postiže i ako na koman-

dnoj liniji zadate --i-am-a-dummy). v. . . .

Ovu komandu koristićemo često kada budemo dosh do opt1m1zovanp servera u

poglavlju 17 ",Optimizovanje MySQL Servera".

Uništavanje niti . Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja omogućava da vidite koje se sve niti izvršavaju na serveru. Između ostalog, komanda prikazuje i jedinstveni identifikator dodeljen svakoj niti. Ak~ za ~:~~ m.~ sum~jate da je uzrok problema (na primer, upit koji s; izv.ršava "celu vecnos: ih klljentskl pro­gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande

kill id_procesa;

Pražnjenje ostava v . . • ,

MySQL koristi pri radu grupu internih ostava (kešova), koje m.ozete 1spra~mt1 pom~cu komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno izmenili sadržaj tabela prava, te izn1.ene će početi da važe u celom sistemu tek kad izdate

komandu:

flush privileges;

Druga česta upotreba komande FLUSHjeste pražnjenje bafera za upite:

(lush query cache;

Time ćete defragmentirati bafer za upite, čime se poboljšavaju performanse.

Uatoteke dnevnTk.t

Komanda RESET koristi se na isti način kao komanda FLUSH. Na primer, možete zadati

reset query cache;

Umesto da samo defragmentira ostavu za upite, ova komanda je prazni. Listu svih promenljivih na koje deluju komande FLUSH i RESET naći ćete u

MySQL-ovoj dokumentaciji.

Datoteke dnevnika MySQL održava više datoteka dnevnika koje mogu biti korisne. Budući da beleženje u većinu tih datoteka dnevnika nije uključeno u standardnoj konfiguraciji servera, to ćete morati sami da učinite. Svaki dnevnik se aktivira pomoću opcije zadate na komandnoj liniji pri pokretanju servera ili pomoću komande set.

Možete održavati sledeće dnevnike:

• Dnevnik grešaka (engl. Error log): tu se beleže sve greške nastale pri radu servera. Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je mysql. err. Možete je smestiti i u neki drugi direktorij um, koji morate navesti u opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf.

• Dnevnik upita (engl. Query log): tu se beleže svi upiti koji se izvršavaju u sistemu. Ovaj dnevnik možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije log=imedatoteke.

• Dnevnik izmena (engl. Binary log): tu se beleže rezultati svih upita koji menjaju podatke. Ovaj dnevnik zamenjuje nekadašnji Update log, koji će ostati na raspo­laganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije log-bin=imedatoteke.

• Dnevnik sporih upita (engl. Slow query log): tu se beleže svi upiti čije izvršavanje traje duže od vremena zadat og u promenljivoj long_ query _t ime. Ovaj dnevnik možete aktivirati i zadati direktorijum za njegovu datoteku pomoću opcije log-slow-queries=imedatoteke

Svi navedeni dnevnici, osim dnevnika izmena, obične su tekstualne datoteke. Sadržaj dnevnika izmena možete videti pomoću komande

mysqlbinlog logfile

Upotrebu dnevnika sporih upita razmotrićemo u poglavlju 19. Pošto veličina datoteka dnevnika raste, trebalo bi da ih ciklično zamenjujete dru ­

gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te koji formira grupu datoteka za cikličnu upotrebu.

Page 98: Prirucnik Za MySQL

R4 Poglavlje 13 Administriranje baze podataka

Ako koristite neki drugi operativni sistem, stare datoteke dnevnika možete ručno premestiti na bezbedno mesto a zatim naložiti MySQL-u da započne upisivanje u novu datoteku dnevnika, pomoću sledeće komande

mysqladmin flush-logs

Opcije za skript mysqladmin Za skript mysqladmin postoje mnogobrojne, manje ili više korisne opcije.

Neki poslovi, kao što je pravljenje i brisanje baza podataka, mogu se obaviti pomoću SQL-ovih komandi ili pomoću skripta mysqladmin:

mysqladmin create databasename

mysqladmin drop databasename

Skript mysqladmin se često upotrebljava za prikazivanje podataka o serveru i njegovom. tekućem stanju. Podatak može biti bilo šta u opsegu od vrlo jednostavnog, npr. "Da li server radi?'' (ping), do nečeg znatno detaljnijeg, kao što je lista vrednosti serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta mysqladmin za mnoge takve poslove.

Da biste saznali da li server uopšte radi, zadajte sledeće:

mysqladmin ping

Da biste saznali koja je verzija softvera za MySQL server instalirana na računaru, zadajte sledeće:

mysqladmin version

Da biste prikazali kratak ili dugačak opis statusa servera, zadajte sledeće:

mysqladmin status mysqladmin extended-status

Da biste prikazali listu aktivnih niti na serveru, zadajte sledeće:

mysqladmin processlist

Ako se prikaže lista procesa (niti), neželjene niti možete uništiti na sledeći način:

mysqladmin kill idl,id2,id3 ...

Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte sledeće:

mysqladmin variables

Sažetak • Server se može pokrenuti pomoću skripta mysqladmin, pokretanjem izvršne

datoteke mysqld, ili pomoću Windowsove alatke Services manager.

• Server se može spustiti pomoću komande mysql. server stop ili pomoću skripta mysqladmin shutdown .

• Komanda mysqlshow omogućava prikazivanje podataka o tekućoj bazi ili o MySQL serveru .

• Vrednosti serverskih promenljivih možete zadati pomoću konlalhh• menlj iva=vrednost;.

• Listu aktivnih niti možete prikazati pomoću komande show proceoo l l t 1 1 11

možete uništiti pomoću komande kill id_procesa.

• Ostave se prazne pomoću komandi FLUSH i RESET.

• Brzinu upita u kojima se spajaju tabele možete povećati pomoću komandl" 111,

lyze table ime_tabele; .

• MySQL beleži podatke u dnevnik grešaka, dnevnik upita (svi upiti), dnevnik izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti čije izvršava liJI' traje duže nego što je zadato upromenljivoj long_query_time).

Pitanja 1. Koji su od sledećih dnevnika standardno aktivni?

a) dnevnik upita

b) dnevnik sporih upita

e) dnevnik grešaka

d) dnevnik izmena

e) svi prethodni

2. SQL-ova komanda SHOW može se upotrebiti za prikazivanje

a) liste svih baza podataka na serveru

b) liste svih tabela u određenoj bazi podataka

e) liste svih kolona u određenoj tabeli

d) svega prethodnog

3. Skript mysqladmin može se upotrebiti za

a) učitavanje prava nakon izmena da bi se obezbedile da izmene počnu da važe

b) prikazivanje tekućeg statusa servera

e) spuštanje i pokretanje servera

d) zatvaranje i ponovno otvaranje datoteka dnevnika

e) sve prethodno

Vežbe Aktivirajte sva četiri dnevnika. Pošto izvršite više upita, pregledajte sadržaje dnevnika. Ako nemate pristup većoj bazi podataka, možda nećete postići da se nešto upiše u dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda .

Page 99: Prirucnik Za MySQL

186 Poglavlje 13 Administriranje baze podataka

Odgovori

Pitanja l. e

2. d

3. e

U sledećem poglavlju U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objašnjavamo izradu rezervnih kopija baza podataka i šta treba uraditi kad nešto krene naopako.

Izrada rezervnih kopiJ i obnavljanje podatak

u OVOM POGLAVLJU RAZMOTRIĆEMO KAKO SE prave kopije baze podataka, bko se one mogu preneti na drugi računar i kako se podaci obnavljaju kada nešto krene naopako.

Obradićemo sledeće teme:

• Izrada rezervnih kopija baze podataka

• Obnavljanje baze podataka iz rezervne kopije

• Proveravanje i popravljanje tabela

Izrada rezervnih kopija baze podataka Razume se, kao i za svaku drugu datoteku koju čuvate na nekom elektronskom ure­đaju, morate praviti rezervne kopije datoteka baze podataka. To možete činiti i radi replikovanja baze podataka ili prelaska na drugi računar.

Rezervnu kopiju MySQL-ove baze podataka možete napraviti na četiri načina:

• Pomoću skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj. datoteku koja sadrži sve SQL komande koji su neophodne da biste obnovili tekuće stanje baze podataka.

• Pomoću skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi.

• Sami direktno napravite običnu kopiju datoteka s podacima. Time zapravo ručno radite ono što skript mysqlhotcopy radi. Ako se opredeli te za ovu mogućnost, moraćete da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da zaključate tabele da biste obezbedili da podaci u njima ostanu međusobno uskla đeni. Pošto skriptovi mysqldump i mysqlhotcopy prazne ostave i zaključavaj u tabele umesto vas, oni su bezbednije rešenje .

• Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne koptjt • :tadatc tabele ili grupe tabela.

Page 100: Prirucnik Za MySQL

188 Poglavlje 14 lzraaa rezervnih Koplja 1 oonaviJanje poaataKa

Objasnićemo redom sve navedene mogućnosti. Ako je izrada rezervnih kopija od ključne važnosti, imajte u vidu da se za vreme tog

postupka korisnicima sprečava pristup podacima. Zbog čega? Da bi se napravila uskla­đena kopija stanja baze podataka, baferi tabela moraju se isprazniti a tekući sadržaj tabela mora ostati nepromenjen dok traje kopiranje. To se može obezbediti zaključava­njem tabela (u većini slučajeva) ili isključivanjem servera iz upotrebe (što se ne prepo­ručuje), ali u oba slučaja pristup bazi podataka neće biti moguć dok traje izrada kopije podataka.

Jedno rešenje problema jeste replikovanje. Jedan od zavisnih servera možete isključiti iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju svoje uobičajene poslove. Replikovanje ćemo razmotriti u poglavlju 16",Replikovanje baze podataka".

Izrada rezervnih kopija i obnavljanje podataka pomoću skripta mysqldump Najuobičajeniji način izrade rezervnih kopija baze podataka jeste pomoću skripta mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu s MySQL serverom i formira datoteku slike stanja, koja sadrži sve SQL komande potrebne za rekonstruisanje tekućeg stanja baze podataka.

Tipičan primer upotrebe ovog skripta izgledao bi ovako

mysqldump --opt -u imekorisnika -p lozinka employee > backup.sql

U ovom primeru zadali smo samo opciju--opt; ona grupiše nekoliko drugih opcija, koje su opisane u nastavku teksta. Naveli smo ime baze podataka, a rezultat preusmeravamo u datoteku rezervne kopije koju želimo da napravimo.

Ako skript pri meni te na jednostavnu bazu podataka employee, dobićete rezultu­juću datoteku čiji će sadržaj biti nalik na listing 14.1.

Listing 14.1 Primer rezultata skripta mysqldump

MySQL dump 10.2

Host: localhost Database: employee

Server version 4.1.0-alpha-max-debug

Table structure for table 'assignment'

DROP TABLE IF EXISTS assignment; CREATE TABLE assignment (

clientiD int(ll) NOT NULL default '0', employeeiD int(ll) NOT NULL default '0', workdate date NOT NULL default '0000-00-00',

ILiaUO 1\..L\..1 VIlli l "VtJIJU t VVIIU"IJUIIJ'- t-'vuu .. uou.o ,.....,,,,._..._ _ _.._,, ..... .,_ ,,, , -,.---..-

hours float default NULL, PRIMARY KEY (clientiD,employeeiD,workdate) TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'assignment'

/*!40000 ALTER TABLE assignment DISABLE KEYS */; LOCK TABLES assignment WRITE; INSERT INTO assignment VALUES (1,7513, '0000-00-00' ,5), (1,7513, '2003--01-20' ,8.5); UNLOCK TABLES; /*!40000 ALTER TABLE assignment ENABLE KEYS */;

Table structure for table 'client'

DROP TABLE IF EXISTS client; CREATE TABLE client (

clientiD int(ll) NOT NULL auto_increment, name varchar(40) default NULL, address varchar(lOO) default NULL, contactPerson varchar(80) default NULL, contactNumber varchar(12) default NULL, PRIMARY KEY (clientiD) TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'client'

/*!40000 ALTER TABLE client DISABLE KEYS */; LOCK TABLES client WRITE; INSERT INTO client VALUES

(1, 'Telco Inc', 'l Collins St Melbourne', 'Fred Smith', '95551234'), (2, 'The Bank', '100 Bourke St Melbourne', 'Jan Tristan', '95559876');

UNLOCK TABLES; /*!40000 ALTER TABLE client ENABLE KEYS */;

Table structure for table 'department'

DROP TABLE IF EXISTS department; CREATE TABLE department (

departmentiD int(ll) NOT NULL auto_increment, name varchar(30) default NULL, PRIMARY KEY (departmentiD) TYPE=InnoDB CHARSET=latinl;

Page 101: Prirucnik Za MySQL

•~v l U~ldVIJC l ""t ILl dUCI ICLCIVIIIII r\Uf.IIJCI l UUildVIJdiiJC JJUUdldr\d

Dumping data for table 'department'

/*!40000 ALTER TABLE department DISABLE KEYS */; LOCK TABLES department WRITE; INSERT INTO department VALUES

(42, 'Finance'), (128, 'Research and Development'), (129, 'Human Resources'), (130, 'Marketing'), (131, 'Property Services');

UNLOCK TABLES; /*!40000 ALTER TABLE department ENABLE KEYS */;

Table structure for table 'employee'

DROP TABLE IF EXISTS employee; CREATE TABLE employee (

employeeiD int(ll) NOT NULL auto_increment, name varchar(80) default NULL, job varchar(30) default NULL, departmentiD int(ll) NOT NULL default '0', PRIMARY KEY (employeeiD) TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'employee'

/*!40000 ALTER TABLE employee DISABLE KEYS */; LOCK TABLES employee WRITE; INSERT INTO employee VALUES

(6651, 'Ajay Patel', 'Programmer',128), (7513, 'Nora Edwards', 'Programmer',128), (9006, 'Candy Burnett', 'Systems Administrator',128), (9842, 'Ben Smith', 'OBA' ,42), (9843, 'Fred Smith', 'OBA' ,131);

UNLOCK TABLES; /•140000 ALTER TABLE employee ENABLE KEYS */;

Table structure for table 'employeeSkills'

DROP TABLE IF EXISTS employeeSkills; CHF.ATE TABLE employeeSkills (

ILl dUd ICLCI V lilJI r\UtJIJđ l UUIIc:tYIJOIIJ\. tJUUQUII\CI tJUIIIU\..U .:JI" l tJ lO IIIJ-;,'-tl\1~1"11}'

employeeiD int(ll) NOT NULL default '0', skill varchar(l5) NOT NULL default PRIMARY KEY (employeeiD,skill) TYPE=InnoDB CHARSET=latinl;

Dumping data for table 'employeeSkills'

/*!40000 ALTER TABLE employeeSkills DISABLE KEYS */; LOCK TABLES employeeSkills WRITE; INSERT INTO employeeSkills VALUES

(6651, 'Java'), (6651, 'VB'), (7513, 'C'), (7513, 'Java'), (7513, 'Perl'), (9006, 'Linux'), (9006, 'NT'), (9842, 'DB2');

UNLOCK TABLES; /*!40000 ALTER TABLE employeeSkills ENABLE KEYS */;

Bazu podataka employee možete da rekonstruišete na drugom računaru ako uradite

sledeće:

l. Napravite bazu podataka sa odgovarajućim imenom na ciljnom računaru.

2. Učitate ovu datoteku pomoću komande

mysql -u imekorisnika -p < backup.sql

Skript mysqldump ima više opcija koje možete upotrebiti. U ovom slučaju zadali

smo --opt, koja grupiše sledeće opcije:

• --quick: Nalaže MySQL-u da podatke upisuje direktno u datoteku, umesto da

ih prethodno upiše u memorijski bafer (što je standardni način rada).Time se

postupak kopiranja ubrzava.

• --add-drop-table: Nalaže MySQL-u da ispred svake komande CREATE TABLE

u rezultujućoj datoteci doda komandu DROP TABLE. (To vidite u listingu 14.1.)

• --add-locks: Dodaje komande LOCK TABLES i UNLOCK TABLES koje se poja­

vljuju u rezultujućoj datoteci.

• --extended- insert: Nalaže MySQL-u da koristi sintaksni oblik s više redova da

bijednom komandom INSERT uneo više zapisa u tabelu. Na primer, u listingu to

izgleda ovako:

INSERT INTO employeeSkills VALUES

(6651, 'Java'), (6651, ' VB'), (7513,'C'),

Page 102: Prirucnik Za MySQL

J t'OglaVIJe '14 Izraela rezervn1n kopiJa 1 oonaviJanJe podataka

Ako vam zatreba da pomoću ove datoteke ponovo formirate bazu podataka i njen sadržaj, postupak će biti brži nego kada zadate niz pojedinačnih komandi INSERT.

• --lock-tables: Nalaže MySQL-u da zaključa sve tabele pre nego što započne izradu datoteke slike stanja.

Imajte u vidu da opcija --opt (koja znači optimizovati) optimizuje vreme potrebno za rekonstruisanje baze podataka pomoću datoteke slike, a ne vreme potrebno za izradu same datoteke slike. Postupak izrade datoteke slike može biti prilično spor.

Evo još nekoliko korisnih opcija:

• --databases: Omogućava da zadate više odjedne baze podataka čije slike stanja želite da napravite.

• --all-databases: Nalaže MySQL-u da napravi slike stanja svih baza podataka na serveru.

• --allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervi­sane reči MySQL-a (ili onima koje u budućnosti mogu postati rezervisane reči), ova opcija nalaže MySQL-u da svakom imenu kolone pridruži i ime tabele kojoj kolona pripada.

• -d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog sadržaja. To je veoma korisno kada testirate baze podataka ili ih instalirate na druge računare.

Prednosti skripta mysqldump jesu u tome što se jednostavno upotrebljava i auto­matski rešava problem zaključavanja tabela umesto vas.

Međutim, ima i nekoliko nedostataka. Prvi je to što skript zaključava tabele: kada skript pokrenete na serveru, korisnicima sprečavate pristup tokom više sekundi ili čak minuta, što zavisi od veličine tabela. Ako planirate izradu slike stanja na serveru koji se ne replikuje, trebalo bi da pokušate da taj postupak obavite u vreme manje optereće­nosti sistema da ne biste previše ometali korisnike. Ako u svako doba dana imate velike količine podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi način izrade rezervnih kopija.

Drugi nedostatak je sledeća činjenica: pošto skript mysqldump za svoj rad koristi MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript mysqlhotcopy ne zavisi mnogo od MySQL servera, već se pri svom radu obraća direktno sistemu datoteka na računaru.

Izrada rezervne kopije i obnavljanje baze podataka pomoću skripta mysqlhotcopy Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome što direktno kopira datoteke baze podataka, umesto da učitava podatke preko veze koju uspostavi sa serve­rom. On se povezuje sa serverom da bi ispraznio bafere tabela i zaključao tabele, ali budući da komunicira sa sistemom datoteka na računaru i ne izvršava upite na serveru, trebalo bi da bude nešto brži od skripta mysqldump.

IL.IUUU 1'-L.'-1 or ooooo '"""I"''J..,. o."..,..,,_,.,)-'')- r---oo-··- r--.-·---·.--..... ..-----

Ovaj skript se pokreće na sledeći način:

mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum

Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn

je sigurno da negde imate i izvršnu datoteku perl. Ukoliko imate Windows, morale instalirati Perl da biste mogli da koristite ovaj skript. Ako ga još nemate, možete p rl' uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState:

www.activestate.com/Products/ActivePerl

Datoteke koje pravi skript mysqlhotcopy identične su kopije datoteka baze poda taka. Da biste mogli da upotrebite te kopije za restauriranje baze podataka, morate spustiti MySQL server i zameniti tim kopijama datoteke u MySQL-ovom direkto­rijumu data.

Ručna izrada rezervnih kopija i obnavljanje podataka Umesto skripta mysqlhotcopy, možete i sami ručno uraditi sve što taj skript radi. To podrazumeva pražnjenje bafera, zaključavanje tabela i kopiranje datoteka s podacima u odredišni direktorij um, pri čemu tabele moraju biti zaključane.

To znači da morate otvoriti novu sesiju na MySQL serveru. Možete najpre izdati komandu LOCK TABLES da biste zaključali sve tabele za koje nameravate da napravite rezervne kopije:

lock tables employee read, department read, client read, assignment read, employeeSkills read;

Parametri komande LOCK TABLES su lista imena tabela i vrsta blokade koju posta­vljate, READ ili WRITE. Za izradu rezervnih kopija obično je dovoljna blokada tipa READ. To znači da druge niti (otvorene veze sa serverom) mogu neometano da čitaju tabele ali ne mogu ništa da menjaju u njima dok traje postupak kopiranja.

Zaključavanje tabela je važno u ovakvim situacijama jer kopiranje može da potraje prilično dugo. U našem primeru baze podataka employee, bilo bi veoma nezgodno da nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbriše sve zaposlene iz neke službe, a zatim izbriše i samu službu. Rezultat bi bio neusklađena kopija podataka u kojoj bismo imali zaposlene koji rade u nepostojećoj službi.

Sledeći korak je izdavanje komande FLUSH TABLES:

flush tables;

Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak možete kombinovati s prethodnim pomoću sledeće komande:

flush tables with read lock;

Sada možete započeti kopiranje datoteka s podacima.Veoma je važno da vaša sesija (u kojoj ste zaključali tabele i ispraznili njihove bafere) ostane otvorena tokom celog

Page 103: Prirucnik Za MySQL

I!J4 PoglavlJe 14 Izrada rezervnih kOpiJa 1 obnavlJanJe podataka

postupka jer će tako blokade koje ste postavili biti održane. Kada zatvorite tu sesiju, tabele će biti oslobođene.

Kada završite kopiranje, trebalo bi da oslobodite tabele:

unlock tables;

Opisani postupak je ono što radi skript mysqlhotcopy, a podatke možete obnoviti iz kopija na isti način kao da ste kopije napravili pomoću tog skripta.

Izrada rezervnih kopija i obnavljanje podataka pomoću komandi BACKU P TABLE i RESTORE TABLE Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat možete postići i pomoću dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE.

Te komande deluju samo na tabele tipa MyiSAM. Rezervnu kopiju MyiSAM tabele možete napraviti na sledeći način:

backup table tl to 'putanja/do/kopije';

Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u sledećem primeru: '

backup table tl to 'c:/putanja/do/kopije';

Ova komanda na zadatu putanju kopira datoteku u kojoj se nalazi zadata My ISAM tabela. Tabela se automatski zaključava tako da bude dozvoljeno samo čitanje i pravi se njena kopija.

Možete zadati i listu imena tabela razdvojenih zarezima; međutim, u tom slučaju se tabele zaključavaju i kopiraju jedna za drugom.Ako želite da podaci u svim navedenim tabelama budu međusobno usklađeni, izdajte najpre komandu LOCK TABLES (pogle­dajte prethodni odeljak, "Ručna izrada rezervnih kopija i obnavljanje podataka") .

Da biste iz rezervne kopije obnovili tabelu, izdajte sledeću komandu:

restore table tl from 'c:/tmp';

Rezultat će biti uspešan samo ako tabele koje obnavljate ne postoje u tekućoj bazi podataka. Ako već imate tabel u sa istim imenom, morate je prethodno izbrisati komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE.

Komanda RESTORE takođe deluje samo na MyiSAM tabele.

Restauriranje podataka iz dnevnika izmena l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo često se dešava da korisici dodaju nove podatke i ažuriraju postojeće nakon izrade poslednje rezervne kopije. U tom slučaju se stanje baze podataka može restaurirati iz rezervnih kopija na jedan od na čina opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve i;-mene načinjene nakon izrade rezervne kopije.

Tc izmene se čuvaju u dnevniku izmena (engl. binary log), što ga čini izuzetno va7n im . Listu izvršenih operacija možete u čitati iz dnevnika izme na pomoću komande

mysqlbinlog logfile > updates.sql

O O-' -•- O -· -··-··.-e .... _....., ____ _

Korisno je da pregledate tu listu pre nego što ponovo izvršite upite ev1dclllll.lll u dnevniku jer neke među njima možda nećete žele ti da izvršite. Moguće je d.1 \l

zbog loše osmišljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H

kopije. Na primer, imali smo slučaj da je program er zadao upit nalik na sledeći

update user set password='password';

Jasno je da kada obnav ljate tabelu, ne biste želeli da se ovakav upit ponovo izvrši i da lozinka svakog korisnika sistema ponovo bude password!

Testiranje rezervne kopije Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je važno da je testirate ili, tačnije rečeno, da ispitate njenu upotrebljivost za obnavljanje podataka. Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju da li bi iz tih kopija mogli da restauriraju podatke ako zatreba.

Postupak izrade rezervne kopije morate pažljivo razmotriti kada analizirate rizike i odlučujete o tome šta ćete raditi. Gde ćete tačno smestiti datoteke rezervnih kopija da bi bile na drugom fizičkom disku? Kako ćete obezbediti da rezervna kopija ostane neoštećena na udaljenoj lokaciji gde je čuvate? Ako donesete odgovarajuće odluke na osnovu ovih pitanja i počnete da pravite rezervne kopije u redovnim vremenskim razmacima, nema razloga da brinete da li će te kopije biti upotrebljive. Ukoliko resta­urirate bazu podataka kao vežbu, možete otkriti eventualne probleme pre nego što postanu nerešivi.

Izuzetno važan element pri instaliranju MySQL-a, kao i za postupak obnavljanja podataka, jeste da uključite beleženje izmena u dnevnik izmena. Taj dnevnik stan­dardno nije aktivan, ali je neophodan za dovođenje res ta urirane baze podataka u poslednje ispravno stanje.

Proveravanje i popravljanje tabela Proveravanje da li su tabele oštećene, deo je standardnog postupka održavanja tabela a deo je i postupka restauriranja baze nakon katastrofalne greške, na primer, u slučaju prekida napajanja računara .

U MySQL-u postoje tri načina da proverite ispravnost tabela: pomoću komande CHECK TABLE, pomoću skripta myisamchk (ili isamchk) i pomoću skripta mysql­check.Tabele u kojima otkrijete problem možete popraviti pomoću komande REPAIR

TABLE ili takođe pomoću skripta myisamchk (ili isamchk) ili mysqlcheck. Kada razmatrate koju ćete mogućnost primeniti, trebalo bi da imate u vidu sledećih

nekoliko činjenica. Komande CHECK i REPAIR možete izdati iz samog MySQL-a, dok sc druge mogućnosti mogu primeniti samo s komandne linije. Komande CHECK i REPAIR

deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele, dok se skriptovi myisamchk i mysqlcheck mogu koristiti za My ISAM tabele.

Page 104: Prirucnik Za MySQL

1:70 rU!JiliVIJC l'+ ILl dUll l CLCI VIlli l II.Uf.IIJ<I l UUII<IVIJ<IIIJC f.IUU<Il<lll.čl

Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk. Bolje je da spustite server pre nego što pokrenete jedan od tih skriptova, ali ako je neophodno, možete i zaključati tabele. Ako te skriptove pokrenete za tabele s kojima u isto vreme možda rade druge MySQL-ove niti, podaci se mogu oštetiti. Komande CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele se koriste.

Razmotrićemo redom navedene alatke.

Proveravanje i popravljanje tabela pomoću komandi CHECK i REPAIR Ispravnost tabele možete proveriti pomoću komande CHECK TABLE, kao u ovom primeru:

check table department;

Komanda CHECK TABLE deluje i na MyiSAM i na InnoDB tabele. Trebalo bi da dobijete rezultat nalik na sledeći (ako je sve u redu):

+---------------------+-------+----------+----------+ l Table l Op l Msg_type l Msg_text l

+---------------------+-------+----------+----------+ l employee.department l check l status l OK +---------------------+-------+----------+----------+ l row in set (0.00 sec)

Može se pojaviti i poruka Table is already up to date, koja takođe znači da je sve u redu.

Ako se pojavi bilo kakva drugačija poruka, to znači da imate problem pa pokušajte da popravite tabel u. To možete učiniti pomoću komande REPAIR TABLE (ako je u pitanju MyiSAM tabela) na sledeći način:

repair table tl;

Ako se postupak popravljanja završi uspešno (ili ako popravljanje zapravo nije ni bilo poptrebno), trebalo bi da dobijete rezultat nalik na sledeći:

+---------+--------+----------+----------+ l Table l Op l Msg_type l Msg_text l

+---------+--------+----------+----------+ test.tl l repair l status l OK

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

Ako se pojavi poruka drugačija od OK, komanda REPAIR nije delovala i morate da upotrebite moćniju alatku myisamchk.

Proveravanje i popravljanje tabela pomoću alatke myisamchk U ovom poglavlju razmotrićemo samo alatku myisamchk a zanemarićemo alatku isamchk. Ako još radite sa ISAM tabelama, predlažemo da ih pretvorite u My ISAM tabele (videti poglavlje 9",Tipovi tabela u MySQL-u").

Program myisamchk izuzetno je koristan i izvući će vas iz neprilika u koje ste možda upali. Za program myisamchk takođe važi da se ne sme pokrenuti dok se server još koristi. Bezbednije je da ga spustite.

Najjednostavniji način da pokrenete myisamchkjeste da na komandnoj liniji otkucate l myisamchk tabela

Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smeštena MyiSAM tabela.

Ovaj program prikazuje podatke o praktično svim mogućim greškama do kojih može doći.Ako vam se čini da ne uspeva da reši vaš problem, pokušajte da ga pokrenete sa opcijom -m. Standardno ponašanje je da progran1 ispituje da li su indeksi oštećeni; kada zadate ovu opciju, ispituju se i redovi tabele.

Alatka myisamchk omogućava i ispravljanje otkrivenih grešaka. Tako se može ispra­viti velika većina grešaka do kojih dolazi u MyiSAM tabelama. Program myisamchk možete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u sledećem primeru:

myisamchk -q -r tabela

Ako je rezultat neuspešan, napravite rezervnu kopiju datoteke s podacima a zatim pokušajte potpuno obnavljanje tabele:

myisamchk -r tabela

Ako i to bude bezuspešno, pokušajte opciju --s af e- recover, koja ispravlja neke greške koje opcija -r ne može da ispravi:

myisamchk --safe-recover tabela

Program myisamchk ima veliki broj mogućih opcija, koje ćete videti ako na komandnoj liniji otkucate myisamchk bez parametara.

Proveravanje i popravljanje tabela pomoću alatke mysqlcheck Program mysqlcheck može se upotrebiti za proveravanje i popravljanje MyiSAM i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi.

Da biste pomoću alatke mysqlcheck proverili tabele baze podataka, pokrenite je kao u sledećem primeru:

mysqlcheck -u imekorisnika -p employee

Iza ovih parametara možete navesti imena tabela koje želite da proverite, ali ako ništa ne zada te, biće proverene sve tabele u bazi podataka (što je korisna odlika). Ako se sve završi bez grešaka, trebalo bi da dobijete rezultate nalik na sledeće:

employee.assignment employee.client employee.department employee.employee employee.employeeSkills

OK OK OK OK OK

Page 105: Prirucnik Za MySQL

8 Poglavlje 14 Izrada rezervn1n KOpija 1 ounaviJčHIJt: flUUCILCIII.d

Opcijom --databases možete zadati listu baza podataka koje treba proveriti, a opcija --all-databases čini da se proveravaju sve baze podataka na serveru.

Programu mysqlcheck možete zadati opciju -r da bi popravio sve oštećene MyiSAM tabele na koje iđe.

Sažetak

Izrada rezervnih kopija • mysqldump pravi datoteku slike stanja koja sadrži SQL komande.

• mysqlhotcopy kopira datoteke baze podataka u odredišni direktorijum.

• BACKUP TABLE kopira datoteku tabele u odredišni direktorijum.

• Rezervne kopije možete napraviti i ručno, tako što zaključate tabele, ispraznite njihove bafere a zatim napravite kopije datoteka baze podataka.

Restauriranje podataka • Izvršite komande iz datoteke slike stanja napravljene pomoću skripta mysqldump.

• Vratite kopije datoteka koje ste napravili pomoću skripta mysqlhotcopy ili ručno.

• Pomoću komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili komandom BACKUP TABLE.

• Ponovo izvršite sve operacije evidentirane u dnevniku izmena nakon izrade poslednje rezervne kopije.

Proveravanje i popravljanje tabela • Proverite stanje tabela pomoću komandi CHECK TABLE ili skriptova myisamchk,

isamchk ili mysqlcheck.

• Popravite tabele pomoću komande REPAIR TABLE ili skriptova myisamchk,

isamchk ili mysqlcheck.

• Nemojte pokretati skript myisamchk dok se server koristi.

Pitanja l. Ako želite da napravite rezervnu kopiju baze podataka, morate prethodno

a) spustiti server

b) zaključati tabele i isprazniti njihove bafere

e) i a) i b)

d) nijedno od prethodnog

U ~II::Ut:l:t:m poglaVlJU l'

2. Trebalo bi da ručno zaključate tabele pre nego što

a) započnete ručnu izradu rezervne kopije

b) pokrenete skript mysqldump

e) pokrenete skript mysqlhotcopy t' J d) nijedno od prethodnog

3. Koji se tipovi tabela mogu proveravati pomoću komande CHECK

a) InnoDB i MyiSAM

b) samo MyiSAM

e) MyiSAM i BDB

d) InnoDB i BDB

4. Koji se tipovi tabela mogu popravljati pomoću komande REPAIR

a) InnoDB i MyiSAM

b) samo MyiSAM

e) MyiSAM i BDB

d) InnoDB i BDB

TABLE?

TABLE?

5. Ako je rezultat komande CHECK TABLE poruka Table is already up

a) morate upotrebiti komandu REPAIR TABLE to date

Vežbe

b) komanda CHECK TABLE ne podržava mašinu baze podataka e) tabela je dobra

d) nijedno od prethodnog

Napravite rezervnu kopiju ~voje baze podataka primenom svih metoda opisanih u ovom poglavlju. RestaunraJte bazu podataka iz svake kopije koju ste napravili.

Odgovori

Pitanja 1. b

2. a

3. a

4. b

5. e

U sledećem poglavlju U sledećem poglavlju",Zaštita MySQL servera", saznaćete kako da izbegnete najčešće bezbednosne propuste.

Page 106: Prirucnik Za MySQL

15 Zaštita MySQL servera

U OVOM POGLAVLJU razmatraćemo opšte probleme zaštite o kojima bi trebalo da vodite računa kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se objasne i najsitniji detalji, prilažemo spisak najvažnijih preporuka o tome šta ne treba raditi. Obradićemo sledeće teme:

• Kako sistem prava korisnika deluje u praksi

• Zaštita korisničkih naloga

• Zaštita instaliranih datoteka

• Filtriranje podataka koje šalju korisnici

• Drugi saveti

Kako sistem prava korisnika deluje u praksi U poglavlju ll",Upravljanje pravima korisnika", objasnili smo pravljenje korisničkih naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo poglavlje počinjemo opisom načina na koji MySQL server primenjuje prava koja dodelite korisnicima.

Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL utvrđuje da Ji je korisniku uopšte dozvoljeno da uspostavlja veze sa servera m. Tome služi tabela user u bazi podataka mysql. MySQL traži u toj tabeli red koji sadrži kori­sničko ime i lozinku koje ste zadali te ime računara s kojeg pokušavate da se povežete sa serverom. Ako ne nađe odgovarajući red, neće vam dozvoliti da uspostavite vezu.

Budući da kolona host tabele user prihvata i džokerske znake, kombinacija kori­sničko ime/ime računara može se nalaziti u više redova te tabele. MySQL određuje koji je red najvažniji za utvrđivanje identiteta tako što prvo ispituje redove koji sadrže konkretna imena računara. Na primer, ako tabela sadrži red za korisnika test koji se prijavljuje s računara localhost i red za korisnika test koji u koloni host sadrži % (što znači bilo koji računar), MySQL uzima u obzir red koji sadrži ime računara localhost.

Page 107: Prirucnik Za MySQL

202 Poglavlje 15 Zaštita MySQL servera

Imajte u vidu da dva reda mogu sadržati različite lozinke. To može biti uzrok velike zabune. (Primer takve situacije pogledaćemo u odeljku "Brisanje anonimnih naloga",

u nastavku ovog poglavlja.) Drugi korak se odvija kada pokušate da izvršite određene upite ili komande. Pre

izvršenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno

izvršavanje upita koji ste poslali. Ako je za upit koji pokušavate da izvršite potrebno globalno pravo - npr. kao za

komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr­Šavanju upita u određenoj bazi podataka, najpre se ispituje tabela user. Kad korisnik ima pravo pristupa u sve baze podataka na serveru, to pravo je dovoljno. Ako nema to pravo, ispituju se tabele db i host. Ako korisnik nema prava ni na tom nivou, na kraju se utvrđuje da li možda ima pravo pristupanja određenim tabelama i kolonama.

Zaštita korisničkih naloga Postoji nekoliko opštih bezbednosnih principa koji važe i za upravljanje korisničkim nalozima na MySQL serveru. Razmotrićemo ih u narednom odeljku.

Zadavanje lozinke za korisnički nalog Root Kada završite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte lozinku za tog korisnika pre nego što počnete da koristite MySQL za bilo šta drugo osim isključivo za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako se može prijaviti na vaš server i raditi s vašim podacima šta god požcli.To gotovo nikad nije prihvatljiva situacija. Ako još niste zadali lozinku, učinite to odmah.

Brisanje anonimnih naloga Kada MySQL instalirate na Windows, on automatski pravi nekoliko naloga. Na Linuxu se to obavlja kada pokrenete skript mysql_install_db. Dva od tih naloga su anonimna, odnosno predstavljaju nalog koji vam se dodeljuje kada ne zadate svoje korisničko ime. Ime jednog naloga je localhost a drugo je % (predstavlja bilo koji računar, što omogućava uspostavljanje veza sa udaljenih računara). Ti nalozi stan­

dardno nemaju lozinke. Verovatno ste već shvatili zbog čega, ali ipak izričito preporučujemo da izbrišete te

naloge. To možete uraditi na sledeći način:

delete from user where User=''; delete from db where User='';

Nakon ovih komandi treba da izdate i komandu FLUSH PRIVILEGES da biste ispra­

znili tabele prava. Drugi razlog za brisanje tih naloga jeste to što mogu izazvati zbrku kada regularan

korisnik pokuša da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili nalog čije je ime laura i koji sme da se prijavljuje s bilo kojeg računara(%); kada 1 ura pokuša da se prijavi s računara localhost, MySQL server traži odgovarajuće

Zaštita instaliranih datoteka

redove u tabeli user. Tamo će naći kombinacije laura®% i (anonymous) ®localhost. Budući da MySQL daje prvenstvo redovima koji sadrže konkretna imena računara, uzima red (anonymous) ®localhost. Kao što vidite, iako je laura navela svoje kori­sničko ime, u ovom slučaju ono ne služi ničemu! Za anonimne naloge nije potrebno zadati korisničko ime. Anonimni nalog verovatno ima drugačiju lozinku od naloga korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako prijavljuje ne mora da zada lozinku).To znači da će laura, kada pokuša da se pod svo­jim korisničkim imenom i lozinkom prijavi s računara localhost, dobiti poruku Access Denied (pristup nije dozvoljen) bez očiglednog razloga.

Najbolji način da izbegnete tu vrstu problema jeste da izbrišete anonimne naloge i zaboravite da oni uopšte postoje.

Opasna prava MySQL ima veoma detaljan sistem prava korisnika, što je opisano u poglavlju ll. Morate vrlo pažljivo razmotriti kome ćete dodeliti neka od tih prava. Budite veoma oprezni s pravima FILE, PROCESS i WITH GRANT OPTION.

Pravo FILE omogućava korisnicima da izdaju komandu LOAD DATA INF ILE. Ta komanda može se zloupotrebi ti za menjanje sadržaja datoteka na serveru (kao što je datoteka za lozinke, /etc/passwd) ili čak za menjanje datoteka baza podataka, čime se zaobilazi sistem prava pristupa.

Pravo PROCESS omogućava korisnicima da izdaju komandu SHOW PROCESSLIST. Tako u svakom trenutku mogu videti koji se sve upiti izvršavaju, što im omogućava da dođu do poverljivih podataka o drugim korisnicima.

Pravo WITH GRANT OPTION omogućava korisnicima da svoja prava dodeljuju dru­gim korisnicima. Ako znate kakve mogu biti posledice tog prava, možete ga oprezno dodeljivati drugima.

Šifrovanje lozinki MySQL čuva lozinke korisnika u šifrovano m obliku. Pre verzije 4.1, mogli ste pri pri­javljivanju na server da zadate i šifrovani oblik lozinke.To je sada ispravljeno i ugrađena je jača zaštita lozinki i mehanizma prijavljivanja.

Ako pišete aplikaciju koja skladišti imena i lozinke svojih korisnika (ne korisnika MySQL-a), nemojte ih šifrovati pomoću funkcije PASSWORD ().Umesto nje, prepo­ručujemo funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objašnjene u pogla­vlju 8",Upotreba MySQL-ovih ugrađenih funkcija u komandi SELECT".

Zaštita instaliranih datoteka Osim zaštite MySQL-ovih korisničkih naloga, morate kontrolisati i pristup MySQL­-ovim binarnim datotekama, skriptovima i datotekama s podacima. Navešćemo neko liko preporuka koje možete primeniti na svoj sistem.

Page 108: Prirucnik Za MySQL

Poglavlje 15 Zaštita MySQL servera

Nemojte pokretati mysqld pod nalogom Root . . Ovo se preporučuje na Linuxu i drugim operativnim sistemima srodrum sa Umxo~1. Nemojte pasti u iskušenje da pokrenete MySQL server (program mysqld) pod .kon_­sničkim nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce raditi samo MySQL server. Tako ćete ograničiti prava pristupa koja će MySQL server

imati u sistemu datoteka.

Pristup datotekama i prava upotrebe u operativnom sistemu Nema svrhe da trošite vreme na pravilno podešavanje prava korisničkih naloga za pristup MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu. N~ophodno je da korisnicima ograničite p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a naročito direktorij umu data. Cest bezbednosni propust je da se nekom konsruku dozvoh pristup računaru na kojem radi MySQL server, ali ne i, na primer, bazama podat~a dr.u­gih korisnika. Ako taj korisnik ima pristup u direktorijum data, može da naprav1 koplje datoteka s podacima i da ih otvori na nekom drugom MySQL serveru.

Trebalo bi da uvek preduzimate sledeće opšte bezbednosne mere:

• Samo ovlašćeni i pouzdani korisnici treba da imaju pravo da pokreću mysqld. To pravo možete dodeliti jedino korisničkom nalogu koji ste napravili isključivo za

mysqld . • Samo ovlašćeni i pouzdani korisnici treba da imaju pristup MySQL-ovim pridru­

ženim programima i skriptovima, kao što su, na primer, mysqladmin, mysqldump i mysqlhotcopy. Najbolje je da o tome odlučujete od programa do programa.

• Samo ovlašćeni i pouzdani korisnici treba da imaju pristup u MySQL-ov direk­torijum data. Ako server radi pod korisničkim nalogom mysql, tom nalogu je neophodan pristup u direktorijum data. Pošto nijednom drugom konsmku to nije neophodno, najbolje da im zabranite pristup tamo.

Filtriranje podataka koje korisnici šalju · . Pre nego što MySQL-u prosledite bilo koji podatak k? ji je kor~snik une.o: treb.al.o b1 dn klijentska aplikacija izvrši određene provere. Kako cete to tacno obav1t1, zav1s1 od . razvojne platforme s kojom radite, ali pogledajmo primer koji objašnjava zbog čega b1

ttd)nlo da proveravate ulazne podatke. v . v .

Problem se može pojaviti čak i pri nečemu tako jednostavnom kao sto je unosenje

1w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vašu aplikaciju. ~o te po?atke pmslcdite direktno MySQL-u, problem će nastati zbog apostrofa u prez1menu O Leary. u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokušavaju da unesu MySQL-ove komande putem korisničkog interfejsa vaše aplikacije ili Web obrazaca. Postupak kojim ćete proveriti prihvatljivost ulaznih podataka zavisi od programskog .JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji ćete naći nekoliko opštih

pn:poruka za veliki broj programskih jezika.

Drugi savet l

Drugi saveti Razmotrili smo sistem prava pristupa, obradili korisničke naloge, opisali datoteke u sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zaštita vaše mreže (što bi verovatno trebalo da vas brine čim imate bilo kakvu vezu sa spolj­nim svetom), MySQL omogućava da se prenošenje podataka zaštiti pomoću protokola S SL. Trebalo bi da razmotrite i fizičku zaštitu uređaja.

Upotreba SSL veza Ako želite da sprečite da neko zlonameran "njuška" pakete podataka koje razmenjuju MySQL server i klijenti, podesite MySQL za uspostavljanje zaštićenih veza pomoću protokola SSL (Secure Sockets Layer).

Da biste mogli da koristite SSL, treba da instalirate biblioteku OpenSSL (na raspo­laganju je na www. openssl. org), pokrenete server sa opcijama --with-vio i --with­ssl i obavite određena podešavanja na komandnoj liniji. Dobar primer skripta koji obavlja potrebne operacije nalazi se u MySQL-ovoj dokumentaciji; ovde ga nismo reprodukovali.

Pošto obavite neophodna podešavanja, pomoću komande GRANT zahtevajte da se korisnici prijavljuju putem SSL veza ili da imaju odgovarajuće sertifikate. Evo jedno­stavnog primera upotrebe komande GRANT:

grant all on employee.* to testuser identified by 'password' require ssl;

Ova komanda pravi (ili menja) korisnički nalog testuser, čija je lozinka pass­word. Taj korisnik može da se prijavljuje na server samo putem SSL veza. Možete zahtevati da se na taj način prijavljuju svi korisnici servera ili možda samo korisnici koji se prijavljuju sa udaljenih računara.

Fizička zaštita instalacije Opšta preporuka glasi: ako ste se već potrudili da pažljivo podesite korisničke naloge u MySQL-u i u operativnom sistemu, pa čak i zahtevate da se korisnici prijavljuju putem SSL veza, najbolje je i da fizički zaštitite instalaciju. Ako postoji mogućnost da neko obori server zato što se sapleo o njegov kabi za napajanje, ili ako neko može da ukrade podatke tako što odnese ceo računar, imate ozbiljan problem. Fizička zaštita se često zaboravlja, naročito u malim i srednjim kompanijama.

Možda manje iznenađuje kada je u pitanju Windows, ali čak i inače bezbedni Unix/ Linux sistemi postaju ranjivi kada se zanemari fizička zaštita. Na primer, na Linuxu je postupak izmene lozinke korisničkog naloga root trivijalno jednostavan kada imate fizički pristup računaru. Naravno, kada neko podacima može da pristupa kao korisnik root, može da menja koje god hoće podatke u MySQL-ovim bazama podataka .

:ICI

Page 109: Prirucnik Za MySQL

~OG Poglavlje 15 Zaštita MySQL servera

Sažetak

Sistem prava pristupa • Korak 1: Provera da li korisnik®računar ima pravo pristupa s lozinkom koju je

zadao.

• Korak 2: Provera svakog upita da bi se utvrdilo da li korisnik®računar ima odgovarajuće pravo. Najpre se pretražuju tabele user i host, zatim db, a onda tables_priv i columns _pri v.

• MySQL daje prednost redovima u tabeli User koji sadrže konkretna imena računara.

Bezbednosne preporuke • Obavezno zadajte lozinku za MySQL-ov nalog root.

• Izbrišite anonimne naloge; oni omogućavaju pristup neovlašćenim korisnicima i mogu da spreče pristup regularnim korisnicima.

• Veoma pažljivo razmotrite kome ćete dodeliti prava FILE, PROCESS i WITH

GRANT OPTION.

• Lozinke koje se koriste samo za pristup aplikacijama šifrujte pomoću funkcija MOS () ili CRYPT () a ne pomOĆU funkcije PASSWORD () .

• Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban korisnički nalog s vrlo ograničenim pravima koji ćete upotrebljavati samo za mysqld.

• Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s ograniče­nim pravima.

• Korisnicima ograničite pristup programima i skriptovima prema potrebama. Držite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome što im zaista treba!

• Dozvolite pristup direktorijumu data samo MySQL-ovom korisniku .

• Nikad ne prihvatajte podatke direktno od korisnika. Uvek ih prethodno filtri­rajte u aplikaciji u kojoj se unose .

• Uključite upotrebu SSL veza ako su potrebne šifrovane veze.

• N e zanemarujte fizičku zaštitu MySQL servera!

Pitanja l . Koja se tabela u bazi podataka mysql pretražuje kada se utvrđuje da lije korisniku

dozvoljeno da uspostavi vezu sa serverom?

a) tables_priv

b) db

e) columns_priv

d) li Sl' r

2. Koja se tabela prva pretražuje kada se utvrđuje da li je korisniku dozvoljeno d,1 izvrši određeni upit?

a) user

b) host

e) db

d) tables_priv

3. Ako MySQL pronađe u tabeli user više redova koji sadrže isto ime korisnika, koji red uzima za proveru identiteta korisnika?

a) Red koji sadrži najodređenije ime računara .

b) Red koji sadrži najneodređenije ime računara.

e) Svaki red koji sadrži tačnu lozinku.

d) Nijedno od prethodnog.

4. Koja od sledećih prava verovatno ne bi trebalo da dodeljujete korisnicima?

a) FILE

b) PROCESS

e) WITH GRANT OPTION

d) Sva prethodna

S. Koji je korisnički nalog pogodan za mysqld?

a) Nalog s vrlo ograničenim pravima

b) Root

e) a) ili b)

d) Ni a) ni b)

Vežbe Pomoću primera podešavanja opisanog u MySQL-ovoj dokumentaciji, instalirajte OpenSSL za upotrebu na svom MySQL serveru.

Odgovori

Pitanja l. d

2. a

3. a

4. d

S. a

Page 110: Prirucnik Za MySQL

Poglavlje 15 Zaštita MySQL servera

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

16 Replikovanje baze podataka

J EDNA OD VEOMA KORISNIH MOGUĆNOSTI KOJE PRUŽA MYSQL jeste replika­vanje. Između ostalog, replikovanje omogućava da iste podatke čuvate na više servera . To možete raditi iz više razloga,_npr. da biste postigli bolje performanse, povećali pouzdanost sistema ili da biste lakše pravili rezervne kopije baze podataka. Osim toga, možete se opredeliti za replikovanje kao rešenje kada želite da raspodelite opterećenje baze podataka na više servera koje već imate, umesto da nabavite jedan (nov) jači server.

Replikovanje baze podataka može obezbediti otpornost sistema na greške (engl. Ja~lt tolerance). Ako se glavni server pokvari,jedan od zavisnih servera možete tretirati kao njegovu kopiju i odmah ga proglasiti za glavni server.

U sistemima gde se većina operacija svodi na čitanje podataka, a ne na pisanje, tepli­kovanje može da poboljša performanse jer se izvršavanje upita raspodeljuje na više raču­nara. Ukupno opterećenje sistema možete pokušati da smanjite tako što izvršavanje upita rasporedi te na veći broj manje optere ćenih računara, a druga mogućnost je da pokušate da smanjite saobraćaj u mreži tako što svaki upit usmerite na geografSki naj­bliži server. Ako su upiti koji se izvršavaju u vašoj bazi podataka uglavnom prilično jed­nostavni, čak i jednostavan algoritam koji ciklična raspoređuje opterećenje može biti efikasno rešenje. Ako neki upiti zahtevaju složenu obradu, verovatno ćete morati da osmislite složenije algoritme koji će raspoređivati opterećenje već na nivou aplikacije.

Druga primena replikovanja jeste izrada rezervnih kopija baze podataka. Kao što smo napomenuli u poglavlju 14",Izrada rezervnih kopija i obnavljanje podataka", izrada rezervne kopije obimne baze podataka može da potraje prilično dugo. Kada koristite replikovanje, možete spustiti zavisni server i napraviti kopiju njegovih poda­taka bez ometanja korisnika glavnog servera.

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

Page 111: Prirucnik Za MySQL

IV

Postupak replikovanja oslanja se na sadržaj dnevnika izmena na glavnom serveru. U tom dnevniku čuvaju se podaci o svakom upitu koji je bio izvršen na serveru od početka beleženja u dnevnik. Zavisnim serverima se šalju upiti iz dnevnika izmena glavnog servera a oni ih primenjuju na svoje podatke.

Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru, dok se operacije čitanja raspodeljuju između zavisnih servera, ili čak između glavnog i zavisnih servera. To se postiže najčešće ugradnjom odgovarajuće logike u aplikacije.

Važno je imati u vidu da kada počnete da repliku jete bazu podataka koja već sadrži podatke, dnevnik izmena možda neće biti potpun. Budući da beleženje izmena u dnev­nik standardno nije uključeno, podaci koje ste uneli u sistem možda nisu zabeleženi u dnevniku izmena. Kada započnete replikovanje, svi zavisni serveri moraju sadržati pot­puno iste podatke kao glavni server na početku beleženja u dnevnik izmena.Ovu temu razmotrićemo detaljnije u nastavku poglavlja.

Pošto zavisne servere napunite usklađenim podacima i pokrenete ih, oni usposta­vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeležene u dnevniku izmena glavnog servera. Jedna nit izvršenja na zavisnom serveru uspostavlja vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smeštaju u prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvršenja na zavisnom serveru čita izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka.

Budući da glavni i zavisni serveri mogu biti dostupni u različita vremena (npr. zato što se u sistem mogu dodati novi serveri baš u trenutku izvršavanja upita, ili zato što je mreža postala zagušena, ili je čak prestala da radi), neophodno je da zavisni serveri beleže dokle su stigli sa unošenjem izmena.Važno je da se sve transakcije 'izvrše u celini i da se izmene primenjuju pravilnim redosledom. U većini aplikacija, ako se garantuje da baza podataka uvek prelazi iz jednog usklađenog stanja u drugo, manje je važna činjenica da će se ponekad učitati podaci zastareli nekoliko sekundi ili minuta.

Ako razmatrate primenu replikovanja, morate shvatiti šta se tačno događa. Ažuriranje podataka odvija se asinhrono, a ne u realnom vremenu. Pošto ažurirate podatke u bazi na glavnom serveru, upiti poslati različitim zavisnim serverima nakon toga mogu izvesno vreme davati različite rezultate. To se može smatrati nedostatkom, ali prednost je u tome Što će zavisni server koji radi na prenosivom računaru ili u nepouzdanoj mreži, sasvim lepo raditi u intervalu između dva ažuriranja s glavnog servera.

Napomena o verzijama MySOL-a l ~cplikovanje je prvi put ugrađeno u jednu od novijih verzija MySQL-a (3 .23 .15), što znači da se ta mogućnost još uvek razvija gotovo sa svakom novom izdatom verzijom. Ako nameravate da koristite replikovanje, dobro je da na svim računarima koji u tome u čestvuju instalirate ažurnu i istu verziju MySQL-a. Moguće su određene kombinacije verzija MySQL-a između glavnog i zavisnih

servera, ali pošto time samo uvodite određen stepen nepouzdanosti, najbolje je da to izbe gava te ako je ikako moguće. Primera radi, možete naići na problem da se funkcij e, kao što j e PASSWORD (),razlikuju između dve verzije MySQL-a s kojima pokušavate da radit e.

Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na sJedećoj adresi naći ćete dokumentaciju s matricom verzija glavnih i zavisnih servera koje mogu raditi zajedno:

www.mysql.com/doc/en/Replication_Implementation.html

Podešavanje sistema za replikovanje U većini sistema u kojima se primenjuje replikovanje koristi se više računara pove­zanih u jednu internu mrežu. Ako imate račun are povezane putem javnog Interneta, pažljivo razmotrite bezbednosne mere. Za početak, obavezno proverite da li je TCP priključak koji ste odredili za MySQL dostupan kroz zaštitni zid svim računarima koji treba da komuniciraju sa serverom (podrazumevani broj TCP priključka za MySQL server je 3306) .

Pod pretpostavkom da na svojim računarima imate noviju verziju MySQL-a i jednu ili više baza podataka koje želite da replikujete, naredni koraci su obavezni da biste napravili sistem s jednim glavnim serverom i jednim ili više zavisnih servera.

Napravite korisnički nalog koji ćete upotrebljavati samo pri replikovanju Umesto da za sve što radite koristite nalog root, preporučujemo da za poslove repE­kovanja napravite korisničke naloge koji će imati samo prava neophodna za te poslove, kađ Što smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam je poseban nalog na glavnom serveru, namenjen isključivo poslovima replikovanja.

Ako nameravate da početno stanje zavisnih servera generišete pomoću komandi LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, korisničkom nalogu za replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na glavnom serveru) pravi korisnički nalog s pravima koja su potrebna alatkama za uspostavljanje početnih veza između servera:

grant replication slave, reload, super, select on logs.* to replication®"%" identified by 'password';

(U ovom primeru koristi se baza podataka logs. Izmenite komandu tako da odgo­vara imenu vaše baze podataka i, razume se, obavezno odaberite bezbedniju lozinku .)

Pošto završite kopiranje početnih podataka s glavnog servera na zavisni server, korisničkom nalogu za replikovanje više neće biti potrebna tako velika ovlašćenja. Ako zavisne servere punite iz rezervne kopije ili nameravate da smanjite ovlašćenja kori­sničkog naloga za replikovanje nakon završetka početnog kopiranja, tom nalogu je dovoljno samo pravo replikovanja. Naredni upit pravi korisnički nalog čije je ime replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog servera (kao i sa svakog drugog računara):

grant replication slave on logs.* to replication®"%" identifi e d by 'password' ;

Page 112: Prirucnik Za MySQL

' l .it rUyli:tVIJC l 0 nC~III\UVdiiJC UdLC tJUUdldl'\.đ

Sintaksa komande GRANT opisana je u poglavlju 11 ",Upravljanje pravima korisnika". Pravo replication slave (zavisni server pri replikovanju) uvedeno je u MySQL 4.0.2 upravo za tu namenu. U starijim verzijama MySQL-a koristite pravo file.

Navedena komanda omogućava samo pristup bazi podataka logs. Ako želite da doz­volite replikovanje svih baza podataka na serveru, u komandi zamenite logs. * sa * . *.

Proverite da li je glavni server podešen za replikovanje Na glavnom serveru mora biti uključeno beleženje izmena u dnevnik. Ako ste pročitali uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e već uključili dnevnik . izmena jer on služi i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju­čeno beleženje izmena u dnevnik, možete izdati komandu SHOW VARIABLES. Dovoljno

je da zadate

show variables; da biste prikazali vrednosti svih serverskih promenljivih, ali za skraćeni rezultat zadajte

sledeće :

show variables like "log_bin";

Ako je beleženje izmena u dnevnik isključeno, dodajte opciju log-bin u datoteku opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija biće my. ini ili my. cnf, u zavisnosti od konvencije operativnog sistema koju ste primenili.

U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo

bi da vaša datoteka opcija sadrži barem sledeće redove:

[mysqld] log-bin server-id=1

Opcija server- id je jedinstven identifikator koji treba da do~elite svakom MySQL serveru. To mora biti pozitivna celo brojna vrednost, a u ovom pnmeru sasv1m pro-

izvoljno zadali smo 1. . . Ako izmenite sadržaj datoteke opcija, morate ponovo pokrenut1 server da bl

izmene počele da važe.

Napravite kopiju tekućeg stanja glavnog servera Da biste započeli replikovanje, obezbedite sledeće:

• potpunu i usklađenu kopiju tekućeg stanja baze podataka na glavnom serveru

• ime datoteke dnevnika izmena na glavnom serveru

• pomak od početka dnevnika koji odgovara tekućem stanju servera.

Tačan postupak kojim ćete obaviti navedene poslove može s.e malo razli~ovati u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam .Jl! neprijatna pomisao da ćete za određeno vreme morati da zabranite pristup bazi

podataka.

Podešavanje sistema za replikovanjr

Za My ISAM tabele, kopiju tekućeg stanja svakog zavisnog servera možete napraviti nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u nastavku ovog poglavlja. Međutim, ova metoda nije posebno efikasna, naročito kad imate veliku količinu podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM MASTER izdata sa svakog zavisnog servera zaključaće podatke na glavnom serveru do završetka kopiranja. Baze podataka će biti zaključane znatno kraće vreme ako kopiju tekućeg stanja napravite ručno pomoću komandi operativnog sistema. To vam takođe omogućava da istom kopijom tekućeg stanja glavnog servera inicijalizujete koliko god vam zavisnih servera treba, čime skraćuj ete interval u kojem je server zaključan.

Za InnoDB tabele ne možete izdati komandu LOAD DATA FROM MASTER. Kopiju stanja morate napraviti ručno pomoću komandi operativnog sistema ili nabavite softver i opremu koji omogućavaju izradu kopije podataka dok se server koristi .

Ako kopiju tekućeg stanja servera pravite ručno, pomoću komandi operativnog sistema, morate se uveriti da su podaci međusobno usklađeni i ažurni, tako što ćete izdati sledeću komandu:

flush tables with read lock;

Time ćete zaključati tabel u i sprečiti upisivanje izme na dok je ne oslobodite. Ime tekuće datoteke dnevnika i pomak od njenog početka možete dobiti pomoću

sledeće komande:

show master status;

Trebalo bi da dobijete rezultate nalik na sledeće:

+-------------------+----------+---- ----------+------------------+ l File l Position l Binlog_do_db l Binlog_ignore_db l +-------------------+----------+--------------+------------------+ l server-bin.000007 l 211 l +-------------------+----------+--------------+------------------+

Zapišite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone (pomak od početka te datoteke). Ako nema podataka, umesto imena datoteke zadajte prazan znakovni niz, a vrednost pomaka treba da bude 4.

Da biste napravili kopiju tekućeg stanja My ISAM tabela, pomoću neke alatke za arhiviranje datoteka kopirajte sadržaj direktorijuma u kojem se nalaze datoteke tabela. Na Unixu, zadajte nešto nalik na sledeće da biste napravili kopiju tekućeg stanja baze podataka logs:

tar -cvf /tmp/snapshot.tar /path/mysql/data/logs

Na Windowsu, upotrebite WinZip ili neku sličnu alatku da biste napravili kopiju sadržaja direktorij uma C: \mysql\data \lo gs.

Kada završite kopiranje, možete ponovo dozvoliti upisivanje u bazu podataka ako izdate sledeću komandu:

unlock tables;

Page 113: Prirucnik Za MySQL

214 Poglavlje 16 Replikovanje baze podataka

Tabela employee koju koristimo u celoj knjizi (kao i većina tabela koje autori kori­ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje InnoDB tabela dok se koriste, onje savršen za ovu namenu. Može se nabaviti od firme

Innobase Oy na adresi

www.innodb.com/hotbackup.html

Ako nemate takvu alatku, najbolje rešenje je da ispraznite bafere baze podataka i da ispraznite njene tabele pomoću narednih komandi. Prvo zadajte komandu

flush tables with read lock;

a zatim prikažite i zapišite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti

način kao za MyiSAM tabele):

show master status; Bazu podataka isključite iz upotrebe a da je ne oslobodite, a sadržaj direktorij uma

u kojem se nalaze tabele te ~aze podataka kopirajte u MySQL-ov direktorijum data. Ako imate InnoDB tabele, morate kopirati datoteke s podacima i datoteke dnevnika. • Kada završite kopiranje, možete ponovo pokrenuti bazu podataka i osloboditi njene

tabele.

Podesite zavisne servere Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini)

dodajte red nalik na sledeći:

server-id=2 Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka,

potpuno je nevažno koje ćete vrednosti izabrati. Ako ćete imati veći broj servera, niz rastućih vrednosti je najverovatnije najbolji način da identifikatori imaju jedinstvene

vrednosti. Ukoliko koristite kopije koje ste ručno napravili u sistemu datoteka, morate kopi-

rati datoteke na odgovarajuća mesta na zavisnom server u. Ako radite s više različitih operativnih sistema, vodite računa o razlikovanju malih i velikih slova.

Nakon ažuriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server,

morate ga ponovo pokrenuti.

Pokretanje zavisnih servera Da biste pokrenuli zavisni server podešen kako je opisano u prethodnim odeljcima,

treba da izdate sledeće komande:

change master to master_host='server', master_user='replication', master_password='password', master_log_file='server-bin.000007', master_log_pos=211;

start slave;

Složenije topologlj

U ovom primeru, reč server je ime računara na kojem radi glavni server. Reč replicationje korisničko ime naloga koji ste napravili za poslove replikovanja. Umesto reči password upište lozinku tog naloga. Zadajte i ime datoteke dnevnika izmena (parametar master_log_file) i pomak (parametar master_log_pos).

Komanda START SLAVE pokreće na zavisnom serveru nit koja obavlja replikovanjc, usled čega zavisni server pokušava da uspostavi vezu sa glavnim serverom i preuzme 1zmene.

Ako ste napravili kopiju tekućeg stanja pomoću komandi operativnog sistema, tre­balo bi da pokrenete izvršavanje upita koji ispituju razlike između glavnog servera i zavisnih servera, da biste se uverili da se replikovanje odvija kako treba. Napravite malu izme nu na glavnom serveru, a zatim p rover i te da li je zavisni server i preuzimaju .

Ako repliku jete relativno male My ISAM tabele, možete ih napraviti i popuniti podacima pomoću komande nalik na sledeću:

load table logs.logJan2003 from master;

kada želite da kopirate samo jednu tabel u, ili

load data from master;

da biste kopirali sve tabele na zavisni server. Kada postupak replikovanja počne da se normalno odvija, više neće biti zgodno da

ručno izdajete komande za podešavanje replikovanja, čak ako zbog toga retko ponovo pokrećete server. Iste podatke koje biste zadali pomoću tih komandi možete uneti u datoteku opcija, uz malo drugačiju sintaksu.

Datoteka my. ini ili my. cnf na zavisnom serveru može sadržati nešto nalik na sledeći:

[mysqld] server-id = 2 master-host server master-user replication master-password password replicate-do-db = logs

Složenije topologije Najčešća pr imena replikovanja jeste raspoređivanje opterećenja (engl. load balancing) u sistemu u kojem se obavlja veliki broj operacija čitanja podataka a relativno mali broj operacija upisivanja podataka. Mnogi sistemi s replikovanjem sastoje se od jednog glavnog servera i manjeg broja zavisnih servera, ali postoje i slučajevi u kojima je opravdana upotreba složenijih konfiguracija.

Ako predviđate da ćete imati veći broj zavisnih servera ili su vaši računari razmešteni na većem broju različitih geografskih lokacija, može biti pogodno rešenje u obliku hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za određen broj zavisnih servera. Jedan ili više tih zavisnih servera igraju ulogu glavnog servera za drugu grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server (računar broj l) koji je gl:wni ?:a ra čunarc od 2 do 6. Neki od tih zavisnih servera igraju ulogu glavnih servl't .1 :t.t dru~\.' grupe zavisnih servera .

Page 114: Prirucnik Za MySQL

216 Poglavlje 16 Rep likovanje baze podataka

Slika 16.1 Replikovanje s hijerarhijski organizovanim glavnim serverima.

Raspored kao na slici smanjuje opterećenje glavnog servera na najvišem nivou i smanjuje obim saobraćaja na mrežnim vezama koje vode ka tom računaru. U zavisno- • sti od odnosa između broja operacija čitanja i upisivanja podataka u vašoj aplikaciji, tako možete obezbediti dobru skalabilnost bez prevelike složenosti sistema.

Prilično jednostavno možete formirati sistem s proizvoljnim brojem zavisnih ser­vera i možda čak više glavnih servera, pod uslovom da je svaki računar glavni server u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite računa da će ponekad na određenom serveru nedostajati najnovije izmene, ceo sistem možete tretirati otprilike kao da je u pitanju samo jedan server baze podataka.

Stvari počinju da se komplikuju kada imate cirkularne veze u kojima više servera primaju komande za ažuriranje podataka a izmene se prosleđuju u više smerova. Najjednostavnija cirkularna veza sastoji se od dva računara koji se ponašaju i kao glavni i kao zavisni server. Svaka izme na koju načinite na jednom računaru prosleđuje se dru­gom. Kada pišete aplikacije za tu vrstu sistema, morate biti veoma oprezni.

Budući da se izmene unose asinhrono, može doći do dupliranja vrednosti u poljima tipa auto increment ili jedinstvenih identifikatora i do neusklađenih podataka. U nekim aplikacijama to može biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira podatke i u kojoj imate manji broj jednostavnih veza između tabela, a zahteva se veliki protok podataka i raspoloživost za upotrebu, možda ćete prihvatiti da tome žrtvujete usklađenost podataka.

Budućnost replikovanja Imajući u vidu sve što je rečeno, moramo napomenuti da su u pitanju relativno nove mogućnosti, koje nisu do kraja "izbrušene". Kao što ste videli, postupak inicijalizovanja novog zavisnog servera kopijom stanja glavnog servera nije baš najpraktičniji. Nije uskla­đen ni način na koji se radi s MyiSAM tabelama i InnoDB tabelama. Tekuće mogućnosti n:plikovanja u MySQL-u nisu baš najrobusnije. Ugrađene su u standardnu distribuciju (za razliku od većine komercijalnih baza podataka) i redovno se upotrebljavaju u okru-1cnjima gde sc obraduju velike količine podataka.Verovatno ćete čuti da su među kori Sllltim.l kompanije kao što su Slashdot,Yahoo! i Googlc.

Pitanja

. Uglavnom, replikovanju treba pristupiti sa izvesnom rezervom. Mehanizam radi, 1 to dob:_o,ali početno podešavanje može biti zapetljane zbog razlika između sistema. Prepon~CUJemo da koristite najsvežije verzije MySQL-a koje možete nabaviti.

Neki od tih problema biće rešeni kada My ISAM dobije alatku za kopiranje podataka dok .se tabele kon~ te, kao .. što postoji za InnoDB tabele. Među mogućnostima koje su plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s više glavmh se:v~ra Istovremeno (engl. multimastering) radi rešavanja sukoba, i mogućnost preklapanJa IZmeđu ~va server~ "n~. vruće" (engl.failover) i raspoređivanje opterećenja. Zasad se o p~eklapa11Ju na vruce IZmeđu dva servera i raspoređivanju opterećenja morate starati sami u svojim aplikacijama, ili možete nabaviti odgovarajuću alatku za grupiSal1Je servera, kao Što nudi kompanija Emic Application Cluster na adresi www.emicnetworks.com .

U .datoteci opcija P?stoji nekoliko parametara koji se tiču replikovanja ali zasad nemaJumkakvog UtiCaJa. To su opcije za podešavanje SSL veza između glavnog servera I zav1smh se~.era . Ukoliko podatke repliku jete putem javne mreže, postupak će tako biti bezbed~IJI. Ako vam tre~aju zaštićene veze, zasad je jedino rešenje da nabavite odgovaraJUCI proiZvod, kao sto je Stunnel.

Sažetak • Repl~kovanje nije pogodno za. sve situacije, ali ako imate opterećenu aplikaciju s V~SOkJm vodnosom ,Između broja operacija Čitanja j upisivanja podataka, to može b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije.

• Imajte u vidu da se izmene ne izvršavaju na zavisnim serverima u isto vreme. Svaka kopija tabele mora prelaziti iz jednog usklađenog stanja u drugo, ali učita­vanJe podataka sa različitih servera može dati zastarele rezultate dok se zavisni serveri ne ažuriraju.

• Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD

TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW MAS~ER STA­

TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS.

Pitanja l. Na MySQL serveru replikovanje se može upotrebiti za

a) punjenje podacima razvojnog servera koji će služiti za bezbedno testiranje novih programa na stvarnim podacima

b) poboljšavanje performansi

e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike

d) poboljšavanje stepena raspoloživosti sistema

e) sve prethodno navedeno

Page 115: Prirucnik Za MySQL

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

3. Operacije čitanja i upisivanja podataka obično se odvijaju

a) čitanje na zavisnim serverima, upisivanje na zavisnim serverima

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

4. Replikovanje MySQL-ovih podataka znači da

a) su podaci uvek ažurni

b) serveri moraju biti povezani preko pouzdane mreže, a ako jedan od servera postane nedostupan, drugi moraju da čekaju dok se on ponovo priključi

e) izmene podataka su brze, ali je potrebno izvesno vreme dok se one presli­kaju na sve zavisne servere

d) izmene podataka se mogu unositi na bilo kom serveru i prosleđuju se glav­nom serveru, a zatim svim ostalim zavisnim serverima

Odgovori

Pitanja l. e

2. b

3. b

4. e

17

18 • 19

VI Optimizovanje MySQL-a

Optimizovanje MySQL servera

Optimizovanje baze podataka

Optimizovanje upita

Page 116: Prirucnik Za MySQL

17 Optimizovanje MySQL servera

u OVOM POGLAVLJU RAZMOTRIĆEMO NEKOLIKO MOGUĆNOSTI ubrzavanja MySQL servera. Podešavanje servera je opsežna tema i ima izvesnih sličnosti sa ezote­ričnom umetnošću. Naša namera je da vam u ovom poglavlju predstavim o osnove podešavanja servera. Obradićemo sledeće teme:

• Prevođenje i povezivanje koda radi veće brzine rada

• Podešavanje parametara servera

• Podešavanje drugih činilaca

Najvažnije je imati u vidu činjenicu da za sve izmene koje uvodite na serveru u cilju njegovog optimizovanja morate primeniti isključivo empirijski pristup. Poku­šajte jednu po jednu izmenu i meri te performanse pre i posle nje. Jedino tako ćete utvrditi da li izmena koju ste načinili zaista poboljšava performanse.

Ako želite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da duže vreme U edan sat, jedan dan ili neki prosečan period) beležite upite koji se izvršavaju na serveru i da zatim te iste upite ponovo izvršite na izmenjenoj konfiguraciji servera.

Prevođenje i povezivanje koda radi povećavanja brzine rada U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih ver­zija instalacionih datoteka (pomoću alatke RPM na Unixu). Ako tek učite upotrebu MySQL-a, to je svakako najjednostavniji način, naročito ako nemate iskustva s pre­vođenjem softvera koji imate na svom računaru, kao što je slučaj s većinom korisnika Windowsa.

Performanse svog servera možete poboljšati ako preuzmete izvornu verziju koda i sami ga prevedete. Ukoliko imate računar s procesorom Pentium koji radi pod opera­tivnim sistemom Linux, postići ćete primetno poboljšanje performansi ako izvorni

Page 117: Prirucnik Za MySQL

1.22 Poglavlje 17 Optimizovanje MySQL servera

kod MySQL-a prevedete pomoću prevodioca pgcc, koji optimizuje rezultujući kod samo za procesor Pentium. (Tako dobijena izvršna datoteka nije kompatibilna sa AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web lokacije prevedena pomoću prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser­ver možete ubrzati od 10% do 30% ako sami prevedete kod pomoću odgovarajućeg prevodioca i pravilno podešenih opcija- više informacija o tome naći ćete u MySQL­-ovoj dokumentaciji.

Drugo poboljšanje u poređenju s MySQL-ovom gotovom izvršnom datotekom jeste da prevedete MySQL s podrškom samo za skup (ili skupove) znakova koji name­ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije ugrađena je podrška za sve postojeće skupove znakova. (Više informacija o skupovima znakova naći ćete u poglavlju 12",Podešavanje MySQL-a" .)

MySQL-ova dokumentacija sadrži predloge o optimizovanju binarnih datoteka koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim grupama na Internetu posvećenim MySQL-u možete naći mišljenja i savete u vezi s mnogim problemima specifičnim za određene operativne sisteme i prevodioce koda. Arhive se nalaze na adresi

http://lists.mysql.com

Ukoliko želite da se pridružite diskusijama o prevodiocima, potražite forum na adresi

www.lukelaura.com

Podešavanje parametara servera Da biste optimizovali svoju konfiguraciju, pokušajte da podesite parametre MySQL servera.

Podsećanja radi, tekuće vrednosti parametara servera prikazaćete na sledeći način:

show variables;

Uticaj tekućih vrednosti parametara na konfiguraciju servera videćete pomoću sle­deće komande:

show status;

Druga korisna alatka koja omogućava da vidite šta se događa na serveru jeste Perl skript mytop, čiji je autor Jeremy Zawodny.

Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese, ~ta nje procesa, trajanje itd. Osim toga, ta alatka omogućava da prikažete detalje MySQL-ovog procesa i vidite koji se upit izvršava.

Skript možete preuzeti sa adrese

http://jeremy.zawodny.com/mysql/mytop

Sve navedene alatke omogućavaju da evidentirate izmene koje ste uneli i učinke koj e one imaju na sistem.

..

t'oaesavanJe parametar.• ~rrv 11

Datoteka opcija my.cnf sadrži toliko veliki broj opcija da ćete se možda pitati odakle da počnete. Uz većinu verzija MySQL-a dobijate i prime re datoteka my. en t , koje se obično nalaze u direktorijumu support-files instalacije. U tom direktorijumu naći ćete sledeća četiri predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf, my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao početnu datoteku op ci jn za svoj sistem.

Najvažniji parametri koje treba da podesite jesu oni koji određuju kako MySQL troši memoriju. Za svaki server baza podataka važi pravilo "što više memorije, to bolje", ali je važno i da ta memorija bude na raspolaganju serveru baze podataka i da se pravilno raspodeljuje između njegovih procesa.

MySQL održava grupu internih bafera i ostava. Možete podesiti količinu memorije koja se odvaja za tu namenu. Dva najvažnija parametra koja treba da podesite su key_buffer_size i table_cache. Pošto te bafere dele sve niti koje rade na serveru, njihovo podešavanje ima veoma veliki uticaj na performanse servera.

U baferu nazvanom bafer za ključeve (engl. key buffer) čuvaju se blokovi MyiSAM indeksa. Kada aplikacija zatraži određeni blok iz datoteke indeksa, on se učitava u taj bafer. Kad god se izvršava neki upit, ako se odgovarajuću blok indeksa nalazi u baferu, podaci se učitavaju iz njega. U suprotnom, blok indeksa mora da se učita iz datoteke na disku u bafer za ključeve, što je, razume se, sporije. Za bafer ključeva važi pravilo da što je veći, to bolje služi svojoj svrsi .

Kada razmatrate vrednost koju ćete dodeliti parametru key_ bu ff er_ s i ze, treba da uzmete u obzir ukupnu količinu memorije s kojom raspolažete, da li se računar koristi isključivo kao MySQL server ili služi i za druge poslove, a važna je i veličina datoteka indeksa (tj. ukupna veličina .MYI datoteka).Jeremy Zawodny, poznati stručnjak koji održava servere kompanije Yahoo!, preporučuje da na računaru koji radi isključivo kao MySQL server,parametru key_buffer_size dodelite vrednost u opsegu između 20% i 50% ukupne količine memorije na računaru .Ako je u pitanju deljen računar, jasno je da vrednost tog parametra treba da bude manja. Ukoliko podaci vaših indeksa zauzimaju samo 20 MB, bilo bi besmisleno da veličinu bafera za ključeve podesite na 128 MB.

Imajte u vidu i to da se bafer za ključeve koristi isključivo za MyiSAM tabele. Za druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno povećate bafer za ključeve ako, na primer, radite isključivo sa InnoDB tabelama. U tom slučaju važniji je parametar innodb_buffer_pool_size. U baferima za InnoDB čuvaju se i podaci indeksa i podaci tabela. (Više informacija o podešavanju za rad sa InnoDB tabelama naći ćete u poglavlju 12 i u MySQL-ovoj dokumentaciji.)

Drugi zaista važan parametar je ostava za tabele (engl. table cache) kojom se upravlja pomoću opcije table_cache.Vrednost te opcije određuje maksimalan broj tabela koje mogu biti otvorene u isto vreme. Kod My ISAM tabela, svaka tabela i svaki indeks su zasebne datoteke u operativnom sistemu. Budući da je otvaranje i zatvaranje dato tc b spora operacija, te datoteke ostaju otvorene dok ne budu izričito zatvorene, server spu šten, ili dok ukupan broj otvorenih tabela ne premaši vrednost parametra table_cache.

Page 118: Prirucnik Za MySQL

Poglavlje 17 Optimizovanje MySQL servera

Povećanje vrednosti parametra table_cache korisno je kada na serveru imate veliki broj tabela. Budući da vaš operativni sistem ograničava ukupan broj otvorenih datoteka u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik može držati otvo­rene u isto vreme, utvrdite tu vrednost u svom operativnom sistemu pre nego što izme­nite vrednost parametra table_ cache.

Osim tih globalnih memorijskih bafera, pojedinim nitima se takođe dodeljuju određeni blokovi memorije- kao što su, na primer, bafer za sortiranje (engl. sort buffer) i br.ifer za čitanje (engl. read bulfer).Veličina tih b afera je jednaka za svaku nit, ali svaka nit može koristiti tu količinu memorije za drugu namenu .

U bafer za čitanje, čija se veličina određuje parametrom read_buffer_size, sme­štaju se podaci iz tabele kada se njen sadržaj čita sekvencijalnim redosledom (engl. table sca11). Što se više podataka iz tabele može smestiti u bafer, to će biti manji broj opera­cija čitanja sa diska; međutim, ako je vrednost tog parametra previsoka, grupa bafera za čitanje koje niti koriste može potrošiti previše memorije. Možda se sećate da se u ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a veličinu muje određivao parametar record_buffer.

Bafer za sortiranje, čiju veličinu određuje parametar sort_buffer, koristi se pri izvršavanju upita koji sadrže odredbu ORDER BY, tj. služi za sortiranje podataka. Ako sorti rate velike količine podataka, povećajte bafer za sortiranje, ali i za njega važi isto upozorenje kao i za bafer za zapise.

Podešavanje drugih činilaca Na kraju, još nekoliko saveta koji vam mogu pomoći pri podešavanju fizičke konfigu­racije sistema.

Što se operativnog sistema tiče, MySQL preporučuje Solaris kada želite da izvučete maksimum od računara s više procesora. Iako postoje verzije MySQL-a za razne ope­rativne sisteme, razvoj i početno testiranje obavljaju se na Solarisu, zahvaljujući čemu bi to po logici stvari trebalo da bude najbolje optimizovana platforma.

Ukoliko možete da nabavite više diskova, poboljšaćete performanse ako baze poda­taka rasporedite na različite fizičke diskove. U tom slučaju možete koristiti i RAID konfiguracije - RAID O poboljšava performanse pri čitanju i pisanju, a RAID l ili 5 poboljšavaju performanse pri čitanju. Osim toga, SCSI diskovi obezbeđuju bolje per­foJillanse od IDE diskova.

Možete razmotriti i upotrebu žurnalskog sistema datoteka (engl.journalingjile 1ystc'111), kao što je Reiserfs ili XFS. Tako možete još više poboljšati performanse.

Rnume se, značajan boljitak može se postići povezivanjem klijenata i servera preko bt7C mreže, što takođe važi i za glavne i zavisne servere u replikovanju.

Sažetak Budući da je tema optimizovanja MySQL-a toliko opsežna da zaslužuje zasebnu kii_JI~ll, obavcwo nastavite s prikupljanjem informacija i istraživanjem te oblasti.

..

• Performanse ćete poboljšati ako sami prevedete izvorni kod MySQI ,, 11 11 1 illi

datoteku, naročito ako imate računar koji radi pod Linuxom ili ima JlllH l'''" Pentium.

• Podesite parametre servera za bolje performanse, naročito one koje sc odnosa· na potrošnju memorije. Velika količina fizičke memorije na računaru uvek Jt' korisna, ali je važnije kako se ona raspodeljuje. Evo nekoliko posebno va ž n ih parametara:

• key _buffer_size: Količina memorije koja će biti odvojena za skladištenje MyiSAM indeksa.

• table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme.

• read_buffer_size: Količina memorije koja se koristi pri sekvencijalnom čitanju tabela.

• sort_buffer: Količina memorije koja se koristi za skladištenje podataka iz tabela kada se pomoću odredbe ORDER BY zahteva sortiranje podataka.

• Poboljšajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo­trebom žurnalskog sistema datoteka i brze mreže između klijenata i servera, te između glavnih i zavisnih servera.

Pitanja l. Parametar koji određuje koliko će memorije biti odvojeno za skladištenje

indeksa Inn oD B tabela je

a) key_buffer_size

b) innodb_buffer_pool_size

e) innodb_key_buffer_size

d) read_buffer_size

2. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka Inn oD B tabela je

a) key_buffer_size

b) innodb_buffer_pool_size

e) innodb_key_buffer_size

d) read buffer size

3. Parametar koji određuje koliko će memorije biti odvojeno za keširanje podataka My ISAM tabela je

a) key_buffer_size

b) table cache

e) innodb_key_buffer_size

d) read_buffer_size

Page 119: Prirucnik Za MySQL

u Poglavlje 17 Optimizovanje MySOL servera

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

My ISAM indeksa je

a) key_buffer_size

b) table_cache

e) innodb_key_buffer_size

d) read_buffer_size

S. Vrednost parametra read_buffer_size ne bi trebalo da bude previsoka jer

a) ako veći broj niti sekvencijalno pretražuje tabele, imaćete problem

b) uvek se može dodati nov indeks, pa zato MySQL neće nikad morati da

sekvencijalno pretražuje tabele

e) time se rasipa prostor na disku

d) nijedno od prethodnog

Vežbe Eksperimentišite pomoću programa za merenje performansi dok parametre navedene u ovom poglavlju podešavate na različite vrednosti . Možete li pronaći optimalnu vrednost svakog od tih parametara za svoj sistem?

Odgovori

Pitanja l. b

2. b

3. d

4. a

S. a

U sledećem poglavlju U sled ećem poglavlju," Optimizovanje baze podataka", razmotrićemo optirnizovanje

Šl' ll1 C baze podataka, indeksa i pojedinih tabela.

..

18 Optimizovanje baze podataka

U POGLAVLJU 17",0pimizovanje MySQL servera", opisali smo kako se server podešava za optimalne performanse. U ovom poglavlju razmotrićemo kako možete optimizovati tabele baze podataka.

Standardna pravila i preporuke za strukture i normalizovanje tabela obično pobolj­šavaju performanse. Postoje i drugi izbori koje možete napraviti kada projektujete bazu podataka, zbog kojih će konačni proizvod biti brži ili sporiji. U ovom poglavlju razmotrićemo te izbore.

Obradićemo sledeće teme:

• Šta usporava MySQL-ove baze podataka

• Napravite pravilne izbore pri projektovanju

• Upotreba indeksa za optimizovanje performansi tabela

• Komanda OPTIMIZE TABLE

Šta usporava MySQL-ove baze podataka Pošto ste pročitali prethodno poglavlje o optirnizovanju servera, možete preći na opti­mizovanje baze podataka. U narednom poglavlju bavićemo se optirnizovanjem upita.

Ako ste optirnizovali server (možda čak po cenu ugradnje dodatnog hardvera), sle­deći korak je da razmotrite da li se bilo koja od navedenih tačaka odnosi i na vaš slu čaj :

• Nemam dovoljno indeksa. Uzrok broj jedan loših performansi jeste upotreba tabela kojima nije pridružen nijedan indeks ili nema indeksa za kolone koje pretražu­jete.To ne znači da treba imati što veći broj indeksa jer preterivanje u suprotnom smeru može biti uzrok sledećeg problema na listi.

• Imam previše indeksa. Da bi se ažurirao veliki broj indeksa, svaki put se u t:~ belu upiše nov red ili ažurira postojeći, a to potraje. Kada učitavate podatke, indeksi '> ll

veoma korisni. Kada upisujete nove redove, odnosno ažurirate ili briŠt:lc pm111 jeće redove, indeksi postaju problem. Kad god ažurira te neki podatak, 11101 .q11 ~ ~

ažurirati i indeksi, što produžava obradu i povećava opterećenj e si slCill ;l

Page 120: Prirucnik Za MySQL

ll Poglavlje 1 B Optimizovanje baze podataka

• Dodeljujem prava pojedinačno za tabele i kolone tabela. Ako prava dodeljujete pojedi­načno za tabele ili kolone bilo kog resursa, kad god korisnik pošalje upit na izvrša­vanje, MySQL mora da utvrđuje koja su sve prava za tabele i kolone tabela zadata.

• Struktura baze podataka nije optimalna. Postoje načini da se struktura baze podataka

projektuje tako da se upiti brže izvršavaju.

U naredna dva odeljka razmotrićemo strukture baze podataka i indekse koji omo­

gućavaju ubrzavanje rada s bazom podataka.

Pravilni izbori pri projektovanju baze podataka Postoji više pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka,

doprinose poboljšanju njenih performansi. To su sledeći: • Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima ćete

raditi. Na primer, ako u koloni tabele čuvate samo brojeve od 1 do 10, nemojte zadati tip INT, već tip TINYINT. Što su kraći redovi i manje tabele, to će se one brže pretraživati. Što su podaci manji, više se redova može keširati u memoriju.

• Koristite zapise fiksne dužine gde god je moguće. Ako su svi redovi tabele jed­nake dužine, MySQL brže pristupa redovima u sredini tabele. Da bi tabela imala redove fiksne dužine, tipovi podataka u svim kolonama moraju biti fiksne dužine. To znači da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB.

Ako vam je neophodan tip TEXT i BLOB, možda biste mogli da denormalizujete šemu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu.

Ukoliko imate isključivo kolone tipa VARCHAR, razmislite o tome da ih zamenite kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju više mesta na disku, što je u suprotnosti s prvom preporukom na ovoj listi.

• Gde god je moguće, deklarišite kolone kao NOT NULL. Ako je priroda vaših podataka takva da su vrednosti NULL sasvim logične i prihvatljive, slobodno ih koristite. Međutim, imajte u vidu da zbog toga gubite malo brzine i prostora,

pa zato zadajte odredbu NOT NULL gde god je moguće. • Birajte tip tabela za svaku tabel u pojedinačno. Tabele koje ne podržavaju transak­

cije (na primer, My ISAM) manje opterećuju sistem i zato su brže od tabela koje podržavaju transakcije (InnoDB i BDB). MySQL podržava mešanje više tipova tabela u istoj bazi podataka. Izaberite najbrži tip koji je pogodan za određeni posao. (Više informacija o pojedinim tipovima tabela naći ćete u poglavlju 9,

"Tipovi tabela u MySQL-u" .) • Izaberite odgovarajuće indekse. Ovu temu obradićemo detaljno u narednom

odeljku. • U težim slučajevima, razmislite o denormalizovanju tabela da biste smanjili broj

spojeva koji se uspostavljaju u uobičajenim upitima. Budući da će zbog toga vaša baza podataka postati noćna mora za održavanje, to se najčešće ne preporučuje.

..

lnd~ksiranje u cilju optimizovanja Uk~hko .ste pratili gr:divo i vežbe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn1,1

~adrz1 pnmarne kljuceve. To znači da imate barem po jedan indeks za svaku tnbdll

~~r MySQL automatski pravi indekse za kolone koje deklarišete kao PRIMARY KEY

1h UNIQUE. ,

~o pokušavat.e da optimizujete postojeću bazu podataka, korisno je ispitati da Ji ll' u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je česta greška pri projekta o

vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi postoje za određenu tabelu.

Dakle, šta je indeks i čemu služi? Indeks je sličan referentnoj tabeli po tome što omogućava da se brzo pronađe odrc­

đe.m red ~ tabel1. Ako napravite indeks za kolonu X, pronalaženje tražene vrednosti u tOj .. kolo~l zna.tno je brže pomoću indeksa. Indeks pokazuje gde se u tabeli nalazi red kOJI sadrz1 tr~ze~u vredn~st, što omogućava da se direktno pređe na taj red. . Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretražuje jedan po Jedan red tabele dok ne pronađe redove koje ste zahtevali. Zamislite da morate da pronađe:e određe~u ten~u. u ovoj knjizi tako što ćete početi od prve stranice i čitati svaku ree na sv~kOJ stran1e1. ~na tn o je brže da u indeksu knjige potražite temu koja vas zamma 1 da zat1m pređete direktno na stranicu koja vam treba.

U MySQL-u se po.daci indeksa čuvaju u obliku b-stabala (binarna stabla); to su strukture podataka koje se vrlo brzo pretražuju. . I~dek~i mogu o?~hvatati je~nu kolonu ili više njih (isto kao ključevi tabela). Pri IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretražuje jedno od sledećih:

• Kolona kojoj _je pri~ružen jednokolonski indeks- na primer, ako je u tabeli ~epartments mdekmana kolona departmentiD i treba izvršiti upit sličan slede­cem: SELECT .. . WHERE departmentiD=n.

• Grupa kolon~ za koju postoji zajednički indeks - na primer, ako za tabelu emplo~ee.ass1gnment postoji indeks za kolone (client ID, employeeiD work­

date) 1 treba izvršiti upit sličan sledećem: SELECT .. . WHERE client ID=~ AND

employeeiD=y AND workdate=z .

• Ko.lon~ ili grupa kolo.na koja je deo višekolonskog indeksa, pod uslovom da je to levz kr~J grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign­ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on će biti upotrebljen u upitima sledeće vrste: ' SELECT ... WHERE clientiD=x

SELECT ... WHERE clientiD=x AND employeeiD=y

Ali ne i u upitima nalik na sledeći: SELECT ... WHERE employeeiD=y AND workdate=z

Suština cele .~riče je u sledećem: ako predviđate da će se izvršavati veliki broj upita ~ad kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da Izdate komandu CREATE INDEX da biste napravili odgovarajući indeks. Imajte u vidu

Page 121: Prirucnik Za MySQL

- r .. · · ··· --·- ··.J- ---- 1 ---~-H-

da MySQL može da koristi samo po jedan indeks po tabeli u upitu. Nije moguće automatsko kombinovanje više indeksa.

Ovo pitanje ćemo detaljnije razmotriti u poglavlju 19",0ptimizovanje upita", kada budemo došli do komande EXPLAIN.

Komanda ANALYZE TABLE Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored ključeva u tabeli. MySQL čuva te podatke i koristi ih pri donošenju odluke o tome kako će spojiti tabele u upitu. Komanda se izdaje na sledeći način

analyze table imetabele;

Komanda OPTIMIZE TABLE N a kraju, moramo pomenuti komandu OPTIMIZE TABLE . Njena vrlo jednostavna sintaksa izgleda ovako:

OPTIMIZE TABLE imetabele;

To je MySQL-ov ekvivalent komande za defragmentiranje Čvrstog diska. Tokom upotrebe baze podataka, u datotekama u kojima se čuvaju podaci raste broj praznina između blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su zapisi premešteni zato što su nakon ažuriranja postali veći. Te praznine su uzrok slabije efikasnosti.

Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri­sali veće količine podataka, ili ako ste dodali, izbrisali ili ažurirali veći broj redova pro­menljive dužine. Tako ćete preurediti podatke u datotekama, ponovo sortirati indekse i ažurirati statističke podatke o tabeli.

U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele.

Sažetak • Strukturu baze podataka možete optimizovati tako što ćete odabrati tipove poda­

taka manje veličine i fiksne dužine, definisati odgovarajuće indekse i koristiti odgovarajuće tipove tabela.

• Indeksi omogućavaju brzo pronalaženje zapisa traženih na osnovu vrednosti u indeksiranim kolonama.

• Indeks će biti upotrebljen u upitu kada se u njemu referencira indeksirana kolona ili kolone, ili levi kraj grupe indeksiranih kolona.

• Komanda OPTIMIZE TABLE imetabele obavlja za tabele operaciju sličnu defrag­mentiranju čvrstog diska.

Pitanja

Pitanja 1. Koja je od sledećih tvrdnji o indeksima tačna?

a) Indeksi zauzimaju previše prostora na disku i zato ih ne treba koristiti.

b) Ako tabeli nije pridružen nijedan indeks, upit se može izvršavati sporije. e) Trebalo bi da indeksirate što veći broj kolona.

d) Nijedna od prethodnih.

2. Kada birate tipove podataka za kolone tabele

a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje efikasnija

b) trebalo bi da koristite tipove podataka promenljive dužine gde god je moguće jer se tako optimizuje upotreba prostora na disku

e) trebalo bi da koristite tipove podataka fiksne dužine gde god je moguće da biste ubrzali pristup podacima

d) nijedno od prethodnog

3. Kada birate tip tabela

a) uvek birajte InnoDB ili BDB zato što podržavaju transakcije

b) uvek birajte MyiSAM zato što su najbrže

e) koristite mešavinu tipova, u zavisnosti od svrhe tabele

d) nijedno od prethodnog

4. Indeks neće biti upotrebljen ako se u upitu

a) koristi levi kraj grupe indeksiranih kolona

b) koriste sve kolone indeksa po redosledu različitom od njihovog redosleda u indeksu

e) koriste sve kolone indeksa po redosledu jednakom njihovom redosledu u indeksu

d) koristi desni kraj grupe indeksiranih kolona

5. Upotrebite komandu OPTIMIZE TABLE

a) čim definišete tabelu, da biste poboljšali njenu strukturu

b) kada koristite InnoDB tabele, da biste smanjili opterećenje sistema

e) nakon izvršavanja većeg broja komandi SELECT nad tabelom

d) nakon izvršavanja većeg broja komandi DELETE nad tabelom

Page 122: Prirucnik Za MySQL

- .~ ... ~~· --·-··,J ----- 1"" __ _ ...........

Vežbe U kojem će od sledećih upita u bazi podataka employee biti upotrebljeni indeksi? (Potražite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", tačnu strukturu baze podataka. Ili, ako ste je instalirali na svoj računar, pogledajte pomoću komande describe koje su sve kolone indeksirane.)

a)

b)

e)

select * from employee where departmentiD=128;

select employeeiD from assignment where clientiD=l;

select skill, count(skill) from employeeSkills group by skill;

Ako ovi upiti treba da se često izvršavaju, koje biste dodatne indekse napravili?

Odgovori

Pitanja l. b

2. e

3. e

4. b

S. d

Vežbe [ndeks se koristi samo u upitu pod tačkom b).

Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill.

U sledećem poglavlju U sledećem (i poslednjem) poglavlju, "Optimizovanje upita", razmotrićemo kako možete utvrditi da li se određeni upit izvršava brzo ili sporo, i zbog čega, kao i to kako rešiti problem.

19 ..

Optimizovanje upita

M YSQL OMOGUĆAVA DA ANALIZIRATE upit da biste saznali za koje se vreme izvrši i kako se tačno izvršava nad sadržajem baze podataka. Na osnovu tih podataka i poznavanja načina na koji MySQL pokušava da optimizuje upite, ponekad možete da poboljšate performanse upita. U ovom poglavlju razmotrićemo sledeće teme:

• Otkrivanje sporih upita

• Merenje performansi upita

• Upotreba dnevnika sporih upita

• Upotreba komande EXPLAIN za prikazivanje načina na koji se upiti izvršavaju

• MySQL-ov ugrađeni mehanizam za optimizovanje upita

• Saveti o optimizovanju upita

Otkrivanje sporih upita Da biste optimizovali određenu aplikaciju, morate najpre utvrditi koji njeni delovi imaju najveći udeo u ukupnom vremenu izvršavanja. To možete obaviti na nekoliko načina:

• Posmatranjem: Često zaključujemo daje neophodno optimizovanje zbog toga što se određeni upit izvršava brzinom premorenog puža.

• Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije izvršavaju.

• Uvidom u dnevnik sporih upita: U ovaj dnevnik beleže se spori upiti, kao što biste i očekivali na osnovu njegovog imena.

Pošto identifikujete spori upit, pomoću komande EXPLAIN možete saznati kako ga MySQL tačno izvršava da biste zatim pokušali da ga optimizujete.

Najčešće nije potrebno da ubrzate baš sve upite koji se koriste u aplikaciji . Obično samo manji deo koda oduzima najveći deo ukupnog vremena izvršavanja. Ukoliko vaš sistem nije izuzetno opterećen, besmisleno je da gubite vreme pokušavajući da ubrzate delove aplikacije čiji je udeo u ukupnom vremenu relativno mali .

Page 123: Prirucnik Za MySQL

Merenje performansi upita Merenje performansi (engl. benchmarking) korisno je za rešavanje svih vrsta problen:a optimizovanja. Merenje performansi u ovom slučaju znači merenje vremena za koje se upit izvrši. Najbolje je da upit izvršite više puta i da zatim izračunate prosečno vreme njegovog izvršavanja. Budući da trajanje jednog izvršavanja upita zavisi od ukupnog opterećenja sistema, samo jedno merenje može dati neočekivane rezultate. Otkrićete i to da bi upit trebalo da se brže izvrši kada ga pokrenete drugi put jer je smešten u ostavu (keš).

Razume se, možete koristiti spoljne skriptove ili programe posebno napisane tako da isti upit izvršavaju više puta. Ako vas zanima primer takvog programa, preuzmite distribuciju MySQL-a sa izvornim kodom i potražite programe za merenje perfor­mansi u direktorijumu sql-bench.

U MySQL-u možete meriti brzinu izračunavanja vrednosti bilo kojeg izraza (uključujući i upita) pomoću ugrađene funkcije BENCHMARK(). Na primer:

select benchmark(lOOOOOO, 6*9);

Ova komanda daje rezultate nalik na sledeće:

+-------------------------+ l benchmark (1000000, 6*9) l +-------- -----------------+

o l +-------------------------+ 1 row in set (0.25 sec)

Funkcija prihvata dva parametra: koliko puta treba izračunati vrednost izraza (u ovom primeru, milion puta) i izraz koji se izračunava (u ovom primeru, šest puta

deve0. .. Budući da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa

BENCHMARK () uvek vraća rezultat nula. Pri merenju nas zaista zanima za koje vreme se upit izvršio. Iz navedenog primera rezultata vidi se daje izračunavanje proizvoda 6 x 9 milion puta na mom računaru trajalo četvrtinu sekunde.

Funkciji BENCHMARK () možete proslediti i tekst upita, na primer:

select benchmark(lOOOOOOO, 'select employee.name, department.name from employee, department where employee.departmentiD=department.departmentiD');

Upotreba dnevnika sporih upita . v • •

Pomoću dnevnika sporih upita možete utvrditi koji se upiti presporo IzvrsavaJU. S~nu ddinišete šta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU vrednost.

upotreoa komande EXPLAIN za prikazivanje načina na koji sc upili l1vr .!Valu

Beleženje sporih upita u dnevnik možete uključiti pomoću opcije --log- slow -queries=imedatoteke, koju zadate kada pokrećete MySQL, ili u datoteci opcija. Ako uključite i opciju --log-long-format, biće evidentirani i svi upiti pri čijem sc izvršavanju ne koristi nijedan indeks. To vam može pomoći da lakše utvrdite čemu treba da f>osvetite najviše pažnje pri optimizovanju.

Zadavanjem vrednosti promenljivoj long_query_time određujete šta je za vas spor upit. Možete je zadati u konfiguracionoj datoteci ili pomoću komande SET.

Vrednost te promenljive izražava se u sekundama. Dnevnik sporih upita možete čitati neposredno jer je to obična tekstualna datoteka.

Možda ćete smatrati korisnijim sažet spisak upita koji se sporo izvršavaju. Takav spisak možete prikazati pomoću skripta mysqldumpslow (u direktorijumu scripts instalacije MySQL-a). Pošto je to skript napisan na jeziku Perl, ako koristite Windows, morate prethodno instalirati Perl ukoliko gaj oš nemate. (Preuzmite ga sa adrese www. active­state. com.)

Jedno od tekućih ograničenja MySQL-ajeste to da ne beleži spore upite čije izvršavanje traje manje od sekunde. Na sistemima koji obrađuju relativno veliki broj jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator će možda želeti da zna kojim je upitima potrebno više od desetinke ili nekog drugog dela sekunde. To će biti obezbeđeno u jednoj od budućih verzija MySQL-a.

Upotreba komande EXPLAIN za prikazivanje načina na koji se upiti izvršavaju Komanda EXPLAIN nalaže MySQL-u da "objasni" kako namerava da izvrši upit. Kao jednostavan primer, možete zadati sledeće:

explain select e.name, d.name from employee e, department d where e.departmentiD = d .departmentiD;

Kao što vidite, ispred jednog sasvim običnog upita samo smo dodali re č EXPLAIN.

Zbog toga se upit neće izvršiti,jedino će se prikazati podaci o tome kako MySQL pla­nira da izvrši upit. Trebalo bi da se prikažu rezultati nalik na sledeće: ... --- +·------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+ 1 id 1 select_type 1 table l type l possible_keys l key l key_len l ref l rows l Extra l +---- +------------- +------- +------- -+-------------- -+--- ----- -+- -------- +--------------- -+------ +------ -+ l l l SIMPLE l e l ALL l NULL l NULL l NULL l NULL l 5 l l l 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)

Šta sve ovo tačno znači? Uočljivo je da se u skupu rezultata pojavljuje po jedan red za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim će tabele biti s po jene u upitu.

Page 124: Prirucnik Za MySQL

Tabela rezultata ima sledeće kolone:

• id Redni broj. Ako jedan upit sadrži više komand1 !.J EI .EC"I' - 11 ,1 JliiiiH:I, bd.1 je u upit ugrađen podupit- svaka komanda SELECT dobtj.l SV<~J rL·dni broj .

• select type Vrsta komande SELECT koja se izvršava. U već ini s lu čajeva, ova kolona ~adržaće reč SIMPLE, kao u prethodnom primeru, što zna či daje u pitanju sasvim običan upit SELECT. Ako imate podupite, spoljni upit će biti označen rečju PRIMARY a unutrašnji upiti biće označeni rečima SUBSELECT ili DEPENDENT SUBSELECT u slučaju koreliranih upita.

• table Ime tabele na koju se red odnosi . • type Ovo je najvažnija kolona pri optimizovanju i prikazuje na koji će način

tabela biti spojena s drugim tabelama u upitu. • possible_keys Ova kolona pokazuje koji bi se indeksi mogli upotrebiti u

upitu. Ako nema nijednog upotrebljivog indeksa, u ovoj koloni prikazuje se reč

NULL. • key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nije­

dan, u koloni se prikazuje reč NULL.

• key len Dužina indeksa koji je MySQL odlučio da upotrebi.

• ref Vrednost s kojom se poredi sadržaj kolone ključa pri odlučivanju koji se

redovi izdvajaju u skup rezultata upita. • rows Pro cena broja redova koje će MySQL morati da pročita iz jedne tabele da

bi se dobio rezultat upita. Množenjem vrednosti broja redova možete utvrditi koliko će redova biti učitano. Time dobijate red veličine brzine izvršavanja upita.

• Extra Ova kolona može sadržati dodatne podatke. Na primer, komentar using index zači da MySQL može u potpunosti učitati rezultate upita iz jednog od indeksa i nema potrebe da učitava podatke iz tabele.

Dakle, šta nam rezultati govore u ovom primeru? Tip spoja ALL za tabelu employee znači da će biti pretraženi svi redovi te tabele.

Razume se, to će biti spora operacija ako tabela sadrži veliku količinu podataka. U stvari, spoj tipa ALL je najgori mogući rezultat. Njega ćete dobiti kad god tabela nema nijedan indeks koji bi se mogao upotrebiti u upitu. Očigledna optimizac4ija u tom slu­čaju jeste da dodate odgovarajući indeks. To je objašnjeno u nastavku ovog poglavlja.

U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, što znači da će se iz tabele department učitati po jedan red za svaki red iz tabele employee. To je jedan od najboljih tipova spojeva. Jedine bolje vrednosti u koloni type _su system i cons t, što znači da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da sc zato ta tabela može tretirati u upitu kao konstanta. Tekući tip spoja u upitu prilično nam odgovara.

•••y-'u'--uv uyraaen1 mehamzam optimizovanja upita

Ovo su ostale vrednosti koje se mogu pojaviti u koloni type:

• ref Iz tabele će biti učitani svi redovi koji sadrže vrednosti jednake vredno­stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj radite s ključevima čije vrednosti nisu jedinstvene .

• range Ovaj tip spoja je slabiji od tipa eq_ref , pa čak i od ref, a znači da će iz tabele biti učitani svi redovi iz odredenog opsega.

• index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo­jeva. Kada se prikaže tip index, to znači da će biti pretražen ceo indeks. To je bolje od pretraživanja cele tabele, ali daleko je od savršenog.

Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department prikazana je opcija PRI MARY i ime kolone primarnog ključa, što je kolona ključa koja će biti upotrebljena. Red tabele employee sadrži vrednost NULL u obe navedene kolone, što znači da nema ključa koji se može upotrebiti i zato neće biti upotrebljen nijedan. To je još jedna prilično jasna naznaka da tabeli treba dodati nov indeks!

Na osnovu tih podataka i pod pretpostavkom da će taj upit biti relativno često izvršavan, pa bismo zbog toga želeli da bude brži, napravićemo sledeći indeks:

create index ename_did on employee(name, departmentiD);

Ako ponovo izdamo komandu EXPLAIN, rezultati izgledaju ovako: +--- -+--- --------- -+------ -+---- ---- +-------------- -+---------- -+- ------- -+--- ------------ -+----- -·-------- ---- -· l id l select_type l table l t ype l possible_keys 1 key l key_len l ref 1 rows 1 Extra 1 +--- -·--- ---------- +----- --+-- -- --- -·----- --------- -+-- -------- -+-------- -+------- ------- --+----- -+----- ------- -+ l l l SIMPLE l e l index l NULL l ename_did l 85 1 NULL 1 S l Using index l l l l SIMPLE l d l eq_ref l PRIMARY l PRIMARY l 4 l e.departmentiD l l l l +---- +---- -------- -+--- --- -+--- ---- -+---- ------- -- --+- ----- ---- -+------ -- -+--------------- -+- ---- -+----- ------- -+ 2 rows in set (0. OO sec)

Promene su očigledne. U redu tabele employee sada stoji daje tip spoja index jer postoji indeks koji se može upotrebiti . Novi indeks je naveden kao moguć ključ , ali neće biti upotrebljen. U koloni Extra stoji da će za tu tabelu biti upotrebljen indeks umesto same tabele, zahvaljujući čemu bi trebalo da upit bude nešto brži.

Najčešća upotreba komande EXPLAIN jeste za utvrđivanje da li biste pomoću bolje osmišljenih indeksa mogli da ubrzate upite, ali otkrićete da se to može postići i na druge načine.

MySOL-ov ugrađeni mehanizam optimizovanja upita MySQL prim.enjuje na upite više pravila optimizovanja.

Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL utvrđuje koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro­cena pogrešna, odredbom STRAIGHT JOIN izričito zadajte redosled spajanja tabela. Merenjem performansi upita pre i posle te izmene, utvrdićete da li time stvari pobolj šavate ili pogoršavate.

Kada bira indeks, MySQL traži odgovarajući indeks koji obuhvata manje od 30"/u redova tabele . Ako ne uspe da pronađe indeks koji ispunjava te uslove, sekvenCIJalno pretražuje tabelu. (To je vidljivo iz rezultata komande EXPLAIN za prethodni pttiiH"I

upita, nakon dodavanja novog indeksa.)

Page 125: Prirucnik Za MySQL

18 Poglavlje 19 Optimizovanje upita

Izrazi u odredbama WHERE optimizuju se na način sličan onome na koji mnogi pre­vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvišne zagrade. To je jedan od razloga zbog kojih možete slobodno dodavati zagrade u tekst upita da bi postao lakše razumljiv.

Ako se potpun rezultat upita može dobiti iz podataka sadržanih u indeksima, iz tabela se neće u čitati nijedan red. Rezultat funkcije COUNT ( *} takođe se dobija bez čitanja i prebroja vanja redova tabele jer su podaci potrebni za tu namenu smešteni odvojeno od tabele (u indeksu).

Budući da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija koje MySQL obavlja, ovde ga nismo ponovili. Ali čak i taj spisak nije potpun. Ako vas zanima kako radi optirnizator upita, možete čitati njegov izvorni kod.

Preporuke za optimizovanje upita Postoje tri najvažnije stvari koje možete uraditi da biste optimizovali svoje upite:

• Dodajte odgovarajuće indekse. Ako imate upit nad neindeksiranom kolo­nom koji se često izvršava, dodajte indeks za tu kolonu. Više informacija o tome kako MySQL koristi indekse naći ćete u poglavlju 18, "Optimizovanje baze podataka". Međutim, ne zaboravite sledeće: iako odgovarajući indeks može ubrzati postupak pronalaženja podataka u tabeli, održavanje indeksa u ažurnom stanju produžuje upisivanje podataka. Nemojte dodavati indekse koji se neće koristiti.

• Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana u poglavlju 18.) Time ažurirate podatke o raspodeli vrednosti ključeva koje MySQL čuva. Na osnovu tih podataka, MySQL određuje redosled spajanja tabela u upitu. Ako vam se čini da MySQL spaja tabele čudnim redosledom, pokušajte s komandom ANALYZE TABLE.

• Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i ažuri­rate statističke podatke o tabeli koje koristi optimizator upita.

Sažetak • Otkrijte spore upite pomoću funkcije BENCHMARK (} ili dnevnika sporih upita.

• Pomoću komande EXPLAIN utvrdite kako se upiti izvršavaju

• Ubrzajte izvršavanje upita dodavanjem indeksa a zatim ih ponovo ispitajte pomoću komande EXPLAIN.

• Komande ANALYZE TABLE i OPTIMIZE TABLE pomoći Će MySQL-ovom optimi­zatoru upita da dobro obavi svoj posao.

Pitanja 1. funkcija BENCHMARK () vraća

a) rezultat izraza čije izvršav;liiJL' llll'JII• ·

b) vreme potrebno za izvršavanJL' lllollol ~"JI 1111 JilL

e) nulu, bez obzira na ulazne JW .IIIH'IIl'

d) nijedno od prethodnog

2. Izda·li· ste k?mandu EXPLAIN za odredeni up1t 1 11 ~ 11 10111 1 YI' 1, ,j 11 ,

1111 1 d orl

1 dob1h ste t1p spoja ALL. To znači

a) da će iz tabele biti učitan samo jedan IL'd

b) d~ će ~z tabele biti učitani svi redovi koji sadrže vredu osti JL'd.111 kt· VH·dnn st1ma mdeksa

e) da će biti sekvencijalno pretražen ceo indeks

d) da će biti sekvencijalno pretražena cela tabela

3. Izd~i ste k?man~u EXPLAIN za određeni upit i u koloni type jedne od tabela dob1h ste t1p spoja eq ref. To znači

a) da će iz tabele biti u čitan samo jedan red

b) d~ Će ~z tabele biti u čitani svi redovi koji sadrže vrednosti jedanke vredno­stlma mdeksa

e) da će biti sekvencijalno pretražen ceo indeks

d) da Će biti sekvencijalno pretražena cela tabela

4. Izda.li ste k?mandu EXPLAIN za određeni upit i u koloni type jedne od tabela dob1h ste t1p spoja index. To znači

a) da će iz tabele biti učitan samo jedan red

b) da će ~z tabele biti učitani svi redovi koji sadrže vrednosti jedanke vredno­Stlma mdeksa

e) da će biti sekvencijalno pretražen ceo indeks

d) da će biti sekvencijalno pretražena cela tabela

S. ~ezultati komande EXPLAIN pokazuju da MySQL spaja dve tabele neoptimal-mm redosledom. Zbog toga bi trebalo da

a) izdate komandu ANALYZE TABLE za obe tabele

b) izričito zadate redosled spajanja pomoću odredbe STRAIGHT JOIN

e) ili a) ili b)

d) ni a) ni b)

Page 126: Prirucnik Za MySQL

240 Poglavlje 19 Optimizovanje upita

Vežbe Pogledajte sledeći upit:

select department.name from client, assignment, employee, department where client.name='Telco Inc' and client.clientiD = assignment.clientiD and assignment.employeeiD = employee.employeeiD and employee.departmentiD = department.departmentiD;

Pomoću funkcije BENCHMARK više puta izmerite vreme izvršavanja ovog upita i pomoću komande EXPLAIN utvrdite kako se on izvršava. Proverite da li možete povećati brzinu izvršavanja dodavanjem novog indeksa i ponovnim merenjem.

Odgovori

Pitanja 1. e

2. d

3. a

4. e

5. e

Spisak termina korišćenih u knjizi

alijas alias nedelji vost atribut, obeležje attribrtle niti izvršavanja b-stablo b-tree obeležje, atribut bafer za čitanje read bt!!Jer ostava za tabele bafer za ključeve key br"!!fer otpornost sistema bafer za sortiranje sort br!ffer na greške bafer za zapise record br!lfer podu pit blokiranje sledećeg next key /ocking polje

ključa poništiti čitanje sadržaja tabele table scan potvrditi

sekvencijalnim preklapanje između redosledom dva servera

datoteka slike sta~a dumpfile "na vruće" Dekartov proizvod Cartesian product prenosni dnevnik dnevnik grešaka error log pretraživa~e

dnevnik izmena binary log od korena dnevnik sporih upita slow query log pun spoj, dnevnik upita query log unakrsni spoj fantomski podaci phantom reads rad sa više glavnih funkcionalna functional servera istovremeno

zavisnost dependency raspoređivanje

glavni server master opterećenja

jednakovredni spoj equijoin red jezik za definisanje Data Diftnition sistem za upravljanje

podataka Language, DDL relacionim bazama jezik za rad Data Manipulation podataka

s podacima Language, DML slog, zapis kandidati za ključeve candidate keys spoJ ključ key spoljni ključ koeficijent poveza- relevance value superključ

nosti s traženim Šema baze podataka poJmOm tabela

kolona column ugnežđen upit korelira n correlated unakrsni spoj, mašina za skladištenje storage engine pun spoJ merenje performansi benchmarking zapis, slog n-torkc tup/es zavisni server nebitne reči stop words

SVEUCIIlŠNA l<Nl\ŽN\0\ Rl J KA

atomicity thread s attribute table cache fau/t tolerance

subquery field roll back commit fa ilo ver

re/ay log stemming

full join

multimastering

load balancing

row Relational Database

Management System, RDBMS

record join foreign key superkey database schema table nested query full join

record slave

Page 127: Prirucnik Za MySQL

Simboli

l (deljenje), operator, 110 = (jednako), operator, 111 A (karet), znak, 116 <(manje od), operator, 111 \ (obrnuta kosa crta), 67 -(oduzimanje), operator, 110 + (sabiranje), operator, 110 ; (tačka i zarez), 46 >(veće od), operator, 111 $(znak za dolar),116 * (zvezdica), 110, 116

Brojevi

1NF (prva normalna forma), 34-36

2NF (druga normalna forma), 36-37

3NF (treća normalna forma), 37-38

A

abs(), funkcija, 118 ACID usklađenost, transakcije,

149-150 activestate.com, Web lokacija, 235 adddate(),funkcija, 119 administriranje baze podataka

datoteke dnevnika, 183 MySQL server, pokretanje

i spuštanje, 177-178 pražnjenje ostava, 182-183 prikazivanje podataka o bazi,

178-180 prikazivanje podataka

o dodeljenim pravima, 181 prikazivanje podataka

o procesima, 181 prikazivanje podataka o tabelama,

181-182 prikazivanje statusa servera

i vrednosti serverskih promenljivih, 180

skript mysqladmin,lista opcija, 184

uništavanje niti, 182 alijasi, komanda SELECT, 82-83 ALL, pravo, 160 ALL, rezervisana reč, 102 ALTER TABLE, komanda, 56-57 ANALYZE TABLE, komanda, 230,

238 AND, operator, 112 anomalije

pri ažuriranju podataka, 34 pri brisanju podataka, 34 pri dodavanju podataka, 33

anonimni nalozi, brisanje, 17, 202-203

ansi, opcija, podešavanje MySQL-a, 172

ANY, rezervisana re č, 102 aplikacije, provera ulaznih

podataka, 204 aritrnetički operatori, 110 atributi, tabele baze podataka, 31 AUTO INCREMENT, rezervisana

reč, 49-51 autocornmit, režim rada

transakcija, 147 AVG ROW LENGTH, opcija,

optirnizovanje tabela, 51 avg(), funkcija, 122 ažuriranje redova tabela, 72-73

B

BACKUP TABLE, komanda, 194 bafer za čitanje, 224 bafer za ključeve, definicija, 223 bafer za sortiranje, 224 baferi, 223 basedir, opcija, podešavanje

MySQL-a, 172 baze podataka

adtninistriranje datoteke duevuika, 183 MySQL server, pokretmlje

i spuftmlje, 177-17 8 pra:bljetlje ostava, 182-183 prikazivmlje podataka o bazi,

178-180 prikazivmlje podataka o

dodeljeuim pravima, 181 prikazivmlje podataka o procesima

181 ' prikazivanje podataka o tabelama,

181-182 prikazivatlje statusa servera

i vreduosti serverskih promeuljivih, 180

servers ke promeuljive, pode!avatlje, 182

skript mysqladmiu, lista opcija, 184

utli!tavarlje uiti, 182 biranje, 43 brisanje, 56 entiteti, definicija, 29 identifikatori

dozvoljeu broj zuakova, 43 rwvoduici, 43 rezervismJe reli, 4 3

indeksi brismlje, 56 izrada, 55-56

Indeks

izrada rezervnih kopU.1 i restauriranje podatak:l

komauda BACKUI'TilBL/i, 194

komauda RESTORE TABLI' 194 .•

mogubwsti, 187-188 pomo{u duevuika iz meua,

194-195 mči1o, 19 3-194 skript mysqldump, 188-192 skript mysqlhotcopy, 192- 193 tabele, proveravmlje i popravljmljc,

195-198 testirmlje rezervtle kopije, 19 5 zaklju{avatlje tabela, 18 8

izrada, komanda CREATE DATABASE, 43

komanda ANALYZE TABLE 230 •

optimizovanje iudeksi, 229-230 izbori pri projektovarlju, 228 komat~da OPTIMIZETABLE

230 • preporuke, 227-228

principi projektovanja auomalije, 33-34 twrmalizovatlje, 3 4-3 8 NULL vreduosti, 34 reduudmlttwst i gubljetlje

podataka, 33 važua pitmy·a, 32

relacije d~f/uiciia, 29 tipa ,Jeda tl prema jed au", 2 9 tipa .,jeda tl prema viJe", 2 9 tipa" više prema vi! e 11

, 2 9 rep likovanje

beziJedtlostle mere, 211 budt.tbwst, 216 d11evuik izmwa, 21 O dodeljivatlje prava za, 211 kopije teku{eg stmy·a, pravljery·e,

212-214 otpomost Ila gre!ke, 209 preklapatlje servera 11a vm{e, 217 pri11cipi, 209-21 O p rovera glavtwg servera, 2 12 raspoređivatlje opterdetlja, 2 15 upotrebljive verz;;e MySQL·tt,

210 vifestn1ki glav11i serveri, 2 17 zavistti serveri, pode!mm1~je

i pokretmlje, 2 14 sistem za upravUanjc rci.Ki<lllllll

bazama podat.1k.1 (RDBMS),11

šema, dcfink•J-•, l~

Page 128: Prirucnik Za MySQL

4 Indeks

tabele ALTER TABLE, 56 atribwi, 31 BerkeleyDB (BDB), 50, 135 brisanje, 5 6 fimkcioualne zavisnosti, 32 gmptw r111ofenje podataka, 7 3-7 5 HEAP, 50, 138 indeksi, 229-230 lmwDB, 50, 134-135 ISAM, 50, 128-129 ključevi, 31 ko/otre, 31, 52-55, 80 komanda CREATETABLE,

48-52 MERCE, 136-137 merge, 50 MylSAM, 50, 129-134 uovi redovi, umeta11je, 65-69 n-torke, 31 podrfka za tramakcije, 127-128 pod11piti čiji Je rezultat Jedna

vrednost, tao-t 01 podupiti za izraze logitkog tipa,

101-103 pod upiti za izvedme tabele, 1 OO pra"", 161-164 prav!ietife, 44-52 preimeiiOIJ(Itife, 57 redovi, 31 redovi, azurirmife, 72-7 3 redovi, brismife, 7Q-72 redovi, brismife pomoću koma11de

TRUNCATE, 72 redovi, drtpliralli, 84-86 redovi, učita""tife, 83-84 redovi, zameua, 70 redovi rezulltZta upittr,gmpismy·e,

86-87 spa)m!je, 95-99 stnrktura, metifmife, 56-57 zada""•ife imena u kommrdi

SELECT, 81-82 zapisi, 31

zadavanje apsolutnih in1ena., 81-82

BCNF (Boyce-Coddova normalna forma), 38

DDB (Berkeley), tip tabela, 50, 135 benchmark(), funkcija, 121, 234 llcrkeleyDB (BDB), tip tabela, 50,

135 IIIGINT, celobrojni tip podataka,

53 hin, dlrektorijum, 20 IIINARY, rezervisana reč, 111 hir<~ nje

b.t7C podataka, komanda use, 43 u č itavanje podataka iz redova

tn bela, 83-84 DLOB, tip podataka, 54 Doyce-Coddova normalna forma

(DCNF),38 hrh<~njc

.11tnn11nr11h naloga, 17, 202-203 h.".1 p<><b t,,ka, 56

indeksa, 56 redova iz tabela, 7Q-72 tabele, 56

brisanje redova, komanda TRUNCATE, 72

brojevi s pokretnim zarezom, 48 b-stabla, 135

e CASE, funkcija, 113 cast, funkcija, 120 ceiling(), funkcija, 118 celo brojni tipovi podataka, 52 CHAR, tip podataka, 53 CHECK TABLE, komanda, 196 CHECKSUM, opcija,

optimizovanje tabela, 51 ciklična promena datoteka

dnevnika, 183 column_priv, kolona

tabela columns_priv, 164 tabela tables_priv, 164

colum.ns_priv, tabela, prava pristupa, 164

COMMENT, komanda optimizovanje tabela, 51

conv(), funkcija, 114 convert(), funkcija, 120 count(), funkcija, 122 CREATE, pravo, 159 CREATE DATABASE, SQL-ova

komanda, 43 CREATE TABLE, SQL-ova

komanda, 44, 48-52 CREATE TEMPORARY TABLES,

pravo, 159 CSV format, 75 curdate(), funkcija, 119 curtime() funkcija, 119

D

data, direktorij um, 20 Data Definition Language (DDL),

42 DATA DIRECTORY, opcija,

optimizovanje tabela, 51 Data Manipulation Language

(DML), 42, 65 datadir, opcija, podešavanje

MySQL-a, 172 DATETIME, tip podataka, 55 datoteke

dnevnika, 183 slike stanja, 188

datoteke opcija, podešavanje MySQL-a, 169-171

internacionalizovanje, 174 konfiguracione opcije za više

inst.:llacija na istom računaru, 173-174

mysqld, podešavanje opcija za, 171-172

opcije za InnoDB, 172-173

datumski tipovi podataka, 54 dayname(), funkcija, 119 db, tabela, prava pristupa, 163 DDL (Data Definition Language),

42 Decimal, tip podataka, 52 DEFAULT, odredba, komanda

INSERT,69 DEFAULT, rezervisana reč, 49 defragmentiranje MyiSAM tabele,

130 DELAY KEY WRITE opcija,

optimizovanje tabela, 51 DELAYED, odredba, komanda

INSERT, 68 DELETE, komanda, 7Q-72 DELETE, pravo, 159 deljenje (/),operator, 110 describe, komanda, 48 desni spoj, 98-99 dinamičke MyiSAM tabele,

129-130 DISTINCT, odredba, komanda

SELECT, 84-86 DML (Data Manipulation

Language), 42, 65 dnevnici

aktiviranje, 183 dnevnik grešaka, 183 log-bin, opcija, podešavanje

MySQL-a, 172 log-error, opcija, podešavanje

MySQL-a, 172 log-slow-queries, opcija,

podešavanje MySQL-a, 172 opcije za dnevnike izmena,

podešavanje MySQL-a, 173 prenosni, 21 O sporih upita, 183, 234-235 u Linuxu, 183 upita, 183

dnevnik izmena opis, 183 rep! i kovanje, 21 O restauriranje baze podataka,

194-195 does, direktorij um, 20 dodeljivanje prava, 157

globalna prava, 160 prava za administratore, 159 prava za obične korisnike, 159 tabele prava, 161 za pojedinačne baze podataka, 160 za pojedinačne kolone, 161 za replikovanje, 211

dolar($), znak, 116 DOUBLE, tip podataka, 53 drop database, komanda, 45, 56 DROP INDEX, komanda, 56 DROP TABLE, komanda, 56, 191,

194 DROP, pravo, 160 druga normalna forma (2NF),

36-37 dupli rani redovi, 84-86

E

Ernie Application Cluster, alatka, 217

encrypt(), funkcija, 121 entiteti,definicija,29 ENUM, tip podataka, 54 EXECUTE, pravo, 159 EXISTS, rezervisana reč, 102 EXPLAIN, rezervisana reč, podaci

o izvršavanju upita, 235-237 extra, vrednost, komanda

EXPLAIN, 236 extract(), funkcija, 119

F

fantomski podaci, nivo izolovanosti transakcija, 151

FIELDS, odredba, komanda LOAD DATA INFILE, 74

FILE, pravo, 160,203 filtriranje ulaznih podataka,

bezbednosne preporuke, 204 FLOAT, tip podataka, 53 float, tip podataka, 48 floor(), funkcija, 118 FLUSH, komanda, pražnjenje

ostava, 182-183 FLUSH PRIVILEGES, komanda,

202-203 FLUSHTABLES, komanda, 137,

193 FOREIGN KEY, rezervisana reč,

50 found rows(), funkcija, 121 fragmentacija, My ISAM tabele,

130 FROM, odredba

podupiti, za izvedene tabele, 100 spojevi, 94

FULLTEXT rezervisana reč, 50 funkcije

abs(),118 a ddda te(), 119 avg(), 122 benchmark(), 121 , 234 CASE, 113 cast, 120 ceiling(), 118 concat(), 114 convert(), 114,120 counc(), 122 curdate(), 119 curtime(), 119 dayname(), 119 encrypc(), 121 extract, 11 9 floor(), 118 found rows(), 121 grupne, 121-122 IF, 113 last insert id(), 121 length(), 114 LIKE,115 load file, 114 locate(), 114

lower(), 114 MATCH,115 max(),122 md5(),121 min(), 122 mod(),118 now(),119 numeričke, 117-118 operatori

aritmetitki, 11 O logitki, 112 za poredetife vred11osti, 11 Q-112

password(), 121 power(), 118 quote(), 114 rand(), 118 replace(), 114 RLIKE,115-117 round(),118 soundex(), 114 sqrt(), 118 std(), 122 STRCMP,115,117 subdate(), 119 substring(), 114 sum(), 122 timestamp, 119 trim(),114 ugrađene, 109 upper(), 114 z.'l rad s datumima i vremen itna,

119-120 za rad sa znakovnim vrednostima

obrada zuakovuih vreduosti, 114 poredenje ztrakovuih vred11osti,

115-117 za upravljanje tokom izvrlavanja,

113 funkcije za rad s datumima

i vremenima, 119-120 funkcije za upravljanje tokom

izvršavanja, 113 funkcionalne zavisnosti, koncepti

i terminologija, 32

G

glavni serveri, replikovanje, podešavanje, 209-212, 215

globalna prava dodeljivanje, 160 zaštita servera, 202

Google, Web lokacija, 135 GRANT, komanda

odredba IDENTIFIED BY, 158 odredba ON,158 odredba REQUIRE, 159 odredba TO, 158 odredba WITH, 159 odredba WITH GRANT

OPTION,159 grantor, kolona, tabela tables_priv,

164 GROUP BY, odredba, komanda

SELECT, 86-87 grupisanje redova rezultata upita,

86-87

grupnt• luni. t ll•, l J l l grupno ttOHINtlt pn1l11ltt~n, gubljenjo• (llHiucul.,, l

redunduutuw•t.sunJ• k tn ~~~J baza pothohol.u, l l

H

Hafmanovo kodirnnjt•, komprimovanjt.• litlwl1t, l' l

HAVING, odredba, konmnolu SELECT, 87

HEAP, tip tabela, 50, 138 host, tabela, prava pristupa

kolone za opseg vidljivmu, l (1 ,\

kolone za prava, 163

I

id, opcija, komanda EXPLAIN, 236

IDENTIFIED BY, odredba, komanda GRANT, 158

identifikatori maksimalan broj znakova, 43 navodnici, 42 razlikovanje malih i velikih slov:1,

42 rezervisane reči, 43

IF, funkcija, 113 IF NOT EXISTS, odredba, 49 IGNORE, odredba

komanda INSERT, 69 komanda LOAD DATA IN FILE,

74 komanda UPDATE, 72

IN, rezervisana reč, 101 indeksi

brisanje, 56 izrada, 55-56 jednokolonski, 229 levi kraj grupe, 229 optimizovanje baze podataka, 227,

229-230 optimizovanje upita, 238 višekolonski, 229

INDEX, rezervisana reč, 50 INDEX, pravo, 159 index, vrednost, komanda

EXPLAIN, 237 INDEX DIRECTORY, opcija,

optimizovanje tabela, 51 InnoDB, konfiguracione opcije,

podešavanje MySQL-a, 172-173

lnnoDB, tip tabela, 50 dosledno učitavanje bez

zaključavanja pod1caka, 134 transakcije, 143-146

ACID uskladeuost, 149-/50 izolo""11ost tmn<akcij11, 150- 152 reZi lli đlltOCOrtllllit, J 47- /49

uslovi licence, 135 Web lokacij.t, 135 zaključavanje pud.t1.t~.1 11,1 IIIVnll

rcd.t, 13-1

Page 129: Prirucnik Za MySQL

Indeks

INSERT, komanda listing, 6S-66 odredbe, 68-69 opšti oblik, 68 primer rezultata, 67

INSERT, pravo, 1S9 INSERT METHOD, opcija,

optirnizovanje tabela, S1 instaliranje MySQL-a

anonimni nalozi, brisanje, 17 lozinka korisnika root, zadavanje,

17 na Linux, 12 naOSX,14 naWindows,12-14 nalozi, pravljenje za uobič~ene

poslove, 17-18 podešavanje sistema, 14-16 provera da li sistem radi, 16-17

instalirane datoteke, zaštita filtriranje podataka, 204 ftzička zaštita, 20S preporuke, 203 pristup i prava upotrebe, 204 provera ulaznih podataka

u aplikaciji, 204 SSL (Secure Sockets Layer), 20S

internacionalizovanje, podešavanje MySQL-a,174

ISAM tabele, SO ograničenja, 129 pregled, 128

izbori pri projektovanju, optimizovanje baze podataka, 228

izolovanost, nivoi (transakcije), 1SO

fantomski podaci, 1S1 prljavi podaci, 1S2 read committed, 1S1 read uncommitted, 1S2 repeatable read, 1 SO serializable, 1SO

izrada baze podataka, komanda

CREATE DATABASE, 43 HEAP tabela, 138 indeksa, SS-S6 kopije tekućeg stanja,

replikovanje, 212-214 naloga, za uobičajene poslove,

17-18 tabele

komanda CREATE TABLE, 44, 48-52

opcije za optimizovanje, 51 primer baze podataka employee,

44-48 izrada rezervnih kopija i

restauriranje podataka komanda BACKUPTABLE,194 komanda FL USH TABLES, 193 komanda LOCKTABLES,193 komanda R.ESTOR.ETABLE,

194 mogućnosti, 187-188

pomoću dnevnika izmena, 194-19S

razlozi, 1 87 ručno, 193-194 skript mysqldump

nedostaci, 192 opcija --add-drop-table, 191 opcija --add-locks, 191 opcija --all-databases, 192 opcija --allow-keywords, 192 opcija --d, 192 opcija --databases, 192 opcija --extmded-imert, 191 opcija --lock-tables, 192 opcija --no-data, 192 opcija --opt, 18 8 opcija --quick, 191 predtwsti, 192 primer rezultata, 188-191

skript mysqlhotcopy, 192-193 tabele, proveravanje i popravljanje

komanda CHECKTABLE, 196 kommzda REPAIR TABLE, 196 mogućnosti, 195 program myisamchk, 196-198 program mysqlcheck, 197

zaključavanje tabela, 188 testiranje kopije, 19S

izvršive datoteke, MySQL-ove, 20-21

J jednako (=), operator, 111 jednakovredni spojevi, 97 jednokolonski indeksi, 229

K

kandidati za ključeve, 31 karet (A), znak, 116 key, vrednost, komanda

EXPLAIN, 236 key _len, vrednost, komanda

EXPLAIN, 236 ključevi, kandidati za ključeve

i superključevi, 31 kolone tabela

datumski i vremenski tipovi podataka, S4

ključevi, superključevi, 31 numerički tipovi podataka, S2-S3 opcija unique, SO tabela baze podataka, 31 tabela columns_priv, 164 tabela db, 163 tabela host

kolone za opseg vidlj"ivosti, 163 kolone za prava, 163

tabela tables_priv, 164 tabela user

kolone za ograni{avonje upotrebe resursa, 162

kolone za opse.(! vidlj"ivosti, 162

kolone za pravo, 162 kolatze za uspostavlj"anje zaftićene

veze, 162 učitavanje podataka iz odredenih

kolona, 80 znakovni i tekstualni tipovi

podataka BLOB, 54 CI-JAR, 53 ENUM, 54 SET, 54 TEXT, 54 VARCHAR,54

kolone za ograničavanje upotrebe resursa, tabela user, 162

kolone za uspostavljanje zaštićene veze, tabela user, 162

komande. Videti i naredbe ALTER TABLE, S7 ANALYZE TABLE, 230,238 CHECKTABLE,196 COMMIT, transakcije, 147 drop database, 4S, S6 DROP INDEX, S6 DROPTABLE,S6,194 EXPLAIN, 23S-237 FLUSHTABLES,137, 193 FLUSH, pražnjenje ostava,

182-183 LOCKTABLES,148-149,193 OPTIMIZE TABLE, 130, 230,

238 REPAIR TABLE, 130,196 R.ESET, pražnjenje ostava,

182-183 SET

aktiviranje datoteka dnev11ika, 183

režim autocommit, isklj'u{ivmije, 147

SHOW,23,180 START TRANSACTION, 147 UNLOCKTABLES, 148-149

komprimovanje concatQ, funkcija, 114 MyiSAM tabele, 131

kopije tekućeg stanja, pravljenje, 212-214

korisnički interfejsi MySQL Control Center, 21 MySQL monitor, 21-23 phpMyAdmin, 21

korisnički nalozi. Videti i prava anonin1ni nalozi, brisanje,

202-203 anonimni, brisanje, 17 bezbednost

auouinwi Halozi, brismije, 17 pravljenje za uobič~ene poslove,

instaliranje MySQL-a, 17-18

zaštita attmzinwi ualozi, brisanje,

202-203 lozi11kd z a tzalo_q root, 202 opmm1 JlhH.~tr , 20.1 .(i(t·oiW/JI' lo i11k•l, ?OJ

L

last insert id(), funkcija, 121 length(), funkcija, 114 levi spoj, 98-99 LIKE, funkcija, 11S LIKE, odredba, 49 LIMIT, odredba

komanda DELETE, 72 komanda SELECT, 88-89 komanda UPDATE, 72

LINES, odredba, komanda LOAD DATA INFILE, 74

Linux, instaliranje MySQL-a na, 12 listinzi

baza podataka, formiranje tabela, 44-4S

instaliranje MySQL-a, konfiguracione opcije, 14-16

izrada rezervnih kopija i restauriranje podataka, skript mysqldump, 188-191

MERCE tabele, 136-137 podešavanje MySQL-a, rešenje s

datotekom opcija, 169-171 primer komande INSERT, 6S-66

LOAD DATA INFILE, komanda, 73-7S

load file(), funkcija, 114 locate(), funkcija, 114 LOCK TABLES, komanda,

148-149,191,193 LOCK TABLES, pravo, 1S9 logički operatori, 112 logičko tekstualno pretraživanje,

133-134 long_query _time, promenljiva

(dnevnik sporih upita), 23S LOW PRIORITY, odredba

komanda DELETE, 72 komanda INSERT, 68 komanda LOAD DATA INFlLE,

74 komanda UPDATE, 72

lower(), funkcija, 114 lozinke

šifrovanje, 203 za nalog root, 17, 202

M

maksimalan broj znakova, identifikatori, 43

manje od (<),111 MATCH, funkcija, 11S max(), funkcija, 122 mdS(), funkcija, 121 MEDlUMINT, celobrojni tip

podataka, S3 mcrenje performansi, upiti, 234 MERGE, tip tabela, 136-137 merge, tip tabela, SO MIN ROWS, opcija,

optimizovanje tabela, S1

min(), funkcija, 122 množenje (*),operator, 110 mod(), funkcija, 118 My ISAM, tip tabela, SO

dinamičke, 129-130 komprimovanje, 131 poboljšanja u odnosu na ISAM

tabele, 129 popravljanje, 130 pregled, 129 statičke, 129-130 tekstualno pretraživanje, 131-134

myisamchk, ala tka za komandnu liniju, 130

myisamchk, program, 20, 196-197 MySQL

instaliranje, 9, 11 auonimtzi tuzlozi, brisanje, 17 lozi11ka korimika root, zadava11je,

17 Ila U11ux, 12 na OS X, 14 11a Windows, 12-14 nalozi, pravlj"e11je za uobi{ajene

poslove, 17-18 podefavo1zje sistema, 14-16 provera da li sistem radi, 16-17

izvršive datoteke, 20--21 korisnički interfejsi

MySQL Control Ce11ter, 21 MySQL mo11itor, 21-23 phpMyAdmi11, 21

podešavanje I111zoDB, 172-173 itttemacioualizovanje1 17 4 kot!figuraciol!e opcije za vife

instalacija tUJ istom raluuant1

173-174 mysqld, podefavo1zje opcija za,

171-172 refetzje s datotekom opcija,

169-171 server

pokretarzje i spuftmzje, 177-17 8 prikazivanje podataka o procesima1

181 server, optimizovanje

parametri servera, 222-224 RAm diskovi,prepomka, 224 Solaris, preporuka, 224

struktura direktoriju ma, 19-20 MySQL Control Center, 21 MySQL monitor, 21-23 mysqladmin, program (skript), 20,

184 mysqlbinlog, program, 20 mysqlcheck, program, 197 mysqld, podešavanje opcija za,

171-172 mysqldump, skript, 20

nedostaci, 192 opcija --add-drop-table, 191 opcija --all-databases, 192 opcija --allow-keywords, 192 opcija --databases, 192

hill ~

opcija --cxtcnd•·d ""'"" • l 'J l opcija --lock- tabl,.,, l 1!2 opcija --no-dara, IIJ2 opcija --opt, 188 opcija --quick, 191 prednosti, 192 primer rezultata, '188 l 'J l

mysqlhotcopy, skript, 192· l 9.1 mysqlshow, program, 20

N

naredbe. Videti i komande ALTER TABLE, S6 DROP TABLE, 191 FL USH PRIVILEGES, 202· ·20.1 GRANT,1S8-1S9 LOAD DATA INF! LE, 73-7S LOCK TABLES, 191 ON, komanda GRANT, 1S8 R.EVOK.E, ukidanje prava

pristupa, 161 SELECT, izraela tabela, S2 SET, podešavanje promenljivih,

182 show processlist, niti, 181 show variables, 180 SQL-ove

CREATE DATABASE, 43 CREATETABLE, 44, 48-52 DELETE, 7{}-72 INSERT, 68-69 REPLACE, 70 SELECT, 8{}-89 TRUNCATE, 72 UPDATE, 72-73

UNLOCK,191 use, biranje baze podataka, 43

navodnici, identifikatori, 43 nebitne reči, tekstualno

pretraživanje, 132 niti, uništavanje, 182 normalizovanje

Uoyce-Coddova normalna forma (BCNF),38

definicija, 34 druga normalna forma (2NF),

36-37 prva normalna forma (1 NF),

34-36 treća normalna forma (3NF),

37-38 NOT NULL vrednost, izrada

tabela, 49 NOT, operator, 112 now(), funkcija, 119 n-torke, koncepti i tertninologijn,

31 NULL, vrednost

izrada tabela, 49 operatori za porcdcnjc vttdlln,t<.

110--111 projektovanjc """' pod.u.tk.t, H

numeričke funkclJ•, 117 liH nutncri~ki tipovi putlut1'""' 1\ 1

'\ \

Page 130: Prirucnik Za MySQL

8 Indeks

o obrnute kose crte (\), 67 odredbe

DEFAULT, komanda INSERT 69 •

DELAY ED, komanda INSERT, 68

DISTINCT, komanda SELECT 84-86 •

FIELDS, komanda LOAD DATA IN FILE, 74

FROM spojevi, 94 11 podupitima za izvedme tabele,

100 GROUJ> BY, komanda SELECT,

86-87 HAVING, komanda SELECT, 87 IDENTIFIED BY, komanda

GRANT,158 IF NOT EXISTS, 49 IGNORE

koma11da INSERT, 69 koma11da LOAD DATA

INFILE, 74 komanda UPDATE, 72

LIKE,49 LIMIT

komanda DELETE, 72 koma11da SELECT, 88-89 koma11da UPDATE, 72

LINES, komanda LOAD DATA INFILE, 74

LOW PRIORITY koma11da DELETE, 72 komanda INSERT, 68 koma11da LOAD DATA

INF/LE, 74 koma11da UPDATE, 72

ON, komanda GRANT, 158 ON DUPLICATE KEY

UPDATE, komanda INSERT,69

ORDER BY komanda DELETE, 72 koma11da SELECT, 87 komanda UPDATE, 72 redovi tabele, 57

QUICK, komanda DELETE, 72 RENAME, tabele, 57 REQUIRE, komanda GRANT,

159 'f'O, komanda GR.ANT, 158 WIIERE

km11a11da SELECT, 83-84 koma11da UPDATE, 72 .<fll>jevi, 94--95

WITII, komanda GRANT, 1S9 oduzimanje (-),operator, 110 ON DUPLICATE KEY UPDATE,

odredba, komanda INSERT, 69

opcija MAX ROWS, optitnizovanjc tabela, St

OpenSSL, biblioteka, Web lokacija, 205

operatori aritmetički, 11 O logički, 112 ugrađeni, 109 za poredenje vrednosti, 110-112

OPTIMIZE TABLE, komanda, 130, 230, 238

optirnizovanje baze podataka

i11deksi, 229-230 iz bod pn" projektova11ju, 22 8 korna11da OPT/M/ZE TABLE,

230 prepon1ke, 227-228

izrada tabela, Sl MySQL servera

parametri servera, 222-224 RAID diskovi, prepomka, 2 2 4 Solaris, 224 r;brzavanje, prevodet!ie i

povezivatife, 221-222 upiti

d11ev11ik sporih upila, 234--235 dodmxuife i11deksa, 238 koma11da ANALYZE TABLE,

238 koma11da EXPLAIN, 235-237 koma11da OPTIMJZETABLE,

238 meretife peiformaiiSi, 234 spori upiti, otkrivatife, 233 ugrađe11 meha11izam

optimizovatifa upita, 237-238 OR, operator, 112 OS X, instaliranje MySQL-a na, 14 ostave, pražnjenje, 182-183 otpornost na greške, replikovanje,

209 ovlašćenja, za replikovanje, 211

p

PACK KEYS, opcija, optirnizovanje tabela, 51

parametri servera, tehnike optirnizovanja, 222-224

password(), funkcija, 121 PASSWORD, opcija,

optirnizovanje tabela, 51 phpMyAdrnin, korisnički interfejs,

21 pid-file, opcija, podešavanje

MySQL-a, 173 podaci, grupno unošenje, 73-75 podešavanje MySQL-a

instaliranje, 14-16 internacionalizovanje, 17 4 konfiguracione opcije za više

instalacija na iston1 računaru, 173-174

mysqld, podešavanje opcija za, 171-172

opcije za lnnoDB, 172-173 rešenje s datotekom opctja,

169 171

pod upiti čiji je rezultat jedna vrednost,

100-101 vrste, 99 za izraze logičkog tipa,101-103 za izvedene tabele, l OO

pokretanje MySQL servera, 177-178 zavisnih servera, 214

popravljanje i proveravanje tabela komanda CHECK TABLE, 196 komanda REPAIR TABLE 196 mogućnosti, 19S ' program myisamchk, 196-197 program mysqlcheck, 197

popravljanje My!SAM tabele, 130 poređenje s džokerskim znacima,

funkcija UKE, 115 poredenje s regularnim izrazima,

funkcija RLIKE, 115-117 poređenjc sa opsegom vrednosti,

operatori za poređenje, 112 possible_keys, vrednost, komanda

EXPLAIN, 236 power(), funkcija, 118 prava

doddjivanje, IS7 global11a prava, 160 prava za admi11istmtore, 159 prava za obil'11e korist~ike, 159 za pojedi11a1'11e baze podataka,

160 za pojedit1111'11e kolo11e, 161 za pojedi11abte tabele, 161

FILE, 203 prikazivanje podataka o, 181 PRO CESS, 203 tabele, 160,161

tabela colunms_priv, 164 tabela db, 163 tabela host, 163 tabela tables_priv, 164 tabela user, 1 62

ukidanje, 161 ~ITH GRANT OPTION, 203 zasuta

global11a prava, 202 koma11da FLUSH

PR/V/LEGES, 202-203 opast1a prava, 203 veze sa serverom, 201

prava, za replikovanje, 211 preimenovanje tabele, 57 preklapanje na vruće, replikovanje,

217 prenosivost, My ISAM tabele, 129 pre nosni dnevnik, 21 O pretraživanje

MyiSAM tabele,131-134 tekstualno pretraživanje, 131-134

PRIMARY KEY, rezervisana reč, 49 principi projektovanja, baze

podataka anomalije

NULL vred11osti, 34 pri ažuriraty'u podataka, 34 pri hrisanju podataka, J 4 fiti dm/m;wju p<>rlataka, JJ

normalizovanje Boyce-Coddova twrmal11a forma

(BCNF), 38 dn<ga llormalllajorma (2NF),

36-37 prva twrmalt~ajorma (1 NF),

34--36 treća 11ormalllajorma (3NF},

37-38 redundantnost i gubljenje

podataka, 33 važna pitanja, 32

pristup datotekama, ograničavanje, 204

prljavi podaci, nivo izolovanosti transakcija, 152

PROCESS, pravo, 160, 203 promenljive, podešavanje

serverskih, 182 prostor na disku, My!SAM tabele,

130 provera (testiranje)

instalacije MySQL-a, 16-17 rezervnih kopija, 19S

provera ulaznih podataka u aplikacijama, 204

proveravanje i popravljanje tabela komanda CHECK TABLE 196 komanda REPAIR TABLE, 196 mogućnosti, 19S program myisamchk,196-197 program mysqlcheck, 197

prva normalna forma (1NF), 34-36

puni spojevi, 97

Q QUICK, odredba, komanda

DELETE, 72 quote(), funkcija, 114

R

RAID diskovi, preporuka, MySQL server, tehnike optimizovanja, 224

RAID TYPE, opcija, optimizovanje tabela, 51

rand(), funkcija, 118 range, vrednost, komanda

EXPLAIN, 237 raspoređivanje opterećenja,

replikovanje, 215 razlikovanje malih i velikih slova,

identifikatori, 43 RDBMS (relational database

management system), 31 read uncommitted, nivo

izolovanosti transakcija, 152 redovi

ažuriranje, 72-73 brisanje, 70-72 brisanje, komanda TRUN CATE

72 •

duplikati, 84-86 grupisanje, 86-87

tabela baze pod.u,tka, konn·pu i terminolo~-:ija, 31

učitavanje, H3- H4 umetanje u t.tbdu, !.S ()\1 zamenjivanje, 70

redundantnost i gubljenje podataka, projektovanje baza podataka, 33

ref, vrednost, komanda EXPLAIN, 236

REFERENCES, pravo, 160 relacije

definicija, 29 tipa ,j ceb n prema jedan", 29-30 tipa ,jedan prema više", 29-30 ttpa "više prema više", 29-30

RELOAD, pravo, 160 RENAME, odredba, 57 REPAm TABLE, komanda, 130,

196 repeatable read, nivo izolovanosti

transakcija, 150 replace(), funkcija, 114 REPLACE, komanda, 70 REPLICATION CLIENT, pravo,

160 REPLICATION SLAVE, pravo,

160 replikovanje baze podataka

bezbednosne mere, 211 budućnost, 216 dnevnik izme na, 21 O dodeljivanje prava za, 211 hijerarhijski organizovani glavni

serveri, 21S kopije tekućeg stanja, pravljenje,

212-214 otpornost na greške, 209 podešavanje zavisnih servera, 214 preklapat~e servera na vruće, 21 7 principi, 209-210 provera glavnog servera, 212 složenije topologije, 21S upotrebljive verzije MySQL-a,

210 višestruki glavni serveri, 217 zavisni serveri, pokretanje, 214

REQUIRE, odredba, komanda GRANT,159

RESET, komanda, pražnjenje ostava, 182-183

RESTORE TABLE, komanda, 194 REVOKE, komanda, 161 rezervisane reči

ALL,102 ANY,I02 AUTO INCREMENT, 49 BINARY,III EXISTS, 102 FOREIGN KEY, SO FULL TEXT, SO IN,IOI !NDEX,50 PRI MARY KEY, 49 ROLLBACK, 146 SOME, 102 TEMPORARY, 49 UNIQUE, SO UNSIGNED, 52

rczervi•a11e reči, kun lch•ntlllklltnrl 43 l

RLIKE, lunkdjn, 11 ~ 117 ROLLBACK, rezt'rvhmrm t4~l', l.ff1 root, nalog, lozinkn :ru, 17, lfP round(), funkcija, II H ROW FORMAT, opcija,

optimizovanje ta be In,~ l rows, vrednost, kon1nndn

EXPLAIN, 236 RPM datoteke, instaliranje

MySQL-a iz, 12 ručna izrada rezervnih kopija

i obnavljanje podataka, 193-194

s sabiranje(+), operator, 110 sarnospojevi, 96 scripts, direktorijum, 20 Secure Sockets Layer (SSL), 205 SELECT, komanda

alija.1i, 82-83 kolone, 80 izrada tabela, S2 odredba DISTINCT, 84-86 odredba GROUP BY, 86-87 odredba HAVING, 87 odredba LIMIT, 88-89 odredba ORDER BY 87 odredba WHERE, 83..:_84 opšti oblik, 80 primer jednostavnog upita, 80 tabele, 81-82 zadavanje baze podataka, 81-82

SELECT, pravo, 159 select_type, opcija, komanda

EXPLAIN, 236 serializable, nivo izolovanosti

transakcija, 150 serveri

glavni, u replikovanju, 209-212, 21S

MySQL pokretary·e i spt<ftatife, 177-17 8 prikazivatife podataka o procesimtl,

181 pdkazivatife statusa, 180 tehuike oplimizovatifa, 221-224

zavisni pokretmife, 214 u replikovatifu, 209-21 O, 214

Services, prozor (Windows Administrative tools), 179

SET, komanda datoteke dnevnika, aktiviranje,

183 režim autocommit, isključivanje:,

147 serverske promenUivc,

podešavanje, l !!2 SET, tip podataka, 54 shared-mcmory-ban-nn••w,

opcija, podcJnvnllJt• MySQL-n, 173

SHOW, konmntln, ll, l Hil SHOW DAT/\111\SI , l"'"'''• l \1

Page 131: Prirucnik Za MySQL

1\1 IIIUI:II.)

show processlist, komanda, 181 show variables, komanda, 180 SHUTDOWN, pravo, 160 sistemi za upravljanje relacionim

bazama podataka (RDBMS), 31

skupovi znakova, podešavanje MySQL-a, internacionalizovanje, 174

Slashdot, Web lokacija, 135 Sleepycat, Web lokacija, 135 slow _queries, serverska

promenljiva, 180 SMALLINT, celobrojni tip

podataka, 52 socket, opcija, podešavanje

MySQL-a, 173 Solaris, preporuka, MySQL server,

tehnike optirnizovanja, 224 SOME, rezervisana reč, 102 soundex(), funkcija, 114 spojevi tabela

desni spojevi, 98-99 dve tabele, spajanje, 93-95 jednakovredni, 97 levi spojevi, 98-99 puni spojevi, 97 samospojevi, 96 unakrsni spojevi, 97 više tabela, spajanje, 95-96

spuštanje MySQL servera, 177-178 sql-bench, direktorij um, 20 SQL-ove komande

CREATE DATABASE 43 CREATE TABLE, 44,48-52 DELETE, 70-72 INSERT, 65---<i9 REPLACE, 70 SELECT, 80-89 TRUNCATE, 72 UPDATE, 72-73

sqrt(), funkcija, 118 SSL (Secure Sockets Layer), 205 START TRANSACTION,

komanda, 147 statičke MyiSAM tabele, 129-130 std(), funkcija, 122 STRCMP, funkcija, 115,117 struktura direktorijuma,

MySQL-ova, 19-20 subdate(), funkcija, 119 substring(), funkcija, 114 tum(), funkcija, 122 SUPER, pravo, 160 •upcrključevi, 31

š lemn, definicija, 32

t.1bcla columns_priv, 164 tabela tables_priv, 164 tabele db, 163 tabele host, 163 tabele user, 162

Jifrovanje lozinki, 203

T

tabele BerkeleyDB (BDB), 50,135 grupno unošenje podataka, 73-75 HEAP,50,138 indeksi

jedrwkolonski, 229 levi kraj grupe, 229 optimizovm~·e, 229-230 vifekolomki, 229

lnnoDB,50 dosledno učitavanje bez

zak(iu{avanja podataka, 13 4 tramakcije, 14 3-146 uslovi licence, 13 5 Web lokacija, 13 5 zak(iu{avanje podataka na 11ivou

reda, 134 ISAM,50

ogrmli{enja, 128-129 pregled, 128

izrada komanda CREATE TABLE

44, 48-52 ' opcije za optimizovanje, 51 primer baze podataka employee,

44-48 kolone

datumski i vrememki tipovi podataka, 5 4

numerički tipovi podataka, 52-53 opcija unique, 50 učitavanje podataka iz odredenih

kolo11a, 80 znakovni i tekstualni tipovi

podataka, 5 3-5 4 komanda ALTER TABLE 56 komanda BACKUP TABLE 194 komanda DROPTABLE 194 komanda FLUSH TABLES, 193 komanda LOCKTABLES, 193 komanda RESTORE TABLE

194 • menjanje strukture, 56-57 MERGE, 136-137 MERGE, komanda FLUSH

TABLES,137 MylSAM,SO

dinamičke, 129-130 komprimovane, 131 pobo(ifanja u odnosu rw ISAM

tabele, 129 poprav(imije, 13 O pregled, 129 statičke, 129-130 tekstualtw pretraživarije,

131-134 podrška za transakcije, 127-128 podupiti za izraze logičkog tipa,

101-103 podupiti za izvedene tabele, 1 OO prava, 160,161

tabela cohmuiS_priv, 164 tabela db, 163

tabela host, 163 tabela tables_priv, 164 tabela user, 162

preimenovanje, 57 prikazivanje sistemskih podataka

o, 181-182 proveravanje i popravljanje

komanda CHECKTABLE, 196 koma11da REPAIR TABLE, 196 mogubwsti, 19 5 program myisamchk, 196-197 program mysqlcheck, 197

redovi ažuriranje, 72-7 3 brisatije: 70-72 brismije pomoću komande

TRUNCATE, 72 duplikati, 84-86 grupisarije, 86-87 u{itavarije, 83-84 umetatije, 65-69 zamma, 70

spajanje deSili spojevi, 98-99 dve tabele, 93-95 jedt~akovred11i spoj, 97 levi spojevi, 98-99 ptmi spojevi, 97 samospojevi, 96 UllakrSIIi spojevi, 97 vife tabela, 95-96

tabele baze podataka, 31 tip merge, SO učitavanje podataka iz, 81-82 upiti čiji je rezultat jedna vrednost,

100-101 zaključavanje, 188

tabele, podrška za transakcije BerkeleyDB (BDB), 135 lnnoDB

dosled11o u{itavanje bez zakiju{avarija podataka, 13 4

uslovi licettce, 13 5 l#b lokacija, 13 5 zak(iu{avmije podataka 11a 11il.<lu

reda, 134 tipovi tabela, 127-128

tabele prava, kolone tabela db, 163 tabela host, 163 tabele user, 162

table, vrednost, komanda EXPLAIN, 236

table_ cache, parametar, 223 tables_priY, tabela, prava pristupa,

164 tačka i zarez (;),znak, 46 tekstualni i znakovni tipovi

podataka za kolone BLOB,54 CHAR,53 ENUM,S4 SET,S4 TEXT,54 VARCIIAJ1..,54

tekstualno pretraživanje logičko, 133-134 MylSAM tabele, 131-134

TEMPORARY, rezervisana reč 49 TEXT, tip podataka, 54 • threads_connected, serverska

promenljiva, 180 ~m estam p(), funkcija, 119 ttmestamp, kolona, tabela

columns_priv, 164 TIMESTAMP, tip podataka, 55 TINYINT, celo brojni tip

podataka, 52 tipovi podataka, float, 48 TO, odredba, komanda GRAN~

158 • trajnost podataka, transakcije, 150 transakcije

definicija, 143-146 START TRANSACTION

komanda, 147 ' u lnnoDB tabelama, 143-146

ACID uskladerwst, 149-150 izolova11ost tramakcija, 150-152 režim autocommit, 147-149

treća normalna forma (3NF), 37-38

trim(), funkcija, 114 TRUN CATE, komanda, 72 type, vrednost, komanda

EXPLAIN, 236

u ubrzavanje MySQL servera,

221-222 ugrađen mehanizam

optirnizovanja upita, 237-238 ugrađene funkcije/operatori, 109 ukidanje prava pristupa, 161 umetanje novih redova u tabelu

65-<i9 • unakrsni spojevi, 97 UNION, opcija, optirnizovanje

tabela, 51 UNIQUE, rezervisana reč, SO UNLOCK TABLES komanda,

148-149 UNLOCK TABLES, komanda, 191 UNSIGNED, rezervisana reč, 52 UPDATE, komanda, 72-73 UPDATE, pravo, 159 upiti

dnevnik, 183 komanda SELECT, 80 optimizovanje

drtev11ik sporih upita, 234-235 dodava1ije i11deksa, 238 kommtdaANALYZE, 238 koma11da EXPLAIN, 235-237 komm1da OPTIMIZETABLE

238 • meretije peiformami, 234 spori upiti, otkrivatije, 233 "~~mden 111eluwizam

optimizovmija upita, 237-238

podupiti čiji je rezultat jed t ta vredttost,

100-101 vrste, 99 za izraze logičkog tipa, 101-103 za izvedeue tabele, 1 OO

spojevi tabela deSili spojevi, 98-99 jedtwkovredr~i, 97 levi spojevi, 98-99 ptmi spojevi, 97 samospojevi, 96 spajanje vife tabela, 95-96 unakrSIIi spojevi, 97

uppercase(), funkcija, 114 uptime, serverska promenljiva, 180 USAGE, pravo, 159 use, komanda, biranje baze

podataka, 43 user, opcija, podešavanje

MySQL-a, 172 user, tabela, prava pristupa

kolone za ograničavanje upotrebe resursa, 162

kolone za opseg vidljivosti, 162 kolone za prava, 162 kolone za uspostavljanje za.ltićene

veze, 162 usklađenost podataka, transakcije,

150 uslovi licence, InnoDB tabele, 135 uspostavljanje veze s bazom

podataka MySQL, testiranje, 16-17 SSL (Secure Sockets Layer), 205 zaštita servera, 201

v V~CHAR, tip podataka, 54 vece od(>), 111 višekolonski indeksi, 229 višestruki glavni serveri,

replikovanje, 217 vremena, funkcije za rad s

datumima i vremenima 119-120 •

vremenski tipovi podataka za kolone, 55

w Web lokacije

activestate.com, 235 Google,135 lnnoDB,135 OpenSSL, 205 Slashdot, 135 Sleepycat, 135 Yahoo!, 135

WHERE, odredba komanda SELECT, 83--84 komanda UPDATE, 72 spojevi, 94-95

Windows 1\<loululolt•ll 1 prozor St~rvlt, •· l IM

Windows, lm! olhoonf• 1\h 1 na,12-14

WITH, odredbu, kmmu11l•t GRANT, 159

WITH GRANT 1''1'11 IN, odredba, komandu l .ll i\ N 1 159 l

WITH GRANT OP1'10N, l"" .,, 160,203

X

XOR, operator, 112

y

Yahoo!, Web lokacija, 135 YEAR, tip podataka, 55

z zaključavanje podataka na nivou

reda, lnnoDB tabele, 134 zaključavanje podataka na nivou

stranice, BerkeleyDB (BDB) tabele, 135

zaključavanje tabela, 188 zamena redova, 70 zapisi, tabele baze podataka,

•. koncepti i terminologija, 31 zastlta

instalirane datoteke jiltrirmije podataka, 204 fizička zaftita, 205 preporuke, 203 pristup i prava upotrebe, 204 provera ulaz11ih podataka u

aplikaciji, 204 SSL (Secure Sockets Layer), 205

korisnički nalozi mwuinmi nalozi, brisanje,

202-203 lozi11ka za 11alog root, 202 opas11a prava, 203 !ifrovatije lozi11ki, 203

sistem prava pristupa veze sa serverom, 201

sistema pri replikovanju, 211 zavisni serveri

pokretanje, 214 u replikovanju, 209-210,214

zlonamerni korisnici, zaštita, 205 znakovni i tekstualni tipovi

podataka, 53-54 LIKE, funkcija, 115 MATCH,funkcija,115 obrada znakovnih vrednosti, 11 4 RUKE, funkcija, 115 STR CM P, funkcija, 115, 117

zvezdica (*),znak, 116