MySQLje sistem za upravljanje relacionim bazama podataka otvorenog koda, popularnost brzo raste. Poznat po brzini, pouzdanosti i upotrebe, MySQL se pokazao kao pogodan i za i L.a iskusne programere jer izradu sofisticiranih Web lokacija i aplikacija koje rade sa bazama podataka. za MySQL daje jasan i saet uvod u osnovne koncepte i tehnike upotrebe MySOL-a,. koji j e u MySOL-u da pravi i administrirasloene baze podataka koje moe 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 vie o tome kako radi MySQL, za MySOL vam efikasno pruiti sve informacije koje su vam potrebne da biste i brzo savladali MySQL. Luke Well ing i Laura Thomson, autori popularne knjige PHP i MySOL: razvoj aplikacija za Web (Mikro knj iga, 2004), predaju programiranje Web aplikacija, softverske inenjerstvo i elektronsko trgovanje, na RMIT univerzitetu u Melburnu, Australija. Oni su i poslovni partneri u kompaniji Tangl ed Web Design, koja je osvojila vie nagrada za svoje projekte dina- 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, prenose proverena iskustva i pruaju 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 MySQL Rc.ccn1enL Urednik ltrd.lktori urednik Korektor Realizacija korica l'rclom tc Ima i obrada slika
Direktor Dragan Tanaskoski Olga Milanka Aleksandra i Stela Sanja Vesna Vladimir Sanja Milica Mikro knjiga, Beograd Dragan Tanaskoski tampa Y G "J. ( Beograd Ako imate pitanja ili komentare, ili ako elite da dobijete besplatan katalog, piite nam ili se javite: Mikro knjiga t:th 20-87 11030 Beograd tel: o t l /3540-544 pismamikroknjiga . co.yu Mikro knjiga Jevrejska bb 78000 Banja Luka tel: 051/220-960 pismamikroknjiga.ba Autorizovan prevod sa engleskog jezika knjige MySQL Turorial. Mikro knjiga Maksimirska 13 10000 Zagreb tel: 01/2344-023 pismamikroknjiga . hr Copyright 2005 Mikro knjiga. Sva prava zadrana. Nije dozvoljeno da nijedan deo ove knjige bude reprodukovan di rm i tovan na bilo koji elektronski ili fotokopiranje, snimanje ili bilo koji drugi sistem bdccnje, bez prethodne pismene dozvole 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 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" - 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 Vlling (Luke Wclling) predaje u koli za 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 reenja 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 drao je predavanja iz raznih oblasti, ali ua specijalnost mu je Internet. l '"''Tomson (Laura Thomson) predaje u koli za nauke i informacione r, llllnlop;Uc univerziteta RMIT u Melburnu,Australija. Predavala je vie predmeta iz Weba i Jnterneta, a priprema doktorat na temu pretraivanja Weba. na , 'w 1111 konferencijama irom sveta. Bila je instruktor na kursevima u organizacijama 1 d '' t m kao to su Ericsson i Lonely Planet, a pre toga je radila za firme Telstra 1 l\11\lllll Consulting Group. Diplomirala je inenjering sistema i l, lt.lltkc. U slobodno vreme bavi se jahanjem, hrani svoju menaeriju ljubi- ilt.ll 1, .1 ponekad s Lukom i o stvarima sasvim izvan sveta tehnike. Od istih autora 1'111 1 i MySQL l l'lrk.tcija zn Web knjigama o izradi Web aplikacija 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 projekti. U udbenicima pro- gramiranja za Web, primeri su previe jednostavni za primenu - ova knjiga sadri i jednostavne pri- mere na kojima se objanjavaju svojstva jezika, ali i nekoliko gotovih kompletnih aplikacija koje prikazuju kako se prave veliki projekti . a dra j Uvod ........ . Osnove MYSQL-a Instaliranje MySQL-a . 1 . 9 11 lnSLaliranje na Linux .... ..... ......... .... ...... .. ...... .. . . ... 12 Instaliranje na Windows .................... . .. .... ............. 12 l11staliranje na OS X ........................................... 14 Podeavanje sistema .. ......... ... ........... .... .. . ... ..... ... 14 l 'rovera da li sistem radi ........................................ 16 Zadavanje lozinke za nalog root ................. . .. .......... .... 17 ll1 isan je anonimnih naloga .................... .... ............. . 17 l'ravljenje naloga za poslove ............................. 17 Saetak ............................................ .. .. .. .. 18 l Kratak obilazak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Struktura MySQL-ovih direktorijuma ............................ .. 19 Pregled izvrnih datoteka ....................................... 20 Pregled interfejsa .................................... 21 Kratak uvod u MySQL monitor .................................. 22 Saetak .................................................... 23 ll Projektovanje i izrada baza podataka u MySQL-u. 27 Ubrzani kurs projektovanja baza podataka. . . . . . 29 Koncepti i terminologija baza podataka ............................. 29 !>rincipi projektovanja baza podataka ............................... 32 Normalizovanje ............................. ... .. ... . ....... . 34 Saetak ............ . . . ...... . . . . . .... . .... ... .............. 38 Pravljenje baza podataka, tabela i indeksa ............ 41 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 indeksa .......................... , , , h 1nktl)t.: za r.1d s d.11111111111 ,1 1 VIti lit 111111.1, .. . ...... ................ ll <J Brisanje baza podataka, tabela i indeksa ............. , , , , . , .. , . , . , , J' nnktq<.: za IIJHlV.I pod.tt.tka . ........................... 120 Izmena strukture tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % Saetak ............................................... .... . 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 auriranje podataka . . 65 l V Tipovi tabela i transakcije u MySQL-u 125 Komanda INSERT ... .. ..... . ................... ..... ........ 65 Tipovi tabela u MySQL-u . . . . . . . . . 127 Komanda REPLACE ....... .. ............. . ... . .. ... ...... ... . 70 tabele ... ................................... .. ... ... . 128 Komanda DELETE .. .......... ............ .. .... .... . .. ... .. . 70 MyiSAM tabele ............................................. 129 Komanda TRUNCATE ........... . ... . ............. .. .. . ... .. 72 lnnoDB tabele ......... .. .. . . ..... ... .... . . ............ . .... 134 Komanda UPDATE .. .. . ....... . ......... ...... .............. 72 llerkeleyDB (BDB) tabele . . . ...... . . . ......... .. . . ............ 135 Grupno unoenje podataka komande LOAD DAT A INFILE ...... 73 MER.GE tabele .............................. ... ............ 136 Saetak ...... .. .. . ... . . .................................... 75 l l EAP tabele .. ........... .................................. 138 6 upita u MySQL-u ..................... 79 S;tetak ........... . ... .... ........... . . .. ................. 138 Opti oblik komande SELECT . . ... . . ............................ 80 l O Upotreba transakcija u InnoDB tabelama. . . . . . . . . . . . 143 Jednostavni upiti ............ .... . . .. .. .. .. . ...... . ........... 80 podataka iz kolona .... .. .. . .... . .. .. ...... . .. 80 Staje transakcija? ... . ..................... ..... ...... .. ...... 143 Upotreba transakcija u MySQL-u .... ... ... . . .. .. ... ....... ...... 146 Apsolutna imena baza podataka i tabela ............................. 81 Transakcioni model InnoDB .. ....... . . . ... . .... .. .......... ... 149 Alijasi ... . ... .. .. . . . ........ . . . ............ . ... . .. ......... 82 Saetak ............. .... . . .... .. .......................... 152 Upotreba odredbe WHERE za samo redova ...... . .. 83 Uklanjanje dupliranih vrednosti opcije DISTINCT .. . .......... 84 V Administriranje MySQL-a ... 155 Upotreba odredbe GROUP BY ..... .. ... . .. . ... .. . . ............. 86 Izdvajanje grupa podataka opcije HAVING ... ... .. ... 87 Sortiranje rezultata odredbe ORDER BY . . .. . . . ....... 87 broj a redova rezultata odredbe LIMIT ........ .. .. 88 Saetak ......... .... .. ... .. .. . ... .. .............. . ..... ... . 89 ll Upravljanje pravima korisnika 157 l'ravljenje naloga komandi GRANT i REVOKE ... .. 157 Nivoi prava ................................................ 159 ukupnih prava . .. ......... ... .... . ... .... .......... 160 Upotreba komande REVOKE .......... .......... . ............. 161 7 Sloeniji upiti . ............................... 93 Tabele prava .. .. .. .. ..... ....... . ... . . . .................... 161 Upotreba spojeva u upitima koji obuhvataju vie tabela . ... ............. 93 Saetak ........... ... . ........... .... . ........ ......... .. . 165 Vrste spojeva tabela ...... . .. ............... ... ...... . .. . 97 Podupiti ........... ...... .......... . . . ..... . ............... 99 Opcije komande SELECT.: .. ..... .. .... . .. . ........ . .. .... ... 103 Saetak ........... . .. . ....... . ... . ... . .. .. .... . . , ......... 104 12 Podeavanje MySQL-a. . . . . . . . . . . . . . . . . . . . . . . . . 169 Podeavanje MySQL-ovih konfiguracionih opcija ..... .... ... ........ 169 Opcije za InnoDB .... . ........ . ... .. .. . ..... ........ .... .... 172 Konfiguraciane opcije za vie instalacija na istom ....... . .... .. 173 8 Upotreba MySQL-ovih funkcija Internacionalizovanje ......................................... 174 u komandi SELECT ................... ..... 109 Saetak ... .. .. .... ...... .... ...... .... ....... .... ......... 17 4 Operatori ..... . .... . .. .. ... . . .. . .... . .. ........... . ....... 11 O Funkcije za upravljanje tokom izvravanja komandi ....... ..... .. .. . .. 113 Funkcije za rad sa znakovnim vrednostima ........................ . 114 funkcije ... ........... . .. ...................... .. . 117 13 Administriranje baze podataka . . . . . . . . . . . . . . . . . . . 177 Pokretanj e i sputanje MySQL servera ............................. 177 Prikazivanje podataka o serveru i bazama podataka na njemu .......... .. 178 Podeavanje serverskih promenljivih ......... . .................. . . 182 Unitavanje niti .................................. .. , , . , ... .. 182 Pranjenje ostava ............................................ 182 Datoteke dnevnika ........................................... 183 Saetak ................................... . ............... 184 14 Izrada rezervnih kopija i obnavljanje podataka ........ 187 Izrada rezervnih kopija baze podataka ............. . .. .. ......... .. 187 Testiranje rezervne kopije ... ...... ..... ....................... 195 Proveravanje i popravljanje tabela .. ... ... ........................ 195 Saetak ............. . .............................. .... ... 198 15 Zatita MySQL servera . . . . . . . . . . . . . . . . . . . . . . . . 201 Kako sistem prava korisnika deluje u praksi ......................... 201 Zatita naloga ...................................... 202 Zatita instaliranih datoteka ..................................... 203 Filtriranje podataka koje korisnici alju ............................ 204 Drugi saveti ........................................... ..... 205 Saetak . . . . . . . . . . ......... . ...... .. ....................... 206 16 Replikovanje baze podataka . . . . . . . . . . . . . . . . . . . . . 209 Principi replikovanja ... ...... ................................ 209 Podeavanje sistema za replikovanje ........ . ..................... 211 Sloenije topologije ................. .... .... .. ............... 215 replikovanja ...................... .. ............... 216 Saetak ... . .. . ............................. . ...... ... ..... 217 VI Optimizovanje MySQL-a . .... 17 Optimizovanje MySQL servera. 219 221 i povezivanje koda radi brzine rada ............. 221 Podeavanje parametara servera .. . ....... . ........... . ........... 222 Podeavanje drugih .................................... 224 Saetak ......... ... .. ............................ .... ..... 224 18 Optimizovanje baze podataka . . . . . . . . . . . . . . . . . . . 227 ta usporava MySQL-ove baze podataka .......... ... ....... .. ..... 227 Pravilni izbori pri projektovanju baze podataka .. . ................... 228 Indeksiranje u cilju optimizovanja ......... .... ................... 229 Komanda ANALYZE TABLE .. . .............. . ................ 230 Komanda OPTIMIZE TABLE ... . . ... . ......................... 230 Saetak .. ........................... . ..................... 230 19 Optimizovanje upita . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Otkrivanje sporih upita ..................... . ..... .... ........ 233 Merenje performansi upita ............................ . ........ 234 Upotreba dnevnika sporih upita ...................... ... ........ 234 Upotreba komande EXPLAIN za prikazivanje na koji se upiti izvravaju .. ............. . ....... . ............ . ...... 235 MySQL-ov mehanizam optimizovanja upita ................. 237 Preporuke za optimizovanje upita ................................ 238 Saetak . . .... . .......................... .. ................ 238 Spisak termina u knjizi . 241 Indeks ................... . 243 Uvod lill O DOLI U ZA MYSQL. Ova knjiga je ubrzani kurs koji treba da 1111 da brzo uhvatite korak s MySQL-om. MySQL objasniti tako da 1 ptlhliimo i krajnjem korisniku i administratoru sistema. l J ovom uvodnom delu biste se opredelili za MySQL /.ato ba MySQL a ne neka druga baza podataka !'lt a je u MySQL-u 4.0 i 4.1 Koje nove tek treba da se pojave u verzijama Kome je ova knjiga namenjena l<.1ko treba koristiti ovu knjigu N<lpomena u vezi s licenciranja MySQL-a. Zbog biste se opredelili za MySOL 1) "'<)L je proizvod iz oblasti baza podataka. Postoji vie razloga zbog kojih l11 lt ' \l! opredelili da MySQL bude va server baza podataka. MySQL je brz i stabilan. To je razlog njegove popularnosti. Februara 2002. !ullltL', eUiek (www. eweek. com) napravio je uporednu studiju nekoliko tt.qv t/nijih sistema za rad s bazama podataka, koja je obuhvatila Oracle, Microsoftov 1 ll Sl'rvcr, DB2 i MySQL. U toj studiji, MySQL i Oracle 9 dobili su najvie ukupne H t' Ill' . l'ri tome je upotrebljena alfa verzija MySQL-a 4.0, a MySQL 4.1 je jo bri. M ySQL je na raspolaganju i kao besplatan i kao komercijalni softver. Ce o MySQL 1111 tZt' st: nabaviti pod uslovima GNU opte javne licence (General Pu blic License, l .1'1.), .di ukoliko vam je potrebna komercijalna licenca, moete je kupiti. MySQL prua veliku koje se smatraju vanim u oblasti baza ('ul.ti.lka, a to su transakcije, na nivou redova, spoljni klju- ' l 1, podupiti i tekstualno pretraivanje.Verzija 5.0 na ovaj spisak dodati i uskladi- l Ill' procedure. MySQL dobru skalabilnost i koriste ga veoma zahtcvni klijenti kao to 11 Y.dlOo! Finance, Slashdot i US. Census Bureau. MySQL je opta alatka za baza podataka jer se lako instalira i koristi, 1 Z. lutima malo prostora na disku i troi skromnu memorije. Ukupno gledano, MySQL je izbor za aplikacije baza podataka. Zato ba MySQL a ne neka druga baza podataka Postoji veliki broj baza podataka koje se mogu porediti s MySQL-om u pojedmim detaljima, ali MySQL nudi kombinaciju performansi, cene i koju bi drugi sistemi teko nadmaili. Performanse MySQL je neosporno brz. Oracle, Microsoft i IBM svaki ponaosob tvrde da prodaju najbre baze podataka na svetu, to, u zavisnosti od vaeg stepena lakovernosti, samo dokazuje jednu od dve tvrdnje: programi za testiranje mogu se napisati tako da rezultati dokazuju ta god programa zahteva, ili da se proizvodi pokazuju kao savreni u uslovima upotrebe. Na MySQL-ovj Web lokaciji moete pogledati rezultate per- formansi MySQL-a i drugih baza podataka. Ti podaci pokazuju da MySQL uglavnom primctno nadmauje svoje takmace. Iako u rezultate bilo kojeg testiranja treba prihvata ti "sa zrnom soli", to vai za rezultate testova koje je izvrio proizvo- baze podataka, svi dokazi na raspolaganju, i nezavisne testove, poka- zuju da je MySQL jedan od najbrih proizvoda na raspolaganju. Rezultate testiranja moete videti na Web lokaciji: www.mysql.com/information/benchmarks.html a ti podaci su priloeni i uz datoteke izvornog koda koje preuzim.ate, to vam omogu- da ih uporedite s rezultatima koje dobijete u svom radnom okruenju. Rezultati testiranja koje je izveo 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 s procesora. Navedena dva proizvoda su nadmaila IBM-ov DB2, Microsoftov SQL Server i Syba- seov ASE. U nastavku ovog teksta vie o ce nama, ali vredi napomenuti da je od svih proizvoda tim testovima, jedan od najboljih bio besplatan, dok su cene drugih bile reda 160.000 dolara (40.000 dolara po procesoru).Vie detalja o tome na Web adresi www. eweek. com/article2/0, 3959,293, oo. a sp. Brzina je oduvek bila odlika o kojoj projektanti MySQL-a vode U MySQL se nove samo ako nisu na tetu performansi. Zbog toga se ponekad nove dodaju sporije nego to to korisnici ele, ali se time da MySQL uvek bude veoma brz. S tom tvrdnjom verovatno se i sami sloiti na osnovu svog iskustva ili testova koje sami izvedete. Cena Cena je stavka koja se moda najlake poredi. Za mnoge uslove upotrebe, MySQL je besplatna aplikacija. Uslovi licence tipa GPL da koristite softver, da menjate njegov izvorni kod i da MySQL distribuirate drugim ljudima pod GPL uslovima. U situacijama, npr. kada elite da distribuirate MySQL kao sastavni deo komercijalnog proizvoda, da kupite komercijalnu li cencu. Cena licence za jedan server je od 220 do 440 dolara (u pisanja ove knjige), to zavisi od toga da li koristite tabele tipa InnoDB. Drugim za MySQL postoje dva sistema licenciranja, gde je besplatna upotreba GPL uslovima, a komercijalne upotrebe je standardnim sporazumima EULA (End-User License Agreement - sporazum o licenci s krajnjim korisnikom) ili OEM (Original Equipment Manufacturer- izvorni opreme). Pravilo kompanije MySQL AB je "Ako je va proizvod besplatan, i na je; ako se va proizvod pb -na Najvaniji konkurenti nude komercijalne licence, uz sloene sisteme t ena, koje zavise od nameravanog upotrebe, broja procesora po serveru i broja Istovremenih korisnika koji uspostavljati veze s bazom podataka. Trokovi za Ora- t leov server, Microsoftov SQL Server, IBM-ov DB2 i Sybaseov server, mogu desetine hiljada dolara u okruenju sa umerenim pa i stotine hiljada dolara za server s vie procesora na koji se povezuje broj klijenata. MySQL se ponekad poredi s drugim bazama podataka otvorenog koda, kao to su l'ostgreSQL i Firebird. Od svih pomenutih baza podataka otvorenog koda, jedino je MySQL proizvod iza kojeg stoji jedna kompanija, koja je vlasnik svih prava intelektu.- ,tlne svojine i koja nudi celovite komercijalne licence, koje obuhvataju i odgovornost 1 odtetu u neispravnosti, kao to zahtevaju velike organizacije. Jo jedna kategorija softvera s kojom se MySQL ponekad poredi jesu jeftine baze podataka koje nisu namenjene radu u klijent/server okruenju, a ciljna trina grupa su im korisnici ili male firme. U tu kategoriju spadaju Access i Filemaker Pro. Mada se interfejs programa iz ove kategorije jednostavno upotrebljava, njima uglavnom nedostaje vana funkcionalnost i nisu dovoljno stabilni, skalabilni i brzi da bi bili upotrebljivi za aplikacije od vanosti za firmu. Stabil nost Projektanti MySQL-a oduvek su smatrali da je stabilnost od prvorazrednog Sve verzije MySQL-a izdate u binarnom obliku - i alfa izdanja - moraju MySQL-ov skup testova stabilnosti. Postupak obuhvata testiranje funkcija i drugih osobina, kao i ispitivanje rezultata operacija pri kojima su u prolosti otkrivene i ispra- vljene greke, se da se nikad ponovo ne uvede ispravljena greka. Ispravljanju greaka projektanti moraju da daju vii prioritet od drugih poslova. U sutini, projektant prekida posao sve dok se ne otkloni greka koja spada u njegovu oblast Pravilo nalae da svako izdanje MySQL-a mora biti od dotad poznatih greaka koje se mogu reprodukovati u poznatim uslovima. R.azume se, problemi ne mogu se reiti a da pri tom ne pro uzrokuju druge probleme na drugom mestu. To vai za produkcione verzije u koje ne bi tre- balo sutinske izmene koje bi mogle da na stabilnost verzije. U takvim problem se dokumentuje i otklanja u jednoj od narednih verzija. I najzad, kvalitet softvera MySQL-ovi klijenti i zajednica korisnika. Preko miliona korisnika irom sveta rade u veoma okruenjima, to prua jedinstvenu priliku za otkrivanje greaka u fazama razvoja. da je MySQL-ov sistem za otkrivanje i dokumentovanje greaka javan, svaki korisnik ima uvid u sve to su drugi korisnici otkrili i moe da dodaje svoje napomene. upotrebe Druga odlika MySQL-a jeste upotrebe. Nije potreban sime.: n post upak podeavanja da biste da radite. MySQL server radi kako treba ga jete". Standardne vrednosti parametara su takve da minimizuju utroak prostora na disku i memorije. Razume se, da bi se postigle optimalne performanse funkcija koje su vane u produkcionom u. kao to je npr. kori- snika za rad u bazu podataka, potrebno je finije doterivanje tih standardnih vrednosti radnih parametara MySQL-a. Pri tome vam mogu primeri konfiguracionih datoteka koje dobijate uz MySQL.
softvera umnogome zavisi od toga koje smatrate vanim. MySQL prua kao to su tekstualno pretraivanje, replikovanje i podrka za veoma obimne tabele, kojih u drugim jeftinim proizvodima uopte nema ili ne rade najbolje. MySQL-u nedostaju neke kao to su uskladitene procedure i pogledi, koje su standardne u najskupljim proizvo- dima, a postoje i u nekim jeftinim proizvodima. Neke od tih nosti (kao to su uskladitene procedure), planirane su za naredne verzije, dok za druge (kao to su pogledi) biti potrebno vie vremena. Neke MySQL-ove (na primer, na nivou reda) ne postoje ni u najskupljim sistemima. Na Web lokaciji MySQL-u nalazi se stranica, h t tp: l /www. mysql. com/ information/features. html, na kojoj uporedni pregled MySQL-a i dvadesetak konkurenata, da biste videli ta se sve nudi. U nastavku dajemo kratak spisak koje ne podravaju svi MySQL-ovi konkurenti i spisak kojih nema u MySQL-u a postoje u drugim proizvodima. MySQL 4.1 nudi transakcije u skladu s grupom pravila ACID podrku za platforme replikovanje podrku za obimne tabele i baze podataka tekstualno pretraivanje podupite podrku za sintakse po standardu SQL 92. MySQL zasad jo ne nudi poglede uskladitene procedure
ta je 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 1 1.1 11.data je aprila iste godine. Ako ste koristili veri. lJ ll \ \, 11 Vl' lilJI tl .O izmene: U standardnu binarnu verziju ugrad ena je maina baze podataka Inn oD B, koja je bila u neke kasnije verzije 3.23. Maina baze podataka InnoDB podrava pravila ACID, to da podrava transakcije, spoljne i na nivou redova tabele. MySQL sada koristi ostavu (ke) za upite, u koju smeta rezultate upita za kasniju ponovnu upotrebu, znatno poboljava performanse upita. Tekstualno pretraivanje i indeksiranje, koji su dodati u verziji 3.23.23, pobolj- ani su opcije Boolean. Tabele tipa MERGE sada podravaju komande INSERT i polja AUTO_INCREMENT. Skupovi rezultata dobijeni upita SELECT sada se mogu spajati opcije UNION . Sada moete da br i ete redove iz vie tabela istovremeno jedne komande DELETE. Poboljano je e pravima korisnika. Doda to je vie novih vrsta prava, to finije podeavanje, a odsad moete da i resurse kojima korisnik ima pristup. Odsad moete da menj ate konfiguraciju servera bez ponovnog pokretanja servera. Na raspolaganju je nova biblioteka,libmysqld, napisana na jeziku C, koja omo- da MySQL u svoje programe. Replikovanje, koje postoji jo od verzije 3.23.15, poboljano je na vie uglavnom otklanjanjem greaka. Na primer, sada moete da podesite bazu prijemnik podataka opcije LOAD DATA FROM MASTER, umesto pomocu komande mysqldump ili alatke mysqlsnapshot. Napravljeno je i puno drugih manjih izmena i poboljanja. . . Verzija 4.1 donosi jo neka dodatna poboljanja. Najvanija izmena Je dodavanJe pod upita i izvedenih tabela. Odsad imate i podrku za Unicode, za OpenGIS za skladitenje geografskih podataka i mnogo drugih sitmJih poboljsanJa. Koje nove tek treba da se pojave u verzijama Verzija 5.0 je zasad u predalfa fazi, ali moete preuzeti izvorni kod da biste s njim ckspcrimentisali. izmena koju donosi verzija 5.0 jeste do.datak ditenih procedura, to je u predalfa verziju. Planirane su 1 druge medu kojima su podrka za kursore, RTREE indeksi, pravi tip podataka VARCHAR 1 druga manja poboljanja. Trebalo bi da verzija 5.1 definisanje spoljnih Ll sv lill Vl st.llll.l tabela mnogobrojnim drugim novim Pogledi biti podra ni u j ednoj od verzija S.x. Kome je ova knjiga namenjena Ova knjiga je jedinstvena jer se sastoji od niza kratkih i saetih poglavlja, a svako je na temu i prevashodno opisuje kako se rade poslovi. Svako poglavlje zavrava se pitanjima i vebama koje se odnose na gradivo poglavlja, to vam da ispitate da li ste dobro razumeli koncepte izloene u poglavlju. Ukratko, naa namera je da knjiga bude kratak za pametne ljude. Ova knjiga nije referentni Ako vam to treba, pogledajte o MySQL-u na Web lokaciji. Zaista nema potrebe da ponovo pronalazimo rupu na saksiji. se na pet oblasti: instalisanje i konfigurisanje MySQL-a, upotreba MySQL-a, administriranje MySQL-a i optimizovanje MySQL-a. sva sutinska zarU a koja su neophodna za profesionalnu upotrebu MySQL-a. Ovu knjigu moete koristiti kad god vam zatreba da uradite posao koji se upotrebe MySQL-a u novom projektu, ili ste preli na nov posao, ili nemate dovoljno vremena da "kopate" po drugoj krUizi od hiljadu stranica. Ova knjiga je napisana tako da vam pomae da uradite posao. Kako treba koristiti ovu knjigu Ova knjiga je podeljena na pet delova: U prvom delu", Osnove MySQL-a", kako da instalirate i podesite MySQL na svom sistemu, i MySQL na osnovu kratkog opisa. Drugi deo, "Projektovanje i izrada baza podataka u MySQL-u", vodi vas kroz postupak projektovanja i izrade baze podataka. koji imaju iskustva u pro- jektovanju baza podataka dovoljno da samo povrno pogledaju ovaj deo, ali ako ste u oblasti baza podataka, savetujemo da ga detaljno U delu",Upotreba MySQL-a", kako da koristite podatke iz MySQL-a u svakodnevnim poslovima. deo", Tipovi tabela i transakcije u MySQL-u" opisuje kako se u MySQL-u koriste pojedine vrste maina baza podataka, sa posebnim osvrtom na mainu InnoDB i njenu upotrebu za transakcionu obradu podataka. Peti deo, "Administriranje MySQL-a", opisuje osnovne poslove koje mora da oba- vlja administrator MySQL-ove baze podataka, kao to su upravljarUe korisnicima, podeavanje, odravarUe baze podataka, izrada rezervnih kopija i restauriranje baze podataka, zatita baze podataka od pristupa i replikovanje podataka. esti deo",Optimizovanje MySQL-a", vam da dobijete maksimum od MySQL-ove baze podataka tako to optimizujete podeavarUa servera, baze podataka i upite u svojim uslovima. N,1 kraju svakog poglavlja, nalazi se niz pitanja i vebi u vezi s gradivom poglavlja, da biste mogli da provebate ono to ste u poglavlju. Napomena u vezi s licenci ranja MySOL-a l nmpanij a MySQL AB, kojom upravljaju projektanti i autori MySQL-a, vlasnik je MySQL-ovog koda i dokumentacije. delova MySQL-ovog izvornog koda na raspolaganju su pod uslovima GNU tlptcjavne licence (General Public License, GPL).To da moete 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 morate 1 ll liti pod GPL uslovima. Ako distribuirate binarne verzije, morate uz njih distribuirati , 11vorni kod. Cco tekst uslova GNU GPL licence za distribuiranje MySQL-a moete 11 lkktronskom obliku u MySQL-ovom referentnom ili na Web lokaciji l ondacij e za besplatan softver (Free Software Foundation): hl Lp://www.gnu.org/licenses/ Vie detalja o GNU uslovima na: http://www.gnu.org/licenses/gpl-faq.html Ako to ne odgovara vaim 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 moete kupiti i ako elite da pomognete razvoj MySQL-a. Vano je napomenuti da MySQL-ova dokumentacija nije na raspolaganju pod GPL uslovima, ali se moe slobodno tampati za upotrebu. l Instaliranje MySQL-a 2 Kratak obilazak I Osnove MYSQL-a 1 Instaliranje MySQL-a t >VOM POGLAVLJU kako se instalira i podeava MySQL za 111 upotrebe. teme: l11staliranje na Linux l11staliranje na Windows l11staliranje na OS X Podeavanje sistema lozinke za nalog root llrisanje anoninmih naloga. od instaliranja MySQL-a na sistem. Ako imate instaliran primerak <)L- a 4.1 ili neku stariju verziju, moete tekst do odeljka "Zadavanje Ito. 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 sistema postoje verzije MySQL-a koje se distribuiraju u 1!111,11110111 obliku ili kao izvorni kod. Ako tek kako se koristi MySQL, 1 11111 vam da preuzmete binarnu verziju jer se znatno lake instalira. Dodatna prednost 11 1 lo to je binarna verzija MySQL-a podeena za optimalne i stabilne perfom1anse. l .. t svaku platformu, MySQL postoji u tri varijante: Standard, Max i Debug. Za (llllllt'IC iz ove knjige, potrebna vam je varijanta Max, u koju su razne kori- lli kao to su InnoDB tabele koje upotrebu transakcija, Int' remo vrlo koristiti. MySQL je na raspolaganju istovremeno u vie verzija: verzija, najnovija ver- 'l' 1 11ekoliko razvojnih verzija iz vie faza razvoja. Ova knjiga je napisana za verziju 4.1. MySQL moete preuzeti s Web lokacije: www mysql.com/downloads/index.html U 11<\Stavku ovog poglavlja opisujemo kako se instaliraju binarne verzije MySQL-a l'od l inuxom, Windowsom i OS X-om. Postoji MySQL i za nmoge dmge operativne ali detalje o instaliranja morate potraiti u MySQL-ovoj dokumentaciji. Instaliranje na Linux U zav_is.nosti od verzije koju imate i od toga koliko je svea, vrlo je verovatno da vec J mate neku verZljU MySQL-a instaliranu na svom ali je vrlo verovatno da to nije najnovija verzija. da MySQL iz MySQL-ove RPM datoteke, pod uslo- 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 vae distribucije Linuxa, ako tek .MySQL-a. Binarne verzije na MySQL-ovoj Web lokaciji auriraju se cesc: b1lo kojoj v distribuciji Linuxa, to da su u njih najnovija poboljsanja J 1spravke gresaka. Osm1 toga, struktura direktorijuma na vaem podeena kako je opisano u MySQL-ovoj dokumentaciji, to vam za svakako olakati traenje informacija. _Jedna distribucija se sastoji od vie RPM datoteka. Da biste mogli da koristite klljent 1 server verzije MySQL-a, potrebne su vam datoteke MySQL-server- - VERZljA.i386.rpm, MySQL-Max- VERZljA.i386.rpm i MySQL-client- VER- ZljA.i386.rpm. VERZijA zamenjena brojem verzije.) Server i klijent moete instalirati ako u komandnom okruenju otkucate komandu: rpm -i MySQL-server-VERZIJA.i386.rpm MySQL-client-VERZIJA.i386 .rpm . pokrenuti i mysqld, MySQL server, i formirati 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 tj. ne iz RPM datoteka -potraite detaljnija uputstva u MySQL-ovoj dokumentaciji. Ivmajte u vidu da postupak instaliranja MySQL-a moe biti sloen i da se moze. onog koji moda poznajete iz verzija MySQL-a koje ste ranije mstabrah, 1h od vase verzije Linuxa. Instaliranje na Windows biste instalirali MySQL na neku noviju verziju Windowsa, morate se najpre prija- Vltl na s1stem kao administrator. Akvo !mate u neku verziju MySQL-a, morate zaustaviti server pre nego sto pocnete mstal1ra11Je nove verzije. To se radi komande: mysqladmin -u root -p shutdown . Ako imate kao Windowsov servis, najpre da uklonite taj serv1s. To mozete urad1t1 u komandnom okruenju komande: mysqld --remove l\\ n/L' bttt polrtbno d.t myoq l cl'/;IIIICililc imenom prvobitne binarne verzije servera l"111 \lt' imt.1lirali kao Windowsov servis. Al o vit.: volite da radite s alatkama, servis moete da uklonite i 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 moe biti sloen i moe t.tllikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta- svojoj verziji Windowsa. instaliranje raspakivanjem .zip datoteke lt tp 1 ste preuzeli sa We b lokacije. lJ zavisnosti od trenutka kada ovo budete sadraj te datoteke moe 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 111\t.tl1rati tako to dvaput pritisnete ime MSI datoteke. Instalacioni program vam ponuditi opciju da instalira MySQL u podrazumevani l11 d;.torijum (c:\mysql) ili u neki drugi. U ovoj knjizi pretpostavljamo da ga 111\t.llirati u podrazumevani direktorijum. Poto instalirate MySQL, treba da napravite datoteku s parametrima koji potetnu konfiguraciju MySQL-a. Trebalo bi da to obavite pre nego to prvi put pokrenete server. Vie detalja o podeavanju sistema u odeljku "Podeavanje !'lema", u nastavku ovog poglavlja. Poto podesite parametre sistema, korisno je da server prvi put pokrenete s omandne linije. (U nastavku ovog poglavlja kako se MySQL instalira .10 Windowsov servis, ali pogledajmo prvo da li uopte radi.) Otvorite prozor komandne linije i u direktorijum u koji ste instalirali MySQL. Ako imate standardnu instalaciju, to biti c:\mysql\bin. Otkucajte mysqld-max --standalone Trebalo bi da se nakon toga prikae grupa poruka. Ako je dosad sve u redu, moete instalirati MySQL kao Windowsov servis. Otkucajte ime izvrive datoteke servera koju nameravate da koristite, a zatim i opciju --install. Na primer: mysqld-max --install U ovoj knjizi izvrivu datoteku mysqld-max. Da bi vaa instalacija MySQL-a postala potpuno funkcionalna, preostaje vam da obavite jo jedan, poslednji posao. Poto su neki od programa pridruenih MySQL-u zapravo skriptovi napisani na jeziku Perl, potrebna vam je i Perl maina da bi ti pro- grami mogli da rade. Preuzmite i instalirajte ActivePerl sa Web lokacije ActiveState: www.activestate.com/Products/ActivePerl/ ActivePerl dobijate u obliku MSI datoteke. Preuzmite ActivePerl i instaiii,IJ!t ga tako to dvaput pritisnete ime te datoteke. Moete prihvatiti sve vrednosti parametara koje vam instalacioni program ponudi za upotrebu s MySQL-om. Instaliranje na OS X MySQL moete instalirati na OS X iz paketa, pod uslovom da imate OS X 10.2 ili noviji. Ako imate neku verziju MySQL servera koja je aktivna na vaem morate je zaustaviti pre nego to instaliranje nove verzije. To moete ura- diti tako to na komandnoj liniji otkucate komandu: mysqladmin -u root -p shutdown Da biste mogli da pokrenete server, potreban vam je nalog je ime mysql. Ako imate OS X 10.2 ili noviji, taj nalog postoji. S MySQL-ove Web lokacije treba da preuzmete .dmg datoteku- tj. datoteku slike diska. Prvo otvorite Finder, a zatim dvaput pritisnite .dmg datoteku. se sadraj datoteke slike diska. PKG datoteku i dvaput je priti- snite. Za potrebe ove knjige moete prihvatiti sve vrednosti opcija koje vam instala- cioni program ponudi. MySQL moete podesiti tako da se automatski pri podizanju sistema, tako to dodate Startupitem. To moete uraditi ako dvaput pritisnete datoteku MySQL- Startupltem.pkg koja bi trebalo da se nalazi u vaoj .dmg datoteci. Poto izvrite postupak opisan u odeljku "Podeavanje sistema", moete pokrenuti MySQL server tako to otkucate komandu, pod uslovom da ste instalirali Star- tup Item: sudo /Library/Startupitems/MySQL/MySQL start Ako niste instalirali Startupltem, server moete pokrenuti niza komandi: cd /usr/local/mysql sudo ./bin/mysqld_safe Pritisnite Ctrl+Z. I najzad, otkucajte komandu: bg Ako niste instalirali Startupitem, morate ponoviti ove korake kad god svoj sistem i elite da koristite MySQL. Imajte u vidu da postupak instaliranja MySQL-a moe biti sloen i moe se razlikovati od onog koji moda poznajete iz verzija MySQL-a koje ste ranije insta- lirali, ili moe biti na vaoj verziji OS X-a. Podeavanje sistema konfiguracija MySQL-a takva kakvu ste je instalirali; neke korisne su standardno a instalacija nije' dovoljno U ovoj knjizi da izmenite opcije: ll da koristiti InnoDB tabele, morate obaviti osnovno podeavanje za upotrebu tog tipa tabela. da beleenje izmena u dnevnik (engl. binary log) u svim situacijama. To je veoma korisno u oporavljanja od katastrofalnih greaka. l da beleenje sporih upita u dnevnik, to vam da optimizujete svoje aplikacije. MySQL smeta vrednosti konfiguracionih parametara u datoteku opcija. Ako kori- lit t Windows, globalnu datoteku opcija moete smesti ti u Windowsov sistemski oi ill ktor u um i nazvati je my.ini, ili u e: \my.cnf. da koristite my. ini jer II.IStavak .cnf ponekad koristi za datoteke drugih aplikacija. U operativnim sistemima iz porodice Unix, globalna datoteka opcija je .llii'tena u direktorijum /etc/my.cnf. Ako elite da na istom radi vie r-- lySQL servera, podatke za svaki server moete u zasebnoj datoteci my.cnf lllt'tenoj u direktorijumu data svakog servera. Osim toga, moete dozvoliti korisni- ' 1111,1 da za svoje naloge imaju individualne opcije, koje bi trebalo da budu smetene u ol1tntcci -/.my.cnf(obratite panju na ispred imena datoteke). U zavisnosti od vae instalacije, moda u ni imati datoteku opcija. t ltvorite tu datoteku u svom editoru za tekst- Notepad sasvim lepo nh.1viti posao ako koristite Windows- ili je napravite ako ne postoji. Predlaemo vam datoteku opcija sa opcijama (listing 1.1): l h ting 1.1 Predloena datoteka opcija tmysqld] ll aktiviranje dnevnika izmena i dnevnika sporih upita tog bin log-slow-queries Podeavanje za InnoDB tabele ll Ovo je osnovna datoteka opcija predloena u dokumentaciji ll Datoteke za podatke treba da ll skladitenje podataka i indeksa. ll Obezbedite dovoljno slobodnog ll prostora na disku. innodb_dat a_file_path = ibdatal:lOM:autoextend ll Podesi te rezerve za bafere na ll 50-80% mermorije ll na rwL-variable = innodb_buffer_pool_size=70M nPL-variable = innodb_additional_mem_pool_size=lOM ll Podes ite dnevnika na priblino ll 25% rezerve za bafere set-variable innodb_log_file_size=20M set-variable = innodb_log_buffer_size=BM # Podesite .. flush_log_at_trx_commit # na O ako moete da prihvatite gubljenje # nekoliko poslednjih transakcija innodb_flush_log_at_trx_commit=1 deo sadraja ove datoteke opcija zasniva se na veoma jednostavnoj konfigura- cionoj datoteci za upotrebu Inn o DB tabela, koja je predloena u MySQL-ovoj doku- mentaciji. Ako imate instalaciju u kojoj se koriste InnoDB tabele i dodate joj ovu datoteku opcija, moda morati da pretvorite u komentar red: set-variable = innodb_log_file_size=20M tako to na reda upisati znak#. (Ako imate datoteku dnevnika druge to moda zbuniti MySQL.) Ostala podeavanja opisana su u poglavlju 12, "Podeavanje MySQL-a". Provera da li sistem radi Poto instalirate MySQL, podesite ga tako da se automatski pri podizanju Ako je podeen, trebalo bi da bude uspostavljanje veza sa MySQL serverom. To moete proveriti komande: mysql -u root Moe biti potrebno da zadate punu putanju izvrive datoteke mysql (na primer, na Windowsu, to je e: \mysql \bin\mysql -u root) ili da izmenite vrednost sistemske promenljive PATH. Trebalo bi da se na ovaj uspeno prijavite kao korisnik root (administrator) MySQL monitoru (tj. MySQL-ovom interfejsu u obliku komandne linije). Na vaem ekranu trebalo bi da se pojavi uvodna poruka: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 to server version: 4.1.0-alpha-max- -debug-log Type 'help; ' or '\h' for help. Type '\e' to clear the buffer. mysql> Na vaem sistemu verovatno biti broj veze (connection id) i broj verzije servera. Neka vas to ne brine. Ako se pojavi poruka nalik na ERROR 2003: Can't connect to MySQL server on 'localhost' (10061) to da MySQL server ne radi. Pokuajte ponovo da pokrenete sistem da bi se ser- ver automatski pokrenuo zajedno s njim, ili pokrenite server komande: mysqld --standalone na komandnoj liniji. (To najlake uraditi u jednom prozoru, a zatim otvorite drugi prozor iz kojeg se prijaviti na server.) Da biste se odjavili iz MySQL monitora, otkucajte \q (Obrnuta kosa crta, slovo q i pritisak na taster Enter.) . . .. . 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. daje to vano, preporucujemo vam da ovog poglavlja. Zadavanje lozinke za nalog root . Kao to ste verovatno 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 bezbednosnih razloga, veoma je vano da tom ualogu dodelite lozinku. U MySQL monitoru otkucajte aet password for rootlocalhost=password('lozinka'); Razume se lozinka lozinkom koju ste izabrali za nalog root. Od javite se' (\q) a zatim se ponovo prijavite. Ovog puta morati da se prijavite komandom: mysql -u root -p MySQL zatraiti da zadate svoju lozinku. Parametar -u ime korisnika, ; 1 parametar -p 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.' vam da te naloge izbriete. Razlozi zbog kojih treba da to uradtte optsam su u poglavlju 15 . "Zatita MySQL servera", u odeljku "Brisanje anonimnih naloga". Te naloge mo zete ukloniti niza komandi: use mysql; delete from user where User=''; delete from db where User=''; (lush privileges; Pravljenje naloga za 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 Vtse deta.lja 0 tome kako se upravlja nalozima u MySQL-u naCl cete u poglavlju 11, "Upravljanje pravima korisnika" . komande napravite nov nalog koji 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 imekorisnika i lozinka, u tekst komande treba da upiete svoje ime i lozinku. Trebalo bi da se sada odjavi te sa servera, pa ponovo prijavite na njega pod imenom korisnika i lozinkom koje ste zadali. U nekim od zavrnih poglavlja ove knjige mora- da koristite nalog root da biste obavili poslove, ali poto nalog koji ste upravo napravili ima manja prava od naloga root, bezbedniji je za sva- kodnevne poslove. Saetak U ovoj f.ni trebalo bi da vaa instalacija MySQL-a bude upotrebljiva a vi spremni da sledi te gradivo iz preostalog dela knjige. Trebalo bi da ste dosad obavili Preuzeli najnoviju binarnu verziju MySQL-a za va operativni sistem s Web loka- cije mysql.com. Instalirali je- instalacionog programa (na Windowsu ili OS X-u) ili alatke RPM. Podesili server tako da se automatski pri podizanju sistema, ako je to u vaem 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. Vebe Instalirajte MySQL na lokalni sistem prema postupku opisanom u ovom poglavlju, ukoliko jo niste to uradili. U poglavlju U poglavlju 2",Kratak obilazak", komponente vae instalacije MySQL-a, ponovo pogledati interfejse i osnovni upotrebe MySQL-a. 2 Kratak obilazak u OVOM POGLAVLJU UVODI SE STRUKTURA MySQL-a i alatke koje su mu _Pri- d1uene. vas u kratak obilazak da biste saznali koje sve postoje u MySQL-u i koji su klijentski interfejsi. sledece teme: Strukturu MySQL-ovih direktorijuma Pregled izvrnih datoteka Pregled interfejsa Kratak uvod u MySQL monitor. truktura MySQL- ovih direktorijuma .. l J ovom poglavlju da ste instalirali MySQL na standardnu lokaciJU na vom operativnom sistemu. Ako ste ga instalirali na drugo mesto, osnovna struktura dlll'ktorijuma ista, ali kerenski direktorijum biti Ukoliko vam je sistem sa instaliranim 1 1uktura direktorij uma se moda razlikovati. Na primer, ako Imate v . Hat 9, daje organizacija datoteka izmenjena tako da se u op.s:1 , 1,tcm skladitenja datoteka. Ako ste MySQL instalirali iz RPM 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 struktura direktonJuma b1t1 dru gaCIJa sto zavisi od 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 IZ blll.lrne distribucije, kao to je 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. /U rUylctVIJt: L 1'\.ldldl\. UVIIOLO" U tom direktorijumu ostalog, poddirektorijume (pod pretpostavkom da ste instalirali MySQL iz binarne distribucije): bin: U ovom direktorijumu nalaze se MySQL server, klijentski programi i vie drugih korisnih programa u prevedenom obliku. Sadraj tog direktorijuma opi- san je u narednom odeljku ovog poglavlja. scripts: Ovaj direktorij um sadri grupu skri p tova napisanih na jeziku Perl koji obavljaju korisne poslove. ih detaljnije u narednom odeljku ovog poglavlja . data: Ovo je direktorij um u kojem se vai podaci. does (Linux) ili Does (Windows): U ovom direktorijumu 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 korisnik retko zala- ziti. To su: include (sadri datoteke zaglavlja), lib (biblioteke funkcija koje MySQL koristi), share (sadri tekst poruka o grekama koje MySQL alje) i example (postoji samo na Windowsu, sadri primere upotrebe datoteke libmysql.DLL). Ako instalirate drugi softver (kao to je PHP) koji se povezuje s MySQL-om, moe vam zatrebati da znate gde se ti direktorijumi nalaze ali malo je verovatno da neto direktno menjati u njima. Pregled izvrnih datoteka MySQL-ove izvrne datoteke nalaze se u direktorijumima bin i scripts. Pogledajmo najpre direktorijum bin. U njemu izvrnu datoteku mysqld ili datoteku s nekim drugim imenom, to zavisi od operativnog sistema koji imate. To je program MySQL servera koji ste u poglavlju 1 podesili tako da se automatski zajedno sa operativnim sistemom. Tu i mysql, MySQL monitor. To je osnovni klijentski program sa mter- fejsom u obliku komandne linije. . Osim ova dva najvanija programa, i vie drugih. Upotrebu mnogih od njih u pojedinim poglavljima ove knjige. Ovde navesti samo neke najkorisnijim: mysqladmin: Slui za obavljanje administrativnih funkcija. myisamchk: Slui za proveru i popravljanje MyiSAM tabela. mysqldump: izradu rezervnih kopija baze podataka. mysqlbinlog: dnevnika izmena, to je za opora- vljanje baze u katastrofalne greke. mysqlshow: Slui za prikazivanje podataka o bazama podataka i njihovim tabelama. Pregled interfejsa Kroz celu ovu knjigu programe mysqld i mysql, a na druge pomenute programe vrati se u petom delu, "Administriranje MySQL-a". Pogledajte sadraj 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 njima kada vam budu zatrebali u ovoj knjizi. Najvaniji od onih koje koristiti u ovoj knjizi jeste mysqlhotcopy, koji slui za 111 adu rezervnih kopija baze podataka. (Tu temu razmatramo u poglavlju 14, "Izrada 11'zervnih kopija i obnavljanje podataka".) Pregled interfejsa MySQL-u moete pristupati vie interfejsa, ili klijentskih pro- gl.l!na.Tri najpopularnija interfejsa su: mysql (u obliku komandne linije), poznat i kao MySQL monitor, MySQL Control Center (ili, MySQLCC) 1 phpMyAdmin. MySQL monitor je 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 interfejs. Napisan je skupa alatki za izradu prozora Qt, koji izradu verzija za 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 interfejs za upotrebu MySQL-a. Veoma je popu- 111 an Internet usluga koji svojim korisnicima stavljaju na raspola- MySQL radi razvijanja Web aplikacija. Ako imate instaliran MySQL, imate i MySQL monitor. MySQLCC je pwizvod za rad s MySQL-om, ali u zavisnosti od verzije MySQL-a koju imate, 111nda morati da ga posebno preuzmete sa adrese: www.mysql.com/downloads/mysqlcc.html MySQLCC se izuzetno lako instalira, a uputstva o tome na adresi: www.mysql.com/products/mysqlcc/install.html phpMyAdmin moete preuzeti sa adrese: www.phpmyadmin.net/ Ako elite da sami instalirate phpMyAdmin, morate imati funkcionalan Web ser- nl 1 instaliran PHP. Za potrebe ove knjige, nevano je koji interfejs odabrati. Svi nude Jl'dnaku osnovnu funkcionalnost. Upite unosite u obliku teksta, a rezultati se prika- :tiJll u obliku teksta, bez obzira na interfejs koji upotrebite. i>rimeri koje dajemo u ovoj knjizi testirani su MySQL monitora, ali vi 1110ete koristiti ta god vam odgovara- mysql, MySQLCC, phpMy Admin ili koji god klijentski program na Internetu. Za neke poslove potrebno da it kn ns n i interfejsa i upotrebite koma n dno okruenje operativnog sistema. 21 22 Poglavlje 2 Kratak obilazak Kratak uvod u MySQL monitor Sada ukratko opisati osnovni upotrebe MySQL monitora. Prijavljivanje za rad u mysql opisali smo u prvom poglavlju. Samo da vas podsetimo, u MySQL moni- tor prijavljujete se 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 moete upotrebiti opciju -h da biste zadali ime tog na primer: mysql -h -u imekorisnika -p U MySQL-uje zaista korisna opcija --i-am-a-dummy. Isti rezultat postiete i opcije --safe -update s. Na primer: mysql --i-am-a-dummy -u root -p Ova opcija tetu koju biste mogli da zadate komande. To je korisna opcija (na raspolaganju samo u alatki u kojoj se komande zadaju na komandnoj liniji) kada se kao malo pribojavate rada u MySQL-u. Moda bi bilo dobro daje koristite dok ovu knjigu. (Konkretno, ova opcija vas da aurirate ili izbriete redove u tabelama ako ne zadate vrednost primarnog tih redova. Ako jo ne znate ta to nemojte brinuti. Sve postati jasno u delu knjige, "Upotreba MySQL-a".) Poto se prijavite u MySQL, moete videti koje sve baze podataka postoje, ako zadate komandu SHOW: show databases; Kod u ovoj fazi rezultat ove komande kratak spisak baza poda- taka. Trebalo bi da se na vaem spisku pojavi baza podataka mysql. To je sistemska baza podataka u kojoj se podaci o nalozima i njihovim pravima. Vie o tome u nastavku ove knjige. Obratite panju na to da se komanda zavrava znakom i zarez. komandi koje otkucate u MySQL monitoru morate zavriti tim znakom ih MySQL izvriti. Otkucajte: show databases i zatim pritisnite Enter. MySQL samo mirno Ako potom otkucate znak i zarez i pritisnete taster Enter, komanda biti izvrena. To da sloene komande raspodelite u vie redova da bi bile Umesto znaka i zarez, moete upisati \g (obrnuta kosa crta i slovo g), ali koristi i zarez. Moete izabrati neku bazu podataka sa liste i otkucati komandu: use imebaze; (Upiite ime baze kojoj elite da pristupite.) Time navodite MySQL-u da elite da radite sa baz<?m podataka. Izabe- rite jednu sa spiska i otkucaj te ovu komandu. (Moda imati prava da pristupite Saetak bazi podataka. Ako dobijete poruku o tome, izaberite drugu bazu podataka p.1 pokuajte ponovo.) Poto izaberete bazu podataka, moete videti koje se sve tabele nalaze u njoj, ako 111 k ll Cate komand ll: 11 1iow tables; Podatke o tabeli moete dobiti komande: til ncri be tablename; Iz MySQL monitora moete se odjaviti tako to otkucate: \q bratite panju na to da se ova komanda ne zavrava znakom i zarez. Postoji l', illpa komandi koje znakom\ (obrnuta kosa crta). Nijedna od njih ne zavr- ,, va se znakom i zarez. Spisak tih komandi moete dobiti ako otkucate: \h (Slovo h od help.) MySQL-ove i SQL-ove komande moete upisivati direktno ll MySQL monitor. Ml'tlutim, te komande moete uneti u datoteku koju zatim izvrite jednom o111andom, kao skript. To raditi u nastavku ove knjige, npr. kada u poglavlju 4, ,. l 'r avljenje baza podataka, tabela i indeksa", budete pravili baze podataka. Ako ste prijavljeni u MySQL monitor, datoteku koja sadri komande moete izvr- dir kad otkucate: ""ree imedatoteke Ukoliko niste prijavljeni u MySQL monitor, datoteku s komandama moete rr.vriti preusmeravanjem rezultata te datoteke; na primer: myoql -u imekorisnika -p e imedatoteke Ovim ste stekli osnove o upotrebe klijentskog programa mysql. aetak Najvaniji direktorijumi u instalaciji MySQL-ajesu bin (izvrni programi), data (podaci iz baze podataka) i does (dokumentacija). Dva programa koja koristiti jesu mysqld (MySQL server) i mysql, klijentski program u kojem se komande zadaju preko komandne linije. Moete birati vie interfejsa, odnosno klijentskih programa. Pomenuli smo mysql (interfejs u obliku komandne linije) , MySQLCC interfejs) i phpMyAdmin (Web interfejs). Program mysql ima vie korisnih opcija koje moete 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 i --i-am-a-dummy (za tete). 24 Poglavlje 2 Kratak obilazak Poto se prijavite na server, moete izdati komande SHOW DATABASES ili SHOW TABLES da biste dobili spisak objekata u sistemu, ili komandu DESCRIBE imeta- bele da biste dobili podatke o tabeli. Iz MySQL servera moete se odjaviti komande \q. Komande moete zavravati znakom ; ili znakovima \g da biste ih poslali servem na izvrenje . Datoteku koja sadri komande moete izvriti iz klijentskog programa 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 zavravaju znakom i zarez b) komande treba da se zavravaju znacima \g e) moe a) ili b) d) nita od prethodnog nije 5. Opcija --i-am-a-dummy zadata u programu mysql a) to to pie b) me da napravim previe tete dok SQL e) me da uradim bilo ta osim prijavljivanja i odjavljivanja d) nita od prethodnog nije U poglavlju Vebe l'r tuznute i instaliraj te neki ili Web interfejs, kao to je MySQLCC. Vtzbajte prijavljivanje i prikazivanje spiska baza podataka klijent- programa koji ste izabrali . Odgovori fl1lanja l . d ) a \. e l . e 'l . b U poglavlju l J poglavlju 3, "Ubrzani kurs projektovanja baza podataka", razmotri opte kon- ' qllt: u vezi s bazama podataka, terminologiju i principe projektovanja, i rrnrrnalizaciju.Ako niste u oblasti baza podataka, ali ste u MySQL-u, '" rrtorate detaljno to poglavlje. II Projektovanje i izrada baza podataka u MySQL-u \ Ubrzani kurs projektovanja baza podataka l Pravljenje baza podataka, tabela i indeksa 3 Ubrzani kurs projektovanja baza podataka U OVOM POGLAVLJU 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 da na 'riJ hrt i to manji utroak prostora na disku uz svih veza koje postoje 1'HI.1taka. teme: Koncepti i terminologija baza podataka Principi projektovanja baza podataka Normalizovanje i normalne forme Vcbe iz projektovanja baza podataka. Koncepti i terminologija baza podataka l 1.1 !liSte razumeli principe koje razmatrati u ovom poglavlju, moramo najpre othJ.IStliti neke osnovne koncepte i terminologiju. l ntiteti i relacij e l hnovni elementi koje pokuati da model ujemo jesu entiteti i relacije. Entiteti su '' v.11 i" (predmeti, osobe, organizacije itd.) iz stvarnog ivota o kojima podatke 11 h.1:n podataka. Na primer, moemo se opredeliti da evidentiramo podatke o zaposle- 111111.1 i slubama u kojima rade. U tom bi zaposleni bio jedan entitet, a sluba 11 radi- drugi. Relacije su veze koje postoje entiteta. Na primer, zaposleni t,tdi ll slubi. "Radi u" je relacija (veza) entiteta zaposleni i sluba. ltdacije mogu biti vrsta. Postoje relacije tipa "jedan prema jedan", ,jedan ptt'tlla vie" (ili "vie prema jedan", u zavisnosti od toga s koje strane relacije posma- lt,tlt') 1., vie prema vie". Relacija tipa ,jedan prema jedan" povezuje samo dva entiteta. JU ruyraVIJI:: J VUILdfll UdLd Ako bi svaki zaposleni u ovoj organizaciji imao svoju pregradu s stolom, to bi bila relacija tipa ,jedan prema jedan". U primerima kao to je navedeni, ta veza "radi u" je tipa "vie prema jedan", tj. vie zaposlenih radi u datoj slubi . Tc dve vrste rela- cija prikazane su na slici 3.1. Candy Istraivanje i razvoj -Jr________.____",
Nora
Ajay Slika 3.1 Relacija "nalazi se u" jeste tipa ,jedan prema jedan". Relacija "radi u" jeste tipa "vie prema jedan". Imajte u vidu da entiteti, relacije i vrste relacija njima zavise od okruenja i poslovnih pravila koje pokuavate da modelu jete. Na primer, u nekim firmama jedan zaposleni moe raditi u vie slubi. U tom bi relacija "radi u" bila tipa "vie prema vie". Ako vie ljudi deli istu pregradu ili kancelariju, onda relacija "nalazi se u" nije tipa "jedan prema jedan". Kada projektujete bazu podataka, morate uzeti u obzir pravila koja vae u sistemu koji modelujete. Ne postoje dva potpuno jednaka sistema. Koncepti 1 termrnologiJa oaza podataka l.tbele tySQL je sistem za upravljanje relacionim bazama podataka (engl. Relational Database \ ltiiWgement System, RDBMS), to da podrava baze u kojima postoje relacije 1 111\!du podataka koji se u tabelama (engl. tables). Ako ste ikada koristili neki za tabelarne svaki njegov radni list ima oblik tabele s podacima. 1 1 111llCr tabele je prikazan na slici 3.2. emolovee em loveeiD name ob departmentiD
1 Noro edwards Ben Smith 1 Programmer OBA
6651 Ajay Palal Programmer 128 !016 Candy Burnett Systems Administrator 128 Slika 3.2 U tabeli employee (zaposleni) se ifre zaposlenih (employee ID), imena (name), poslovi kojima se bave Gob) i slube u kojima rade (departmentiD). Kao to vidite, ova tabela sadri podatke o zaposlenima u jednoj kompaniji. (Nisu pr1bzani podaci o svim zaposlenima, samo nekoliko primera.) Kolone ili atributi l J tabelama baze podataka, svaka kolona ili atribut opisuje podatak koji se 11 .d.tzi u svakom redu tabele. kolona (engl. column) i atribut (obeleje, engl. attri- /111/r) koriste se kao sinonimi, ali je da je kolona deo tabele, dok se atribut 1ul11osi 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 ponovo tabel u employee. Svaki red te tabele predstavlja zapis o jednom t.tposlenom. Moda izraze redovi (engl. rows), slogovi ili zapisi (engl. records) 11i n- torke (engl. tup/es). Svaki red u ovoj tabeli sadri podatke iz svih kolona tabele.
(engl. superkey) je kolona (ili grupa kolona) koja identifikuje red t.tbele. (engl. key) je minimalni Pogledajte tabel u employee. Da bismo identifikovali svakog zaposlenog, moemo upotrebiti kombinaciju kolona t'ntployeeiD i name, ili koristiti kombinaciju svih kolona (employeeiD, name, job, tkpartmentiD). Obe kombinacije su da bismo identifikovali svaki red tabele, nisu nam potrebne sve te kolone, je dovoljna samo jedna (na primer) employeeiD, odnosno mini- Illa ina grupa kolona koje nedvosmisleno identifikujemo svaki red. Prema tome, je kolona employeeiD. Pogledajte ponovo tabelu employee. Jednog zaposlenog moemo identifikovati po 1111enu (name) ili po ifri zaposlenog (employeeiD). Obc kolone su Tc klju (l'vc o kandidati za k(j11fc1Jl' (engl. candidate kcys) jer su to 1.( J kojima izabrati primarni (engl. pri mary) Primarni je kolona ili grupa kolona koje identifikovati pojedine redove tabele. U ovom za tu namenu kolonu employee ID. To je bolji od kolone name jer se da dve osobe imaju isto ime i prezime. Spoijni (engi.Joreign keys) predstavljaju veze tabela. Na slici 3.2 vidite da kolona departmentiD sadri brojeve koji predstavljaju ifre slubi u kojima rade zaposleni. To je spoljni skup svih podataka o slubi se u drugoj tabeli, u kojoj je primarni kolona departmentiD. Funkcionalne zavisnosti Izrazjunkcionalna zavisnost (engi.Junctional dependency) koristi se nego drugi koje smo naveli, ali treba da shvatite njegovo da biste razumeli postupak normali- zavanja o kojem biti u nastavku ovog poglavlja. Ako u datoj tabeli postoji funkcionalna zavisnost kolone A i kolone B, koja se moe napisati kao A -7 B, vrednost u koloni A vrednost u koloni B. Na primer, u tabeli employee, kolona employeeiD funkcionalno ime zaposlenog (a u ovom primeru i sve druge atribute). eme Izraz ema ili ema baze podataka (engl. database schema) 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 u bazi. emu jedne tabele u bazi podataka piemo na employee ( employeeiD, name, j ob, U ovoj knjizi se pravila da se atributi koji predstavljaju primarne punom linijom, a atributi koji predstavljaju spoljne - Pri- marni koji su istovremeno i spoljni, se i punom i linijom. Principi projektovanja baza podataka Kada projektujemo bazu podataka, moramo razmotriti dva vana pitanja: Koje sve podatke treba odnosno o kojim sve stvarima ili entitetima moramo da podatke? Koju vrstu pitanja postavljati bazi podataka? (Pitanja bazi podataka zovu se upiti.) Kada traimo odgovore na ova pitanja, moramo uzeti u obzir poslovna pravila organizacije koju pokuavamo da modelujemo, o sve moramo da podatke i koje su veze tih podataka. Na osnovu odgovora na ova pitanja moramo da napravimo bazu podataka struktura biti takva da strukturne probleme kao to su redundantnost (dupli- ranje) podataka i anomalije podataka. nmc1p1 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 da se isti podatak ponavlja 11 1 redovima iste tabele ili u tabelama baze podataka. Zamislite da umesto dve tabele, employee (zaposleni) i department (slube), imamo 11110 jednu tabelu koja se zove employeeDepartment. To moemo izvesti ako tabeli IIIJlloyee dodamo kolonu departmentName tako da ema tabele postaje cmployeeDepartment(employeeiD. name, job, departmentiD, departmentName) Za svakog zaposlenog koji radi u slubi je ifra 128, Research and Development (htt.1ivanje i razvoj), moramo da ponovimo podatak "Research and Development" ( Irb 3.3). Isto vai i za sve ostale slube kompanije. employeeDepartment employeeiD name ob de artmentiD de artmentName
ora_t:a_war s rogrammar
1 ana Ue\le opment Ben Smith OBA Fmance 6651 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 slube. Ovu emu moemo da izmenimo na tmployee(employeeiD, name, job, dcpartment(departmentiD, name) U ovom se naziv slube na samo jednom mestu, pa se minirnizuje 1111 oak prostora na disku i izbe gavaju problemi . Obratite panju na to da smo morali da ostavimo kolonu departmentiD u tabeli 111ployee; bez nje bismo izgubili informaciju iz eme, odnosno u ovom bismo vezu zaposlenog i slube u kojoj radi. Kada poboljavamo emu baze Jlodntaka, moramo uvek imati u vidu oba cilja, tj. manju redundantnost podataka ali lll'z gubljenja informacija. Anomalije /\11omalije su neto sloeniji koncept. To su problemi koji se pojavljuju poda- ' 1111.1 zbog loe osmiljene strukture baze podataka. Mogu se pojaviti tri vrste anoma- lq.t, koje opisati na primeru loe osmiljene eme sa slike 3.3. Anomalije pri dodavanju podataka Allt111lalije pri dodavanju podataka nastaju kada u tabelu s loe osmiljenom struktu- llllll pokuate da unesete nove podatke. Zamislite da imamo novog zaposlenog koji poti nje da radi u kompaniji. Kada njegove podatke unosimo u tabelu, moramo da 1111csemo i ifi-u i naziv slube u kojoj radi. ta se ako unesemo podatke koji se 1,wlrkujr1 od u tabeli, npr. ako upiemo da novi zaposleni radi u slubi J l' sili .1 42, J evl'lopment? Nakon toga vie biti jasno koji redovi tn bele sadre 1\jli.IVIIl' pod.1tkt 'J(> .k Jll ii1H'I ,\IIOill:llijl' J11 i \IIIOl'IIJll ll t'll91ilVIJe J uorzant Kurs proJeKwvanJa oaza pooaraKa Anomalije pri brisanju podataka Anomalije pri brisanju podataka nastaju kada se podaci briu iz tabele s loe osmilje- nom strukturom. Zamislite da svi zaposleni iz slube je ifra 128 daju otkaz (moda zato to im je sve dojadilo). Poto izbriemo sve zapise o tim zaposlenima, vie nemamo nijedan zapis u kojem se pominje sluba sa ifrom 128, niti njeno ime. To je primer anomalije pri brisanju. Anomalije pri auriranju podataka Anomalije pri auriranju podataka nastaju kada se auriraju podaci u tabeli s loe osmi- ljenom strukturom. Zamislite da je rukovodstvo donelo odluku da sluba je ifra 128 promeni ime u EmergingTechnologies. U tom moramo izmeniti podatke za svakog zaposlenog koji radi u toj slubi. Lako se moe dogoditi da nekog izostavimo.Ako se to desi, anomaliju pri auriranju. Null vrednosti Poslednje pravilo dobrog projektovanja baza podataka nalae da treba izbegavati eme koje dozvoljavaju broj nepopunjenih atributa. Ako elimo da evidentiramo da na svakih sto ili vie zaposlenih jedan od njih ima posebne kvalifikacije, u tabelu employee ne bismo dodali novu kolonu za tu vrstu podataka jer bi za 99 drugih zaposlenih ta kolona sadrala vrednost NULL. Umesto toga napravili bismo novu tabelu u kojoj bi se ifre i kvalifikacije samo zaposlenih koji ih imaju. Normalizovanje Normalizovanje je postupak koji ispravljanje loe osmiljene strukture baze podataka. U ovom odeljku o normalizovanju opisujemo normalne forme, to su grupe pravila o tome ta treba i ta ne treba da bude u strukturama tabela. Tokom postupka normalizovanja, tabele se razbijaju na manje tabele koje bolju strukturu. Da biste pratili postupak normalizovanja, na strukturu baze podataka redom sve tri normalne forme. U svakoj nomalnoj formi se polazi od pretpo- stavke daje ema baze podataka 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 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 da svaki atribut mora sadrati samo jednu vrednost, a ne kom.binaciju vie vrednosti ili drugi red baze podataka. Pogledajte tabelu na slici 3.4. To je nenorm.alizovana verzija tabele employee koju smo razmatrali u prethodnim odcljcima. Kao to vidite, dodata je nova kolona, skills, u kojoj su navedena znanja svakog zaposlenog. NormattzovanJe employee employeoiD name ob dopartmentiD skills
Nora Edwards Programmer
1 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 sadri grupu vrednosti. Svaka vrednost u toj koloni sastoji se od kombinacije drugih vrednosti, tj. umesto d.1 sadri prostu vrednost kao to je Java, kolona sadri listu vrednosti, kao to je e, l ' t l , Java. Time je prekrena pravilo prve normalne forme. Da bismo ovu emu doveli u prvu normalnu formu, moramo razdvojiti vrednosti 11 koloni skills na proste elemente. To se moe obaviti na vie Prvi i moda naj- ' n tglcdniji prikazan je na slici 3.5. emclovee employeeiD Name ob del'_artmentiD skill
IJ\Iora Nora Edwards 1 Programmar l 7513 Nora Edwards Programmar 12e Java 9642 Ben Smith OBA 42 082 6651 Ajay Patel Programmer 12e VB 6651 Ajay Patel Programmar 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 napravili smo jedan red po kvalifikaciji. Ova ema je sada 11 prvoj normalnoj formi. Razume se, ova organizacija podataka je daleko od savrene jer imamo veliku za svaku kombinaciju kvalifikacija/zaposleni u tabeli podatke o zaposlenom. Bolje reenje i pravilan 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
6651 Ajay Patel Programmar 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 reenje istog problema je pravljenje dodatne tabele. J b t"ogtaVIJe J uorzan1 Kurs proJeKtovanJa oaza poaaiaKa U ovom primeru, preneli smo kvalifikacije u zasebnu ta belu koja slui samo da povee ifre zaposlenih s pojedinim kvalifikacijam.a. Time smo reili problem redundantnosti. Moda se pitate kako smo doli do drugog reenja. Postoje dva odgovora. Jedan je: na osnovu iskustva. Do drugog odgovora dolazimo ako nastavimo primenu postupka normalizovanja na emu sa slike 3.5; u tom na kraju dobijamo emu sa slike 3.6. Prednost iskustva je to to i direktan prelazak na prav1lnu strukturu, ali sasvim je prihvatljiva i bukvalna prime na postupka. Druga normalna forma Poto postavimo emu u drugu normalnu formu, moemo je preneti u naredne nor- malne forme vieg stepena, koje se neto tee razumeju. Kae se daje ema u drugoj normalnoj formi (koja se zove 2NF), ako su svi atributi koji nisu deo primarnog funkcionalno potpuno zavisni od primarnog i emaje u prvoj normalnoj formi. ta to To da svaki atri- but koji nije deo primarnog mora biti funkcionalno zavisan od svih delova pri- marnog tj. ako primarni vie kolona, svi ostali atributi tabele moraju biti zavisni od kombinacije svih tih kolona. Pogledajmo primer da bi postalo jasnije. Pogledajte sliku 3.5. U toj emi, tabela sadri jedan red po zaposlenom i po kvalifikaciji. Ta tabela je u prvoj normalnoj formi, ali nije u drugoj. Zbog ta je primarni te tabele? Znamo da primarni mora identifi- kovati svaki red tabele. U ovom to je samo kombinacije kolona employeeiD i skills. Ako je sadraj kolone skills kao na slici, kolona employeeiD nije dovoljna za identifikovanje redova jer, na primer, vrednost em.ployeeiD 7513 postoji u tri reda. poto kombinacija vrednosti u kolonama employeeiD i skills identifikuje svaki red, je kao primarni Tako dolazimo do eme: employee(employeeiD, name, job, skill) Potom se moramo zapitati: "Koje sve funkcionalne zavisnosti postoje?" U ovom imamo: employeeiD, skill -7 name, job, departmentiD ali i employeeiD -7 name, job, departmentiD Drugim dovoljna nam je samo vrednost atributa em.ployeeiD da bismo odredili vrednosti ostalih atributa, tj. name,job i departmentiD.To da su ti atri- buti funkcionalno samo zavisni od izabranog primarnog odnosno vrednosti tih atributa mogu se odrediti samo na osnovu dela tog primarnog a njegova cela vrednost nije neophodna. Prema tome, ova ema nije u drugoj normalnoj formi. pitanje je: "Kako bismo je doveli u drugu normalnu formu?" Normalizovanjc '!''::!belu moramo razdvojiti na vie tabela u kojima su svi atributi koji nisu deo pri - liLl rnog funkcionalno potpuno zavisni od primarnog U ovom je ''' 1glcdno da to moemo 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 opisano, ova ema je u prvoj normalnoj formi zato to su sve vred- ll osti proste. Ona je u drugoj normalnoj formi zato to svaki atribut koji nije dl' o primarnog sada je potpuno zavisan od svih delova primarnog Ir normalna forma I'1111Ckad nekoga da kae: "Normalizovanje se celog i t11t1gog osim Druga normalna forma nalae da atributi moraju zavisiti od 1 1 log normalna forma propisuje da atributi zavise samo od 1:ormalno, da bi ema bila u normalnoj formi (3NF), moramo ukloniti sve li.lllzitivne zavisnosti i ema mora biti u drugoj normalnoj formi. U redu, ali ta je lidll:titivna zavisnost? Pogledajte ponovo sliku 3.3. Prikazana je ema: l'mployeeDepartment( employeeiD, name, job, departmentlD, departmentName) Ova ema sadri funkcionalne zavisnosti: l'mployeeiD -7 name, job, departmentlD, departmentName dcpartmentiD -7 departmentName Primarni je employeeiD i svi atributi funkcionalno su potpuno zavisni od "l''ga, to je lako razumljivo jer se primarni sastoji od samo jednog atributa. vidljivo je i to da imamo: l'mployeeiD -7 departmentName l'tnployeeiD -7 departmentiD dcpartmentiD -7 departmentName Obratite panju i na to da atribut departmentiD nije Ovaj odnos da je funkcionalna zavisnost employee ID -7 departmentName li,lllzitivna zato to postoji (zavisnost departmentiD -7 departmentName) . Da bismo doli do normalne forme, moramo ukloniti ovu tranzitivnu zavisnost. Kao i u prethodnim formama, da bismo doli do normalne forme, tabel u raz- dv.l_J.lmo na vie drugih tabela. U ovom je ta bi trc- lo.do da uradimo. emu d elimo na dve tabele, employee i department, na l' mployee(employeeiD, name, job, d cpartmcnt( d epa rtmen t ID, departmentN ame) ' 18 Poglavlje 3 Ubrzani kurs projektovanja baza podataka To nas na emu tabele employee prikazanu na slici 3.2. Ona je u nor- malnoj formi. Drugi da opiemo normalnu formu jeste da kaemo ako je ema u normalnoj formi, za svaku funkcionalnu zavisnost u svakoj tabeh, ispunjen je jedan od dva uslova: Leva strana funkcionalne zavisnosti je super (tj. koji nije obavezno minimalan). ili Desna strana funkcionalne zavisnosti je deo svakog te tabele. Drugi uslov se ne pojavljuje ba tako U sve funkcionalne zavisnosti prvim uslovom. Boyce-Coddova normalna forma Poslednja forma koju - ukratko- razmotriti jeste normalna forma, koja se ponekad naziva i BCNF. U prethodnom odeljku naveh usl.ova. Da bi tabela bila u BCNF, mora biti u normalnoj formi i mora 1spumt1 prv1 od dva uslova, tj. sve funkcionalne zavisnosti moraju imati na levoj strani. Taj uslov je automatski ispunjen i bez pred uzimanja mera, kao u ovom primeru. Ako imamo zavisnost koja kri ovo pravilo, moramo j OS jednom raz- dvojiti tabelu da bismo je doveli u l NF, 2NF i 3NF. Normalne forme vieg stepena .. Postoje i normalne forme viih stepena peta itd.) ali su one pogodmje za aka- demske rasprave nego za primenu na projektovanje podataka. 3NF (ili BCNF) sasvim. je dovoljna da rei te probleme redundantnost1 podataka na koje
Saetak Za kraj, evo ta smo sve razmotrili u ovom poglavlju. Koncepti Entiteti su "stvari", a relacije su veze njih . Tabele sadre podatke koji se prikazuju u tabelarnom obliku. Kolone tabela su atributi (obeleja) koji opisuju svaki entitet. Redovi tabela sadre vrednosti iz svih kolona tabele . identifikovanje pojedinih redova. Funkcionalne zavisnosti opisuju koji atributi vrednosti drugih atributa. eme su "nacrti" baze podataka. Pitanja l'rmcipi projektovanja baza podataka Redundantnost se mora minimizovati, ali bez podataka. Anomalije pri dodavanju, brisanju i auriranju jesu problemi koji se pojavljuju kada se u tabelu s loe osmiljenom strukturom podaci dodaju, briu iz nje ili auriraju . lzbegavajte strukture koje dovode do velikog broja null vrednosti. Normalizovanje Normalizovanje je formalni postupak koji e strukture baze podataka. Prva normalna forma (lNF) da kolone ili atributi sadre proste vrednosti. Druga normalna forma (2NF) da svi atributi izvan mor;Uu zavisiti od celog normalna forma (3NF) da ne sme biti tranzitivnih zavisnosti. IJoyce-Coddova normalna forma (BCNF) da svi atributi moraju biti funk- cionalno Pitanja je a) Minimalni b) Spoljni e) Grupa atributa koja identifikuje svaki red tabele d) Minimalna grupa atributa koja identifikuje svaki red tabele 1 Ako je tabela u drugoj normalnoj formi a) je u prvoj normalnoj formi b) je u normalnoj formi e) Ne sadri tranzitivne zavisnosti d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog l , Ako je tabela u normalnoj formi a) je u Boyce-Coddovoj normalnoj formi b) Sadri atribute koji nisu prosti e) Ne sadri tranzitivne zavisnosti d) Sadri atribute koji nisu potpuno funkcionalno zavisni od primarnog 1. Tri vrste anomalija nastaju pri a) dodavanju, i brisanju podataka b) dodavanju, i brisanju podataka e) auriranju i brisanju podataka 3 40 Poglavlje 3 Ubrzani kurs projektovanja baza podataka 5. N-torka je a) kolona b) red e) kandidat za d) vrsta narodnog kola e) spoljni Vebe 1. Normalizujte emu u normalnu formu: Porudbine(ifraKupea, imeKupea, adresaKupea, brojPorudbine, datumPorud- bine, ifraRobe, nazivRobe, 2. Pokuajte da osmisli te emu koja je 3NF ali ne i u BC NF. Odgovori Pitanja 1. e 2. a 3. e 4. b 5. b (postoji narodno kolo koje se zove estorka) Vebe 1. Kupei(ifraKupea, imeKupea, adresaKupea) Porudbine(brojPorudbine, datumPorudbine,
Roba(ifraRobe, nazivRobe) 2. Postoji puno reenja, proverite samo da vae ne kri pravila normalizovanja. U poglavlju U poglavlju 4, "Prav ljenje baza podataka, tabela i indeksa", emu baze podataka u stvarne MySQL tabele. 4 Pravljenje baza podataka, tabela i indeksa u OVOM POGLAVLJU da pravite osnovne MySQL strukture: baze 1 tlld,nnka, tabele i indekse. teme: Pravljenje baze podataka Biranje baze podataka Pravljenje tabela Tipovi podataka za MySQL-ove kolone Pravljenje indeksa l3risanje tabela, indeksa i baza podataka lzmena struktura tabela. /.a rad s primerima u ovom poglavlju jednostavnu bazu podataka: to je 1:,1 podataka employee o kojoj je bilo u prethodnom poglavlju. ema te baze
tmployee(employeeiD, name, job, t kpa rtment( departmentiD. name) tmployeeSkills( employeelD, skill) tli ent(clientiD. name, address, eontaetPerson, eontaetNumber) workdate, hours) l >ok gradivo iz ovog poglavlja, moete unositi komande da biste lt.tpt.lvili ovu bazu podataka u MySQL-u. Razume se, baze podataka, tabele i indekse 11111/l'tc praviti bilo kojeg klijentskog programa za MySQL, ali u ovim primc- ' lllt.l , bazu podataka MySQL monitora. Opredelili smo se za to 11' \l ' llJC dn biste bolje razumeli strukture baze podataka, tabela i indeksa. 42 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Trebalo bi da se najpre prijavite u MySQL monitor, na isti na koji ste to u poglavlju 1, "Instaliranje MySQL-a" i u poglavlju 2, "Kratak obilazak". U ovom poglavlju koristi za definisanje podataka koje prua jezik SQL da bismo pravili baze podataka, tabele i indekse. ta to SQL je skra- od Structured Query Language (strukturirani jezik za upite), to je jezik koji koristiti za izradu relacionih baza podataka i podataka iz njih. ga dve odvojene komponente: jezik za definisanje podataka (engl. Data Difini- tion Language, DDL), koji formiranje struktura baze podataka), i jezik za rad s podacima (engl. Data Manipulation Language, DML), koji pretraivanje baze podataka. U narednim odeljcima kako se u MySQL-u prave baze podataka, tabele i indeksi. Razlikovanje malih i velikih slova Pre nego to upotrebu jezika SQL i definiemo identifikatore MySQL-ovih objekata, moramo ukratko objasniti razlikovanje malih i velikih slova u MySQL-u. U rezervisanim jezika SQL ne pravi se razlika malih i velikih slova. To je standardno u svim sistemima za rad s bazama podataka. Da li MySQL praviti razliku malih i velikih slova u imenima baza poda- taka i tabela, zavisi od operativnog sistema pod kojim radite. Razlog je to to svakoj bazi podataka odgovarati direktorijum, a svaka tabela smetena u datoteku. Imena tih direktorijuma i datoteka slede pravila, koja zavise od operativnog sistema. To da ako koristite Windows, u imenima baza podataka i tabela se praviti razlika malih i velikih slova, ali suprotno pravilo vaiti ako koristite neki operativni sistem iz porodice Unix. To moe biti uzrok zbrke, ako je va operativni sistem OS X, koji moete podesiti tako da ne pravi razliku malih i velikih slova (HFS+, standardno podeavanje), ili naprotiv, da je uzima u obzir (UFS). Da biste smanjili zbrke, korisno je da se naviknete da sve identifikatore tretirate kao da je razlikovanje malih i velikih slova, i pod operativnim sistemom Windows. To vam da lako na drugu platformu. Namerna upotreba dva oblika istog identifikatora, npr. Zaposleni i zaposleni, moe zbuniti ljude koji va kod, pa zato izbegavajte da to radite. U MySQL-u se u imenima kolona, indeksa i alijasa (o kojima biti u nastavku teksta) nikad ne pravi razlika malih i velikih slova. ldentifikatori u MySOL-u Identifikator je opta koja se odnosi na ime alijasa, baze podataka, tabele, kolone ili indeksa. To je da se nedvosmisleno identifikuje objekat. Pre nego to 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 sadrati sve znakove koji postoje, osim /.nakove navoda, znakove ASCII(O) i ASCII(255). Imena baza podataka mogu sadrati sve znakove koji su dozvoljeni u imenima 1hrcktorijuma, ali ne i znakove koji imaju posebno u imenima direkto- 1 U u ma (/, \ i . ) , iz razloga. Imena tabela mogu sadrati sve znakove koji su dozvoljeni u imenima datoteka, osi m znakova . i l. identifikatori, osim alijasa, mogu se sastojati od najvie 64 znaka. Imena alijasa su u poglavlju 7 ",Sloeniji upiti") mogu sadrati najvie 255 znakova. jtdno pravilo u MySQL-u glasi da moete koristiti rezervisane kao lo tlllflkatore, pod uslovom da ih piete navodnika. Na primer, moete imati l ''" lu je ime TABLE. Razume se, ako je neto dozvoljeno, to ne da to morate 'd .t vezno i raditi, a u ovom navedenu praksu bolje je izbegavati. i ako se t 11 tome dobro snalazite dok radite s MySQL-om, to moe zbuniti program mysql- d11111p, koji se koristi za izradu rezervnih kopija baze podataka. !'ostoji kratak spisak rezervisanih koje MySQL prihvata kao identifikatore bez tt.tvodnika. To je suprotno ANSI standardu za jezik SQL, ali je u ' tkodnevnim poslovima. primeri na koje nailaziti su upotreba rezervi- litt h DATE i TIMESTAMP za imena kolona. Pravljenje baze podataka projektovanja strukture baze podataka, naredni korak je, savim da "l' t semo MySQL-u da elimo da napravimo novu bazu podataka. To se radi '><>L-ove komande CREATE DATABASE, na database employee; Da li je ova komanda uspeno izvrena, moete proveriti ako izdate komandu: rhow databases; Trebalo bi da se ime nove baze podataka, employee, pojavi na spisku baza podataka 11,1 vaem Sada imate praznu bazu podataka koja da u njoj napravite nekoliko tabela. Biranje baze podataka l'rc nego to u bazi podataka employee napravimo novu tabelu ili uradimo bilo ta drugo u njoj, moramo obavestiti MySQL da elimo da radimo u naoj novoj bazi podataka. To se radi komande use, na noe employee; Sada je izabrana (otvorena) baza podataka employee; za sve akcije koje izvrimo od s.tda pa nadalje, se da se odnose na tu bazu podataka. 44 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Pravlj enje tabela Tabele u bazi podataka employee SQL-ove komande CREATE TABLE. oblik te komande je create table imetabele ( definicije kolona tabele ) [type=tip_tabele]; Kao to vidite, komanda create table, iza kojih sledi ime tabele koju bismo eleli da napravimo, a zatim dolazi grupa definicija svih kolona tabele. Na kraju komande moete po potrebi zadati tip maine baze podataka koji biste eleli da se koristi. Primer izrade tabele Postupak ilustrovati primerom izrade tabele. U listingu 4.1 prikazana je grupa SQL-ovih komandi koja formira bazu podataka employee. Unesite ih ili preuz- mite datoteku (zajedno s neto pro bnih podataka za bazu) sa Web lokacije ovoj knjizi. Li sting 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), ultactPerson varchar ( 80) , t'lmtactNumber char(l2) ype= InnoDB; tle table assignment 1 l lentiD int not null references client (clientiD), 111ployeeiD int not null references employee (employeeiD), WtJrkdate date not null, liours float, p t i mary key (clientiD, employeeiD, workdate) lype=InnoDB; Pogledajmo jednu po jednu SQL-ove komande u ovoj datoteci. od: ol t op database if exists employee; t' raviJenJe tiltlcla ()va komanda ispituje da li postoji baza podataka je ime employee; ako l'" ' toji, ona se brie, to vam "priprema teren", ako se tako moe To nije ba 11 1 ophodno i moe biti i opasno, ali ovde smo to uradili da bismo obezbedili da 1 11" '1 skript za izradu baze podataka uvek bude delotvoran, i ako ste ranije neto l ' pcrim.entisali s bazom podataka employee. Ukoliko MySQL koristite u okruenju niste vlasnik, moe se dogoditi da kom- l'.llliJJ koja iznajmljuje prostor na svojim serverima zabrani upotrebu komande drop 1.11 , base. U tom uklonite taj red iz skripta (ali proverite da ne postoji baza pnd.ltaka 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 izradu tabela unutar te baze podataka. Najpre pravimo tabelu 'it'partment, na 1" 1 .a te table department ( departmentiD int not null auto increment primary key, name varchar(20) Lype=InnoDB; Ova tabela ima dve kolone, departmentiD (ifra slube), koja je primarni 1 tl.lmc (naziv slube). Kolone tabele deklariemo tako to zadamo listu deklaracija kolona razdvojenih zarezima, a lista je uokvirena zagradama. Atribute kolone ne 111nratc razdvojiti zarezima- oni su obavezni samo za deklaracije kolona. Ovo je naa prva SQL komanda koja se rasprostire u vie redova. da su ll.il'ziku SQL razmaci nebitni, komande moemo pisati u obliku koji nam najbolje odgovara. je da se stavke komande CREATE piu svaka u svom redu, da bi l l' l,l komanda bila Interpretator jezika QL pokuati da valt 46 !'oglavlJe 4 l'raviJCnJe oaza podataKa, tabela 1 mdeKsa komandu dok ne otkucate zavrni znak i zarez (;) i pritisnete taster Enter. (Moete se opredeliti i da komande zavravate znacima \g, ali se znak i zarez znatno koristi.) U ovoj tabeli deklariemo dve kolone. Svaka deklaracija kolone imenom kolone, za slede podaci koji opisuju tip te kolone. Pogledajte najpre drugu kolonu ovog primera jer se neto lake razume. Deklaracija name varchar(20) opisuje da je ime kolone name a njen tip je varchar (2 o) .Tip podataka varchar daje u pitanju znakovna vrednost promenljive duine, koja u ovom moe sadrati najvie 20 znakova. Mogli smo da zadamo i tip char, to je znakovna vrednost fiksne duine. Bez obzira na to da li zadate varchar ili char, rada s tim poda- cima se razlikovati, jedina razlika je u obliku u kojem se ti podaci smeta ju u memoriju. Podatak tipa varchar ( 2 o) zauzima onoliko prostora koliko je potrebno za skladitenje stvarnog broja znakova, dok podatak tipa ch ar ( 2 o) uvek zauzima 20 zna- kova, bez obzira na to da lije u njega smetena bilo kakva vrednost.Vie o relativnim prednostima i nedostacima ovih tipova podataka 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 koristiti za identifikovanje pojedinih slubi i odeljaka kompanije. Deklaraciji tipa podataka kolone slede dodatni podaci o koloni. Prvo smo zadali da je ta kolona tipa not null - drugim u svakom redu tabele, ta kolona mora sadrati neku vrednost. Drugo, zadali smo daje ta kolona tipa auto_increment. To je veoma korisna MySQL-a. Kada unesemo nov red u tu tabel u, ako ne zadamo ifru slube, MySQL sam do deli ti jedinstven broj koji biti po redosledu auto_increment sekvence (niza). To vam olakati ivot. Na kraju, odredba primary key da ta kolona biti primarni tabele. Ako se primarni sastoji od samo jedne kolone, moe se zadati u ovom obliku. Za primarne sastavljene od vie kolona mora se upotrebiti drugi oblik komande, koji razmotriti u nastavku ovog poglavlja. Time se zavrava definicija tabele department. A sada, pogledajte sam kraj SQL-ove komande. Iza zavrne zagrade nalazi se red: type=InnoDB Time se zadaje da tabela treba da koristi mainu baze podataka InnoDB.Ako palji- vije pogledate definicije tabela, da smo sve tabele deklarisali kao InnoDB tabele. l'raviJenje tabela ta to MySQL podrava razne maine baze podataka, koje 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 potrebne su nam InnoDB tabele zato to u nekoliko primera koristiti spoljne Maina baze podataka InnoDB podrava spoljne i lra nsakcije, to nije na raspolaganju u tabelanu tipa MyiSAM. MyiSAM tabele Hl bre od InnoDB tabela. Za svaku tabelu morate razmotriti koji je tip najprikladniji . Mogli smo da zadamo tabele tipova i da imamo, na primer, nekoliko lnnoDB tabela i nekoliko MyiSAM tabela (pa i tabele jo nekih drugih tipova, ukoliko je potrebno), ali jednostavnosti radi, u ovom primeru koristi 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 slube (departmentiD) u kojoj zaposleni radi. To je spoljni U definiciji t.1bele to se deklarie odredbe references, na 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 moemo koristiti zato to je tabela employee tipa InnoDB. Kada koristite My ISAM tabele, upotreba spoljnih nij e Prema planu razvoja, trebalo bi da spoljni u MyiSAM tabelama hudu podrani i jednoj od verzija MySQL-a, verovatno u verziji 5.1. Pogledajte sada komandu create table: create table employeeSkills employeeiD int not null references employee(employeeiD), s kill varchar(15) not null, primary key (employeeiD, skill) type=InnoDB; U ovoj tabeli imamo spoljni to je kolona employee ID. Zanimljivo u vezi s definicijom ove tabele jeste to da ona ima primarni koji se sastoji od dve kolone. Kao to vidite, deklarisane su dve kolone tabele, employeeiD i skill, a zatim JC rasebno deklarisan primarni u redu: pt l.mary key (employeeiD, skill) 48 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa da u sintaksi definicija drugih tabela nema novog, ih detaljno objanjavati. Obratite panju na to da smo u tabeli assignment upotrebili nekoliko novih tipova podataka: kolona hours (broj radnih sati) je tipa float, tj. broj s pokret- nim zarezom, a kolona workdate (radni dan) je datumskog tipa, date. U nastavku ovog poglavlja vie o tim tipovim kolona. komande moete proveriti da li su tabele na vaem sistemu podeene: show tables; Trebalo bi da dobijete rezultate: +-------- ------------+ l Tables_in_employee l +--------------------+ assignment client department employee employeeSkills +--------------------+ Detaljnije podatke o strukturi svake tabele moete dobiti komande des- cribe; na primer: describe department; Trebalo bi da na svom ekranu dobijete rezultate nalik na +--------------+-------------+-------------------+------+-----+---------+----------------+ 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 Poto ste videli primer, moemo na opis cele sintakse komande CREATE TABLE. U MySQL-ovoj dokumentaciji stoji da komanda ima opti 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 optoj definiciji. Rezervisana TEMPORARY izradu privremene tabele koja biti dosegljiva samo u sesiji, a kada se veza s bazom podataka zatvori, tabela se automatski brie. Odredbu IF NOT EXISTS moete upotrebiti da biste napravili novu tabelu samo ako ne postoji tabela s imenom koje ste zadali. odredbe LIKE izvorna_ tabela moete napraviti novu tabelu koja ima istu emu kao izvorna tabela. U komandi CREATE TABLE deklariemo unutar zagrada kolone koje nam trebaju, njihove tipove podataka i druge informacije koje se strukture tabele. Najjednostav- nija definicija kolone sastoji se samo od imena kolone i tipa podataka u koloni. U nared- nom odeljku ovog poglavlja tipove podataka za kolone tabele. Svaku deklaraciju kolone moemo, po potrebi, proiriti opcijama: Svaku kolonu moemo deklarisati kao NOT NULL ili NULL, to da ne dozvo- ljavamo da kolona sadri vrednost NULL (opcija NOT NULL) ili da prihvatamo vred- nost NULL (opcija NULL). Podrazumeva se daje vrednost NULL prihvatljiva. rezervisane DEFAULT iza koje sledi neka vrednost moete zadati podrazumevanu vrednost za kolonu. Rezervisana AUTO_INCREMENT generisanje rednog broja, kao to smo to u prethodnom primeru.Ta vrednost, koja se automatski generie za jedan od vrednosti iz tabele. Prvi red podataka koji un este u tabel u redni broj l. Tabela moe sadrati samo jednu kolonu tipa AUTO_INCREMENT, koja mora biti indeksirana. Obratite panju na to da u prethod- nim primerima nismo napravili nijedan indeks; neki su ipak bili automatski napravljeni. Indeksi se automatski prave za kolone koje deklariete kao primarne (PRIMARY KEY), a u ovom primeru to su sve kolone koje smo deklarisali kao AUTO INCREMENT. Pojedine kolone moemo deklarisati kao primarne (odredba PRIMARY KEY). Pojedine kolone moemo deklarisati kao spoljne opcije REFE- RENCES, kao u ovom primeru. .. rldVIJCIIJC UdLd fJUUdldl\d0 ldUCid l IIIUCI\)d Osim imena kolona i tipova podataka u njima, u ovom delu komande CREATE TABLE moemo zadati i dodatne podatke: Moemo zadati primarni koji se sastoji od vie kolona, kao u ovom pri- meru, tako to iza opcije PRIMARY KEY navedemo imena kolona koje pri- marni Na taj moe se zadati i primarni koji se sastoji od samo jedne kolone. Kolona deklarisana kao PRI MARY KEY moe sadrati samo jedin- stvene (neduplirane) vrednosti, za nju se automatski formira indeks i ne moe sadrati vrednost null. Opcije INDEX i KEY su sinonimi i da zadata kolona (ili kolone) biti indeksirana. Imajte vidu da u MySQL-u takve kolone ne moraju da sadre jedinstvene vrednosti. opcije UNIQUE zadaje se da kolona moe sadrati samo jedinst- vene vrednosti. Kolone deklarisane kao UNIQUE se automatski indeksiraju. opcije FULLTEXT zadajete da se formiraju indeksi za tekstualno pre- traivanje kolona tipa TEXT, CHAR ili VARCHAR. Indekse za tekstualno pretraivanje moete koristiti samo s MyiSAM tabelama. Primer se nalazi u poglavlju 9. Opcija FOREIGN KEY da deklariete spoljne na isti kao primarne Iza zagrade moete zadati opcije koje se tabele. Dosad smo videli da to moe biti tip tabele. Tipovi tabela detaljnije su opisani u poglavlju 9. Ako ne zadate tip tabele, podrazumeva se MyiSAM. Ukratko, tip tabele moe biti jedan od My ISAM, koji se podrazumeva, veoma je brz i podrava indekse za tekstualno pretraivanje; zamenjuje nekadanji podrazumevani tip ISAM. ISAM je stariji tip tabela. je tipu My ISAM ali prua manje zbog bi trebalo da umesto njega uvek koristite MyiSAM. InnoDB je maina baze podataka s grupom pravila ACID koja podrava transakcije, spoljne i podataka na nivou pojedi- reda tabele. BDB (Berkeley DB) je maina baze podataka koja podrava transakcije i zaklju- podataka na nivou stranice tabele. Ceo sadraj tabela tipa HEAP se u memoriji i nikad se ne upisuje na disk; tome, te tabele su veoma brze, ali im je i podaci iz njih se ne mogu restaurirati ukoliko se sistem pokvari. Tabele tipa MERGE kombinovanje vie tabela tipa MyiSAM koje imaju istu strukturu, tako da se podaci iz njih kao da radimo s jednom tabe- lom.To se moe iskoristiti kada operativni sistem maksimalnu datoteka - pa zbog toga i tabela. 1\.UIIIdllUd \..nC/"\1 C IMOLI:. Moemo zadati jo nekoliko drugih opcija za tabel u, koje nisu obavezne ali dopri- ''"w pre svega optimizaciji. Neke njima u poglavlju 18",0ptimi- "v.tnje baze podataka" . To su opcij e: AUTO_INCREMENT = # da u koloni tipa auto_increment zadate vrednost od 1. AVG_ROW_LENGTH = # da zadate duinu reda da biste "pomogli" maini baze podataka. CHECKSUM = l da kontrolnog zbira u redo- vima tabele, to moe biti korisno kada reavate problem sadraja tabele. Zadajte vrednost 1 da biste Ova opcija je stan- dardno a upotrebljiva je samo za My ISAM tabele. COMMENT = "tekst" da tabeli pridruite neku napomenu. MAX ROWS = # Ovom opcijom se zadaje maksimalan broj redova koji se moe uneti u tabelu. MIN ROWS = # Ovom opcijom se zadaje minimalan broj redova koji tabela moe sadrati. PACK_KEYS = {O l l l DEFAULT} MySQL standardno pakuje (komprimuje) sadraj indeksa znakovnog tipa- a to su CHAR, VARCHAR i TEXT. Ako zadate vrednost 1, svi indeksi se pakovati; ako zadate vrednost o, nijedan indeks se pakovati. PASSWORD = "tekst U standardnoj verziji MySQL-a ova opcija na radi ba nita. DELAY_KEY_WRITE = {o l l} da odloite auriranje indeksa dok ne zatvorite tabel u. Upotrebljiva je samo za My ISAM tabele. ROW_FORMAT= {default l dynamic l fixed l compressed } da zadate format u kojem se skladite podaci u redovima tabele. Upotrebljiva je samo za MyiSAM tabele. RAID_TYPE= {l l STRIPED l RAIDO } RAID_CHUNKS=# RAID_CHUNKSIZE=# da u cilju optimizovanja servera zadate tip RAID grupe diskova koji imate. UNION= (ime_tabele, [ime_tabele ]) tabelama tipa MERGE, da zadate tabele koje grupu MERGE. INSERT_METHOD= {NO l FIRST l LAST } Ova opcija je upotrebljiva za tabele tipa MERGE i slui da se zada tabela u koju se podaci DATA DIRECTORY="apsolutna putanja ove opcije moete zadati direktorijum u koji elite da se smetaju podaci tabele. INDEX DIRECTORY="apsolutna putanja" ove opcije moete zadati direktorijum u koji elite da se smeta sadraj indeksa tabele. ""t rldVIJ'CIIJ'C UdLd JJUUdldl\d, lciU'Cicl l IIIU\..1\.>cl I najzad, ako ponovo pogledate opti oblik komande CREATE TABLE, da komandu CREATE TABLE moete zavriti komandom SELECT. SELECT je SQL-ova komanda koja redova iz jedne ili vie tabela. (Podrobnije je opisana u poglavljima 6, 7 i 8 ove knjige.) tc opcije moete napuniti novu tabelu podacima koje zadata komanda select. Tipovi podataka u kolonama U MySQL-u postoje tri osnovna tipa kolona: znakovni ili tekstualni i datumsko/vremenski. ih jedan po jedan u narednim odcljcima. tipovi podataka tipovi se koriste za skladitenje brojeva. U naem primeru, upotrebili smo tipove int (celo brojne vrednosti) i float (vrednosti s pokretnim zarezom). To su dva primera podtipova tipova: tipovi i aproksimirani (pri- blini) tipovi. Za tipove moete zadati ukupan broj cifara koji sc prikazuje (irina, M) i, za tipove s pokretnim zarezom, broj decimalnih mesta, D.Vrednosti tih parametara zadaju se iza deklaracije tipa podatka; na primer: plata decimal(lO, 2) Ova komanda prikazivanje vrednosti sa ukupno 12 cifara i dva deci- malna mesta. Moete se opredeliti da ne zadate nijedan od ovih parametara, ili moete zadati samo ukupnu irinu za prikazivanje, ili i irinu i broj decimala. Uz tipove moete zadati rezervisane UNSIGNED i/ili ZEROFILL. Rezervisana UNSIGNED da kolona moe sadrati samo nule ili pozitivne vrednosti. Rezervisana ZEROFILL da se vrednosti iz kolone prikazivati s nulama. tipovi opisani su u nastavku teksta. Tip NUMERIC ili DECIMAL O be potpuno isti tip podataka, a DECIMAL se moe skratiti na DEC. Ovi tipovi vrednosti s pokretnim zarezom i se koriste za rad s vrednostima. Opseg vrednosti jednak je kao za brojeve s pokretnim zarezom dvostruke preciznosti. Tip INTEGER i varijante Ovaj tip se moe skratiti na INT. To je standardni tp za celo brojne vrednosti, koje se smctaju u bajta, to daje 2 32 vrednosti. Tip INT ima nekoliko varijanti: TINYINT zauzima jedan bajt (2 8 vrednosti). Rezervisane BIT i BOOL su sinonimi za TINYINT. SMALLINT zauzima dva bajta (2 16 vrednosti). Tipovi podataka u kolonama MEDIUMINT zauzima tri bajta (2 24 vrednosti). BIGINT zauzima osam bajtova (2 64 vrednosti). Aproksirnirani tipovi opisani su u nastavku teksta. Tip FLOAT Ovaj tip je namenjen za rad s brojevima s pokretnim zarezomjednostruke preciznosti. Moe predstavljati pozitivan broj u opsegu od 1.18 x 10- 38 do 3.40 x 10 38 i 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 10 308 i opseg negativnih brojeva. Znakovni i tekstualni tipovi podataka MySQL podrava vie znakovnih i tekstualnih tipova podataka. Osnovni tekstualni tipovi SU CHAR, VARCHAR, TEXT, BLOB, ENUM i SET. ih jedan po jedan u 11astavku teksta. Tip CHAR l'ip CHAR skladitenje znakovnih vrednosti fiksne duine. Kao u primeru haze podataka employee, rezervisanoj CHAR sledi duina (broj znakova) zna- kovne vrednosti, na primer CHAR ( 2 o) .Ako ne zadate duinu, podrazumeva se CHAR ( 1) . Maksimalna duina podatka tipa CHAR je 255 znakova. Kada se podatak tipa CHAR upie ll u ta?ele, on uvek ima duinu koju ste zadali u definiciji kolone. To se postie u koloni razmacima. Ti razmaci se automatski uklanjanju pri liCJtavanJU podatka IZ kolone tipa CHAR. je da podaci tipa CHAR zauzimaju vie prostora na disku od ekviva- promenljive duine. Prednost im je to to se podaci bre 1z tabele CIJe su sve kolone fiksne irine (tj. CHAR, ili date). ll da je brzina podataka vanija od prostora koji oni zauzimaju na disku, moda se opredeli ti da tekstualna polja u kojima se vrednosti ne razli- k LUU mnogo po duini deklariete kao CHAR da biste (malo) optimizovali sistem. Ispred deklaracija oba tipa, CHAR i VARCHAR, moete dodati rezervisanu NATIO- NAL, to da elite da sadraj na standardni skup znakova. Poto se ova opcija podrazumeva u MySQL-u, korisna je samo ako vam je potrebna kompatibil- llOSt platformi. Deklaracijama tipova CHAR i VARCHAR moe slediti rezervisana BINARY to d.t sc pri znakovnih vrednosti pravi razlika malih i velikih slova. Podrazumevani je da se ta razlika ne pravi. 54 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Tip VARCHAR .. v v Tip VARCHAR skladitenje znakovnih nizova promenljlVe duzme. Duzma podataka zadaje se zagrada iza imena tipa, na primer, VARCHAR (l o l . Opseg vrednosti je od O do 255. Tipovi TEXT, BLOB i njihove varijante Tipovi TEXT skladitenje tekstualnih podataka duih od ono.g to m?.e da stane u tipove CHAR i VARCHAR. BLOB je za Binary Large OBject (vehki binarni objekat). Ovi tipovi se ni po ne razlikuju, jedino je BLOB namenjen binarnih a ne tekstualnih podataka. Pri podataka tipa BLOB pravi se razlika malih i velikih slova, dok se to ne pri taka tipa TEXT. Oba tipa su promenljive duine i za oba postoje varijante razmh velicma: Tip TINYTEXT ili TINYBLOB moe sadrati najvie 255 (to je 2 8 -1) znakova ili ba j tova. Tip TEXT ili BLOB moe sadrati najvie 65,535 (i 6 -1) znakova ili bajtova (64 KB). Tip MEDIUMTEXT ili MEDIUMBLOB moe sadrati najvie 16,777,215 (2 24 -1) znakova ili bajtova (16 MB). Tip LONGTEXT ili LONGBLOB moe sadrati najvie 4,294,967,295 (2 32 -1) znakova ili bajtova (4 GB). Tip ENUM . ,. . v Ovaj tip podataka da zadate hstu moguClh vrednost1. Kolona tabele sadrati jednu vrednost iz nabroj anog skupa Tip podataka ENUM deklanse se na pol enum('m', '') Poto vrednost tipa ENUM moe biti i NULL, vrednosti kolone pol su m, , NULL ili error. Tip SET v . Tip SET je tipu ENUM s tom razlikom to kolone u redovima tabele mogu sadrzat1 i vie vrednosti iz nabrojanog skupa Datumski i vremenski tipovi podataka MySQL podrava vie tipova za rad s datumima i vremenima, koji su opisani u nared- nim odeljcima. Tip DATE Tip date skladitenje datuma. MySQL da datum bude u ISO redosledu godina-mesec-dan, se izbegavaju problemi usled formata datuma s o be strane Atlantika. Datumi se prikazuju u formatu GGGG-MM-DD. Pravljenje indeksa fip TIME Ovaj tip skladitenje 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 fip TIMESTAMP <)vo je koristan tip podataka za kolone tabele. Ako u 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 sadraj reda. Kada podatak tipa timestamp, prikazuje se u istom formatu kao tip DATE- '1' IME. To je razlika 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 skladitenje podataka koji predstavljaju godine. Kada deklariete onu ovog tipa, moete zadati YEAR ( 2) ili YEAR ( 4) da biste zadali broj cifara. Podra- t umeva se YEAR (4 l. YEAR (2 l predstavlja opseg godina od 1970. do 2069. Pravljenje indeksa Sve indekse koji vam trebaju praviti automatski kada pravite tabele. Za W;tku kolonu koju deklariete sa opcijom PRIMARY KEY, KEY, UNIQUE ili INDEX, auto- lll.ltski se formira i indeks. Ponekad ustanoviti da koristite broj upita koji obuhvataju kolonu za koju 11i stc definisali indeks; u takvim moete dodati nov indeks de CREATE INDEX. Zanimljivo je to da se, pre izvravanja, komanda CREATE INDEX preslikava u komandu ALTER TABLE. Komanda ALTER TABLE moe se upotrebiti i za mnoge druge 11.11ncne, koje opisati u poslednjem odeljku ovog poglavlja. Na primer, tabeli employee moemo dodati nov indeks na <' l' ate index name on employee (name) ; Ova komanda pravi indeks je ime name nad kolonom name tabele employee. Komanda create index nema puno opcija. Ispred index moete dodati liN J QUE ako elite indeks s jedinstvenim vrednostima. Osim toga, ispred index 111octe navesti rezervisanu FULLTEXT da biste napravili indeks za tekstualno pre- MyiSAM tabele. (Vie detalja o tome u poglavlju 9.) 56 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Indeksi definisani nad kolonama tipa char i varchar mogu se na prvih nekoliko znakova u polju. To uraditi tako to iza imena indeksirane kolone zada te zagrada broj znakova koji elite da se indeksira, na primer: create index part_name on employee(name(S)); Poto indeksi nad kolonama tekstualnog tipa nisu tako efikasni kao indeksi nad kolonama, indeksiranje samo nekoliko znakova poboljava performanse. Brisanje baza podataka, tabela i indeksa Poto sada znate kako se prave baze podataka, tabele i indeksi, korisno je da i da ih briete. Rezervisana re koja vam treba za tu namenu jeste DROP. Celu bazu podataka, zajedno s njenim sadrajem, briete komande (nemojte je jo zadati!): drop database employee; Ispred imena baze podataka moete dodati neobaveznu opciju IF EXISTS. Ako se vratite na listing 4.1, da je u njemu upotrebljena ba ova verzija komande DROP DATABASE. Tabelu moete izbrisati komande DROP TABLE, na primer: drop table assignment; Opti oblik komande DROP TABLE izgleda ovako: DROP [TEMPORARY] TABLE [IF EXISTS] ime_tabele [, ime tabele, ... ] Ako elite da izbriete privremenu tabelu, upotrebite rezervisanu TEMPORARY Istom komandom moete izbrisati vie tabela ako zadate listu njihovih imena razdvo- jenih zarezima. Neobavezna opcija IF EXISTS deluje na isti kao u komandi DROP DATABASE. Indeks briete komande DROP INDEX, na primer: drop index part_name on employee; Kao to vidite, da biste izbrisali indeks, morate zadati i ime tabele kojoj je pridruen. lzmena strukture tabele Osim izrade novih tabela i brisanja vam zatrebati da izmenite strukturu tabele. To se moe uraditi 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 alter table employee add index name (name) ; tzmena struKture postoJece t110e1e ll da komanda ALTER TABLE prua veliki broj ima i veliki broj lj H 'Ja . Opti oblik te komande, kako je opisano u MySQL-ovoj dokumentaciji 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 ... ) 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 ovih opcija razumljive su same po sebi ili odgovaraju opcijama u komandi ' 'll EA TE TABLE, kao to je ADD PRI MARY KEY ukratko one koje moda nisu t1.1[j asnije. pcije CHANGE i MODIFY zapravo su jedna te ista opcija i izmenu defi- lltnj e kolone ili njenog mesta u tabeli. Opcija DROP COLUMN brie kolonu iz tabele, dok opcije DROP PRIMARY KEY i DROP 1 NDEX briu samo indeks pridruen koloni. Opcija DISABLE KEYS nalae MySQL-u da ne aurira sadraj indeksa, ali upotre- i>lpva je samo za My ISAM tabele. Opcija ENABLE KEYS auriranje indeksa. Opcija RENAME promenu imena tabele. Opcija ORDER BY zadatim redosledom redove tabele na koju je prime- IIJCI1a, opciji ORDER BY u komandi SELECT, koju razmatrati u poglavlju 6, .. upita u MySQL-u". Taj red o sled biti kada se kasnije unesu Ilovi podaci u tabelu. Opcija opcije_za_tabelu da na kraj komande zadate iste opcije za t.ll>elu kao u komandi CREATE TABLE- vie detalja o tome u prethodnom dl'lu ovog poglavlja. 58 Poglavlje 4 Pravljenje baza podataka, tabela i indeksa Saetak U ovom poglavlju, ste da pravite i briete baze podataka, tabele i indekse, i da izmenite strukturu tabele. ldentifikatori i razlikovanje malih i velikih slova Za imena baza podataka vae ista pravila razlikovanja malih i velikih slova kao u direktorij urnima vaeg operativnog sistema. Za imena tabela vae ista pravila kao za imena datoteka. U imenima svih ostalih identifkatora ne pravi se razlika malih i velikih slova. Svi identifikatori, osim alijasa, mogu sadrati najvie 64 znaka. Duina alijasa moe biti najvie 255 znakova. Identifikatori mogu da sadre znakova, ali imena baze podataka ne mogu sadrati znakove l, \ i . a imena tabela ne mogu sadrati znakove . i l. Rezervisane moete koristiti kao identifikatore, pod uslovom da ih piete 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 slui komanda create table, opti oblik izgleda ovako: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele [ (definicija_kolone, ... ) l [opcije_za_tabelu] [komanda_select] ili CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ime tabele LIKE
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 tipovi SU TINYINT, SMALLINT, INT, MEDIUMINT, BIG INT, NUMERIC i DECIMAL. Aproksimirani tipovi su FLOAT i DOUBLE. Znakovni tipovi SU CHAR, VARCHAR, TEXT i BLOB . Za rad S datumima i vremenima slue tipovi DATE, TIME, DATETIME, TIMESTAMP i YEAR. Za navedena imena tipova podataka postoji i vie alijasa (sinonima). Brisanje baza podataka, tabela i indeksa Bazu podataka briete komande drop database ime_baze; Tabelu briete komande drop table ime_tabele; Indeks briete komande drop index ime_indeksa on ime_tabele; lzmena strukture tabele Strukturu tabele menjate komande ALTER TABLE, opti 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] definicija kolone [FIRST l AFTER ime_kolone] - ili MODIFY [COLUMN) definicija_kolone [FIRST l AFTER ime kolone] ili DROP [COLUMN] ime_kolone ili DROP PRIMARY KEY ili DROP INDEX ime_indeksa ili DISABLE KEYS ili ENABLE KEYS ili RENAME [TO] novo_ime tabele ili ORDER BY ime_kolone ili opcije_za_tabelu bU roglaVIJe 4 rraVIJenJe oaza poaataKa, taoe1a 1 maeKsa Pitanja 1. ta od nije ispravno ime tabele u MySQL-u? a) employee b) select e) employee.skill d) employeeSkills 2. Od tvrdnji o tipovima podataka CHAR i VARCHAR, koje su a) Kolona tipa CHAR uvek zauzima isti prostor na disku, bez obzira na sadraj. b) Podatak u koloni tipa VARCHAR uvek se dopunjava razmacima pri 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 sadraj. 3. Pre nego to 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 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,
5. Da biste izbrisali bazu podataka je ime dbname) i ceo njen sadraj, zadali biste a) drop all tables on dbname; b) drop database dbname; e) drop dbname; d) delete database dbname; Vebe 1. Napiite SQL komande koje formiraju bazu podataka porudzbine je ema
kupac(kupaciD, kupaclme, kupacAdresa) porudzbina(porudzbinaiD, porudzbinaDatum, l_c_t.lP!l.cJQ) . robaKolicina) roba(robaiD, robaN aziv) Moete izabrati proizvoljne tipove podataka. Testirajte komande u MySQL-u, a zatim pregledajte tabele komandi SHOW i DESCRIBE. 2. Svakoj porudbini u tabeli porudzbine elimo da dodamo novo polje nazvano napomena, koje biti tipa TEXT. Obavite to komande ALTER TABLE, a zatim proverite rezultat komande DESCRIBE. 3. Izbriite bazu podataka porudzbine. Odgovori Pitanja 1. e 2. a 3. e 4. d 5. b Vebe 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 ; 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 poglavlju U poglavlju S",Umetanje, brisanje i auriranje podataka", podatke u bazu podataka employee. III Upotreba MySQL-a 5 Umetanje, brisanje i auriranje podataka 6 upita u MySQL-u 7 Sloeniji upiti 8 Upotreba MySQL-ovih funkcija u komandi SELECT 5 Umetanje, brisanje i auriranje podataka u OVOM POGLAVLJU kako se komande INSERT, DELETE 1 UPDATE i auriraju podaci u MySQL-ovoj bazi podataka. teme: Komanda INSERT Komanda DELETE Komanda UPDATE podataka komande LOAD DATA INFILE Proirenja: komande REPLACE i TRUNCATE. Sada smo preli na komponentu DML (Data Manipulation Language, jezik za rad s podacima) jezika SQL. Poto kako da nove podatke u bazu podataka, 11arcdnih nekoliko poglavlja mnogobrojne za podataka iz baze. Komanda INSERT "iQL-ova komanda INSERT slui za umetanje novih redova u tabele. najpre jedan primer. U ovom komande moete zadavati direktno u MySQL monitoru ili pisati u datoteku, ili moete preuzeti datoteku s Web lokacije 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 n R a out ces' ) l ...... --(NlJI,Io, l M II')U l __ l r_H __ , _' _) _; 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 panju na to da pre nego to dodamo nove podatke u tabelu, izvravamo komandu DELETE- ni u ovom to nije neophodno, ali tako ukloniti iz tabele probne podatke koje ste moda ranije uneli. U narednom odeljku se na komandu DELETE. Osim toga, obratite panju i na to da smo uneli probne podatke koji odgovaraju primerima iz poglavlja 3, "Ubrzani kurs projektovanja baza podataka", a dodali smo i nekoliko dopunskih redova. Sve navedene komande INSERT su veoma Pogledajmo prvu da biste shvatili kako deluju: insert into department values (42, 'Finance'), (128, 'Research and Development'), (NULL, 'Human Resources'), (NULL, 'Marketing'); U prvom redu zadali smo ime tabele u koju elimo da unesemo podatke - u ovom to je tabela department, u koju unosimo reda s podacima. Moda se da tabela department ima dve kolone, departmentiD i name. (U to se moete uveriti ako izdate komandu describe department.) Komanda INSERT U prva dva reda smo zadali vrednosti za kolonu departmentiD. Pogle- dajmo ponovo definiciju kolone departmentiD. Verovatno se iz prethodnog poglavlja da deklaracija te kolone izgleda ovako: departmentiD int not null auto_increment primary key daje u pitanju kolona tipa auto_increment, moemo zadati vrednost za nju, ili prepustiti MySQL-u da sam generie neku vrednost. (Pri upotrebi kolona tog tipa se preputa MySQL-u da sam vrednost, ali postoje i kao to je ovaj, gde imati vrednost koju eleti da upotrebite.) U redovima s podacima o slubama Human Resources i Marketing, u koloni department ID zadato je NULL. To aktivira "magiju" mehanizma auto_increment koji novu vrednost. Pogledajmo ta dobiti s tom komandom lNSERT. Ako paljivije pogledate pojedine komande INSERT, da su podaci koji se u kolone tipa string ili date uokvireni polunavodnicima, na primer, 'Rese- arch and Development'. Polunavodnici se ne koriste za tipove. Ukoliko se podaci uokviruju polunavodnicima, ta treba uraditi kada podatak sadri polunavodnike? Odgovor je da se polunavodnici moraju preslikati (engl. escape). Jednostavnije 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 U tom morate na isti preslikati i obrnutu kosu- zamenite je s dve obrnute kose crte (\ \). Podatke iz baze komande SELECT. Tu komandu veoma detaljno razmotriti u narednih nekoliko poglavlja. Zasad je dovoljno znati da se, ako zadate: select * from ime_tabele; svi podaci koji se nalaze u tabeli. Ako zadate: select * from department; trebalo bi da na ekranu dobijete rezultate nalik na ----- ---------+----------------------+ 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 vrtdnost koja je za jedan od vrednosti u koloni. GB Poglavlje 5 Umetanj e, brisanj e i auri ranj e podataka U MySQL-ovoj dokumentaciji stoji da komanda INSERT ima opti 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 panju na to da rezervisana INTO nije obavezna. Mogli smo je izostaviti i upit s insert employee values, ali smatramo da INTO doprinosi razumljivosti upita. Kada koristite prvi oblik komande INSERT, za svaki novi red tabele morate zadati listu vrednosti poredanih istim redosledom kao 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 da se jednom komandom INSERT umetne vie novih redova u tabel u. Drugi oblik komande INSERT zavrava se komandom SELECT. Um.esto da vredno- sti ovaj oblik da podatke te iz jedne ili vie tabela baze podataka i da ih zatim umetnete u ciljnu tabelu. oblik komande INSERT da zadate kolone u koje treba umetnuti podatke. Primer upotrebe ovog oblika komande INSERT: insert into department set name='Asset Management'; Ovaj oblik 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 preuzeti podrazumevane vrednosti (u kolonama u kojima su takve vrednosti definisane) ili vrednost NULL. U ovom koloni department ID se vrednost NULL, usled se aktivira mehanizam auto_increment koji generie novu vrednost u toj koloni. (U to se moete uveriti ako ponovo izdate komandu select * from department.) Komanda INSERT ima nekoliko neobaveznih odredaba. Pogledajmo ukratko kako one deluju: Moete zadati da se komanda INSERT izvrava s niskim prioriteom (opcija LOW PRIORITY), ili da se izvravanje odloi (opcija DELAYED). Obe opcije da se umetanje podataka u tabelu odloi dok vie ne bude nijednog klijenta koji poku- ava da podatke iz tabele. Razlika ove dve opcije je u tome to Komanda INSERT opcija LOW PRIORITY blokira klijentski program koji podatke, dok opcija DELAYED to ne Ukoliko izdate komandu za umetanje podataka s opcijom LOW PRIORITY, moda morati da pre nego to budete mogli da nastavite izvravanje upita iz svog klijentskog progran1a. Ako upotrebite opciju DELAYED, vam dozvoljeno da izvravanje drugog upita, ali onda morate imati u vidu da vai podaci biti upisani u tabelu dok ona ne bude potpuno slobodna. Opcija IGNORE je korisna prvenstveno kada vie redova istovremeno. Standardno ponaanje je takvo da ukoliko jedan od redova koji pokuavate da umetnete izazove greku tipa dupliran primarni ili duplirana vrednost u koloni koja prihvata samo jedinstvene vrednosti, dolazi do greke a operacija umetanja se ponitava. Ako upotrebite opciju IGNORE, greka se zanemaruje a postupak umetanja se nastavlja s podacima iz reda. Moete zadati da kolona treba da preuzme svoju podrazumevanu vred- nost ako umesto vrednosti za kolonu zadate opciju DEFAULT. Opcija ON DUPLICATE KEY UPDATE prua elegantno reenje problema duplira- nog primam og ili duplirane jedinstvene vrednosti. Iza ove opcije sledi komanda update koja menja vrednost primarnog ili jedinstvenu vrednost u koloni tako da se ona vie "ne sudara" s podacima iz novog reda. Naredni kratak primer ilustruje upotrebe opcije ON DUPLICATE J,Y UPDATE: t' teate 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 kada ne samo to elite da unesete jedinstvene vrednosti, i da izvrite neku akciju, npr. da kada w pojavi duplirana vrednost. Svaka vrsta evidentiranja takvog je korisna. s primerom baze podataka employee, zaposlene kojima je dupliran pri- IILlrni evidentirali bismo u tabeli warning (upozorenje). Da biste evidentirali upozorenje koje se zaposlenog, izvrite ovu komandu INSERT. da kolona count ima podrazumevanu vrednost 1 i za nju 111stc zadali drugu vrednost u komandi INSERT, u polje employeeiD upisana vrtdnost 1 svaki put kada umetnete red u tabelu. Svaki naredni red koji u kolonu mployeeiD istu vrednost (l) aktivira odredbu ON DUPLICATE KEY UPDATE ko1.1 povcbva 70 Poglavlje 5 Umetanje, brisanje i auriranje podataka Komanda REPLACE Komanda REPLACE deluje komandi INSERT, s tom razlikom to ako do dupliranja novi red koji zamenjuje , . 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] 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 s komandom INSERT. Komanda DELETE SQL-ova komanda DELETE brisanje redova iz tabele. U listingu 5.1 prika- zano je nekoliko primera komandi delete, kao to je delete from department; U ovom obliku, komanda delete brie sve redove iz tabele department. opcije WHERE moete zadati redove koji se briu, na primer: delete from department where name:Asset Management'; Ova komanda brie samo redove koji ispunjavaju uslove zadate u odredbi where. U ovom primeru, izbrisani samo redovi koji u koloni name sadre vrednost Asset Management. Nije da se briu ba svi redove. poto je to oblik komande delete, moe vam se dogoditi daje grekom zadate bez odredbe WHERE. Moete potedeti sebe te glavobolje ako na komandnoj liniji klijentskog programa . mysql zadate opciju --safe-updates ili --i-am-a-dummy, kako je opisano 2 Kratak obilazak". Te opcije vas da izbriete redove (Ih da Izmemte nJihov ako odredbe WHERE ne zadate uslov za tj. morate zadati da elite da izbriete samo redove koji sadre vrednosti U MySQL-ovoj dokumentaciji stoji da komanda DELETE ima opti 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 upotrebili u dosadanjim primerima. Druga dva oblika brisanje redova iz jedne ili vie tabela uz referenci- l anje drugih tabela. Na primer: delete employee, employeeSkills t r om employee, employeeSkills, department where employee.employeeiD : employeeSkills.employeeiD nd employee.departmentiD : department.departmentiD nd department.name:'Finance; Ovaj primer brie sve zaposlene koji rade u slubi Finance i sve zapise o njihovim kvalifikacijama. Obratite panju na to da se redovi briu samo iz tabela employee i employeeSkills Uer su navedene u odredbi delete), ali ne iz tabele depart- ment U er je navedena samo u odredbi from). Redovi biti izbrisani iz tabela navedenih u odredbi delete, dok tabele navedene u odredbi from biti pretraene ali se redovi iz njih brisati, osim ako su navedene i u odredbi delete. Obratite panju na to da je ovaj primer sloen jer obuhvata tri tabele! Za ilustrovanje ovog primera potrebne su nam tri tabele. vam savetujemo da ovaj primer i opciju WHERE ponovo poto odeljak o spajanju tabela ll poglavlju 7, "Sloeniji upiti". U ovoj odredbi where upotrebili smo nekoliko novina: operator AND i notaciju tabela. kolona. operatora AND spojili smo vie uslova. To je primer jedno- stavnog AND. Upotrebili smo i notaciju employee. employee ID. Ta notacija "kolona employeeiD tabele employee". U naredna dva poglavlja detaljnije objasniti te koncepte. oblik komande DELETE je drugom obliku, s tom razlikom to u ovom briemo 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 where employee.employeeiD : employeeSkills.employeeiD tnd employee.departmentiD: department.departmentiD ,md department. name: ' Finance' ; 72 Poglavlje 5 Umetanje, brisanje i auriranje podataka Ova komanda je ekvivalentna komandi iz prethodnog pr imera, jedina razlika je sintaksa. Opti oblik komande DELETE prihvata i druge neobavezne odredbe: Odredba LOW_PRIORITY deluje na isti kao U komandi INSERT. Odredba QUICK moe ubrzati komandu DELETE jer nalae MySQL-u da odloi neke od poslova odravanja indeksa dok brie podatke iz tabele. Odredba ORDER BY redosled brisanja redova. Najkorisnija je u kombi- naciji sa opcijom LIMIT - na primer, kada elite da izbriete iz tabele samo n najstarijih redova. Odredba LIMIT maksimalan broj redova koji komanda DELETE srne da izbrie. Korisna je u kombinaciji sa odredbom ORDER BY ili kada elite da sp re- brisanje prevelikog broja redova. Komanda TRUNCATE Komanda TRUNCATE brie sve redove iz tabele. Na primer: TRUNCATE TABLE employee; Ovaj upit brie sve zaposlene iz tabele employee. Bri je od komande DELETE jer radi tako to najpre uklanja celu tabelu a zatim pravi istu takvu ali praznu. Vodite o tome da komanda TRUNCATE nije u transakcionu obradu. Komanda UPDATE SQL-ova komanda UPDATE auriranje redova u tabelama baze podataka. Na primer, pretpostavimo da je jedan od zaposlenih preao na drugo radno mesto: update employee set job='DBA' where employeeiD='6651'; Ova komanda menja vednost u koloni j ob za zaposlenog je ifra 6651. U MySQL-ovoj dokumentaciji stoji da komanda UPDATE ima 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 komandi DELETE. Grupno unoenje podataka komande LOAD DATA INFILE Moete dodati neobavezno opciju WHERE da biste aurirali samo redove, 1 d o je izosta vite, sve redove tabele. U ovom moe vam se ,1, ,Koditi da zaboravite opciju WHERE- se kad je jedan moj povrni kolega zadao 111 liO nalik na 1 ul te user l password='test'; Ovaj primer jo jednom korist od opcije -- i-am-a-dummy programa mysql, kada imate posla s neznalicama. Druga navedena verzija komande UPDATE auriranje vie tabela jednom lnluandom. Postupak je brisanju podataka iz vie tabela istovremeno, koje smo "hJ.ISnili u prethodnom odeljku. Imajte u vidu da biti aurirane samo kolone koje 1 111.-ito navedete u odredbi SET. Sve ostale odredbe komande UPDATE opisali smo ranije. Odredbe LOW_PRIORITY i IIINORE deluju na isti kao U komandi INSERT. Odredbe ORDER BY i LIMIT deluju 11.1 1sti kao u komandi DELETE. rupno unoenje podataka komande LOAD DATA INFILE l omanda LOAD DATA INFILE grupno prenoenje podataka iz tekstualne d.tloteke u tabelu, bez potrebe da piete komande INSERT. ovu tehniku, 1110gli smo da napunimo podacima tabelu department na opisan u nastavku ovog 11kljka. U listingu 5.2 prikazan je sadraj datoteke s podacima o nazivima slubi koje lll'ba uneti u tabelu department. l bli ng 5.2 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 d.1 sc svaki red podataka nalazi u zasebnom redu datoteke, a kolone su razdvojene zna- ' una za tabulator. (To se moe podesiti i to opisati u nastavku.) Podatke moete uneti u tabelu department komande LOAD DATA INFILE: lo d data local infile 'department infile.txt' Into table department; - Ova je korisna kada treba u podatke iz formata neke 1li ugc baze podataka, iz tabele programa za tabelarne ili iz CSV (comma- \l'parated values) datoteke. lli Pn1JI;1vlj b Umetanje, brisanje i auriranje podataka Komanda LOAD DATA INFILE zahteva da korisnik ima pravo FILE- detaljnije infom1acije o tome potraite u poglavlju ll, "Upravljanje pravima korisnika", ako imate problema pri izvravanju ove komande. Pravo izvravanja ove komande je iz ozbiljnih bezbednosnih razloga- na primer, da biste korisnike da bilo ta unesu u /etc/passwd. Opti 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 odredbe: Odredba LOW PRIORITY deluje na isti kao u komandi INSERT, tj. da drugi klijentski programi zavre podataka iz tabele. Odredba CONCUR- RENT, s druge strane, drugim klijentskim programima da podatke iz tabele dok je vi punite podacima komande LOAD DATA INF ILE . U navedenom primeru zadali smo neobaveznu rezervisanu LOCAL, koja da se datoteka s podacima nalazi na klijentskom (lokalnom) Ako ne zadate ovu odredbu, MySQL traiti datoteku na serveru. Ako se pri punjenju tabele podacima dupliraju, odredbe REPLACE i IGNORE pruaju dve reavanja tog problema. Opcija REPLACE nalae MySQL-u da red zameni novim redom, dok opcija IGNORE nalae MySQL-u da zadri red. Odredbe FIELDS i LINES opisuju strukturu datoteke s podacima. U optem obliku komande LOAD DATA INFILE navedene su podrazumevane vrednosti ovih opcija - svaki red s podacima smeten je u zaseban red datoteke, a vrednosti kolona razdvojene su zarezima.Vrednosti kolona moete navodnicima, a obrnute kose crte moete preslikati svaki znak (kao to je polunavod- nik) koji bi MySQL moda pogreno . Odredba IGNORE broj LINES nalae MySQL-u da zanemari prvih broj redova. Poslcdnjom odredbom zadajete da elite da popunite podacima samo navedene kolone tabele. Saetak Za prenoenje podataka iz jednog formata u drugi, se koristi CSV format (e omma-separated values- vrednosti razdvojene zarezima). Mnogi programi 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 moete preneti u tabelu employee upita: load data infile 'e:\\new_programmers.csv' Into table employee l ields terminated by , lines terminated by '\n' lgnore 2 lines (name, job, departmentiD); Kao to vidite, za prenoenje ovih podataka naveli smo vie opcija nego kada su podaci u podrazumevanom formatu za komandu LOAD DATA INFILE. Vredno je
da smo putanju datoteke zadali u formatu u Windowsu/ DOS-u, pu tanja sadri obrnutu kosu crtu, morali smo da je preslikamo 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 zadati u komandi . Nije neophodno da zadate da se redovi zavravaju znakom za nov red, ali mi smo se opredelili da to ipak Poto su prva dva reda u datoteci zapravo zaglavlje, oni ne sadre podatke i treba ih izostaviti pri podataka iz datoteke. Poto datoteka ne sadri ifre zaposlenih (kolona employeeiD), da bismo preneli tri kolone podataka u kolone tabele, da navedemo ciljne kolone (i njihov redosled) u koje se podaci prenose. U ovom primeru, to su (name, job, departmentiD). Saetak U ovom poglavlju razmatrali smo umetanja, brisanja i auriranja podataka u tabelama baze podataka. 76 Poglavlje 5 Umetanje, brisanje i auriranje podataka Umetanje podataka Vrednosti znakovnog tipa treba da budu navodnicima. Polunavodnike ili obrnute kose crte unutar vrednosti treba preslikati obrnute kose crte. Komanda INSERT 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 kao komanda INSERT, s tom razlikom to u dupliranja zamenjuje redove. Ako se to dogodi u komandi INSERT, komanda se ne izvrava ili aktivira odredbu ON DUPLICATE KEY UPDATE. Brisanje podataka Izbegnite katastrofu opcije --i-am-a-dummy. Komanda DELETE brie 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 brie sve redove tabele. Auriranje podataka Podatke u tabelama aurirate komande UPDATE TABLE: UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele SET ime_kolonel=izrazl [, ime kolone2=izraz2 ... ] [WHERE uslov] [ORDER BY ... ] [LIMIT redova] ili UPDATE [LOW_PRIORITY] [IGNORE] ime_tabele [, ime_tabele ... ] SET ime_kolonelizrazl [, ime kolone2 izraz2 ... ] [WIIERE us 1 ov] LOAD DATA INFILE Komanda LOAD DATA INFILE prenoenje sadraja 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 uspeno 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) je komandi INSERT, s tom razlikom to se u dupliranja vred- nosti red zamenjuje novim redom b) je komandi INSERT, s tom razlikom to se u dupliranja vred- nosti red zadrava a novi zanemaruje e) je komandi UPDATE, s tom razlikom to se u dupliranja vred- nosti red zamenjuje novim redom d) je komandi UPDATE, s tom razlikom to se u dupliranja vred- nosti red zadrava a novi zanemaruje 3. Opcija --i-am-a-dummy zadata u klijentskom programu mysql a) unoenje podataka b) auriranje podataka ako ni rc vrednost 78 Poglavlje 5 UmetanJe, bnsanJe 1 azumanJe pooataKa e) brisanje podataka ako nije zadata vrednost d) i b) i e) 4. U standardnom formatu datoteke koj u 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 b) zadaje da se datoteka s podacima nalazi na serveru e) zadaje da se datoteka s podacima nalazi na klijentskom d) zadaje da serverski program radi na lokalnom Vebe 1. Napiite grupu komandi INSERT kojih napuniti podacima tabele u svojoj bazi podataka porudzbine. 2. Izbriite podatke iz svojih tabela. 3. Napravite datoteku koja sadri iste podatke koje ste uneli u l i prenesite ih u svoju bazu podataka porudzbine komande LOAD DATA INFILE. Odgovori Pitanja l. b 2. a 3. d 4. e 5. e Vebe Ne postoji jedno reenj e vebi iz ovog poglavlj a. Potrudite se samo da ih sve uradite do kraja. U poglavlju U poglavlju 6, upita u MySQL-u", da se bavimo SQL-ovom "dcvojkom za sve", tj. komandom SELECT i njenim brojnim varijantama. 6 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 drugu stranu postupka: podataka iz baze. U ovom poglavlju detaljnije objasniti SQL-ovu komandu SELECT. To je wrovatno najvanija komanda jezika SQL, koja redova iz wdne ili vie tabela baze podataka. U ovom poglavlju kako se redovi iz jedne tabele baze poda- Lika. teme: Opti oblik komande SELECT Jednostavni upiti podataka samo iz kolona Alijasi kolona Upotreba odredbe WHERE za samo redova Upotreba odredbe GROUP BY grupa podataka odredbe HAVING Sortiranje rezultata upita opcije ORDER BY broj a redova rezultata opcij e LIMIT U poglavlju 7, "Sloeniji upiti" , se sloenijim upitima, a upi- tima koji obuhvataju vie tabela, te podupitima i raznim vrstama spoj eva tabela. U poglavlju 8, "Upotreba MySQL- ovih funkcija u komandi SELECT", brojne funkcij e koj e postoj e u MySQL- u da bi vam pomogle pri upo- trebi upita. Najpre pogledati opti oblik komande SELECT. HU roglaVIJe b K.OnscenJe up1ta u My:>uL-u Opti oblik komande SELECT Komanda SELECT ima opti 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- je u narednom poglavlju- ali ilustruje opti oblik komande. Odredbe koje su ovde navedene 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 opte m obliku komande. Jednostavni upiti Primer najjednostavnijeg oblika komande SELECT izgleda ovako: select * from department; Ako ovaj upit izvrite s podacima koji postoje u bazi podataka employee, trebalo bi da dobijete rezultate nalik na +---------------+--------------------------+ 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 sve podatke iz zadate tabele - tj. sve redove i sve kolone iz tabele department. Postupak moete isprobati i na nekoj drugoj tabeli- na primer, sve redove i sve kolone iz tabele employeeSkills. Razume se, sutina relacione baze podataka svakako nije u tome da vam daje sve podatke koje ste u nju uneli, da vam da podatke. podataka iz kolona U narednom koraku kolone iz kojih podatke. Znak * u prethodnom primeru upita (select * from department) "sve kolone tabele" . Umesto zvezdice, moete zadati samo kolone iz kojih vam trebaju podaci. To moe biti samo jedna kolona, nekoliko kolona tabele, ili sve kolone tabele Apsolutna 1mena oaza pooataka 1 tabel; rcdosledom koji vam treba. Imena kolona treba da zadate u obliku liste vrednosti r:tzdvojenih zarezima. upit samo vrednosti iz polja employeeiD i name tabele employee: aelect name, employeeiD from employee; Ako ovaj upit izvrite u bazi podataka employee, trebalo bi da dobijete rezultate nalik na ---------------+-------------+ l name l employeeiD ---- -----------+-------------+ Ajay Patel Nora Edwards Candy Burnett Ben Smith 6651 7513 9006 9842 ---- ---------+---------------+ rows in set (0.00 sec) Kao to vidite, prikazane su samo vrednosti iz kolona koje smo zadali u upitu. Obratite panju na to da su kolone prikazane redosledom koji smo zadali u upitu, a ne rcdosledom kojim su definisane u emi baze podataka. Apsolutna imena baza podataka i tabela Dodatan oblik notacije koji bi trebalo da imate u vidu zadavanje apsolut- nih imena baze podataka i tabele s kojom elite da radite. Kolonu name tabele employee moemo navesti u upitu kao employee. name. select employee.name from employee; Trebalo bi da rezultati ovog upita budu nalik na ---------------+ l name t---------------+ Ajay Patel Nora Edwards Candy Burnett Ben Smith --------- --- ---+ 4 rows in set (0.41 sec) tome, moete zadati koju tabelu u kojoj bazi podataka imate na umu, nn primer: select name irom employee.employee; (Trebalo bi da ovog upita dobijete isti rezultat kao prethodnog upita.) t"OglaVIJe O 1\0riSCenJe UflllCI U IVIY.:>UL-U U ovom primeru, navodimo da elimo podatke iz tabele employee koja se nalazi u bazi podataka employee. Notacija u ovom je baza_podataka . tabela. Ako je potrebno, moete zadati kojoj bazi podataka i tabeli pripada kolona. Isti primer moe se napisati sintakse baza _podataka. tabela . . kolona u sle- obliku: select employee.employee.name from employee; Ova sintaksa nije korisna za ovakve jednostavne upite, ali kad budete preli na sloenije upite, ona vam da na nedvosmislen zadajete podatke koji su vam potrebni. Alijasi Sada bi trebalo da objasnimo koncept alijasa kolona i tabela. Kolonama i izrazima u komandi SELECT moete dodeliti imena, koja se prikazivati u rezultatima. Na primer, moemo upotrebiti upit: select name as employeeName from employee; U ovom upitu preimenovali smo kolonu name u employeeName, ali samo u kon- tekstu ovog upita. Rezultati izvravanja 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, sadraj kolone name sada je prikazan ispod zaglavlja employeeName. Identifikator employeeName poznat je kao a/ijas (engl. alias). Postoje pra- vila o tome ta se moe a ta se ne moe raditi sa alijasima, koja objasniti kad na tu temu. Navedeni primer alijasa nije koristan. pravu alijasa shva- kad da piete sloenije upite i upite u kojima se neto Alijasi se mogu zadavati i za tabele, kao u 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 notacije koristan kada u narednom poglavlju da izvravate upite koji obuhvataju vie tabela. upuucuct uurcuuc vvncnc Let ucnctVCifiJC uurcucr1111 rt:uuvd U poslednja dva primera rezervisana AS nije bila neophodna. Upit smo mogli da napiemo i u obliku: oelect name employeeName Lrom employee; ili select e.name from employee e; Upite moete pisati u obliku koji smatrate najpogodnijim. To je pitanje stila programiranja. Kao to videti u ovom poglavlju i na mnogim drugim mestima u knjizi, isti upit moe se napisati na vie Kao i u drugim programskim jezicima, stil svakog programera na SQL-u razlikuje se od ostalih. Upotreba odredbe WHERE za samo redova Dosad smo razmatrali svih podataka sadranih u tabeli i svih podataka samo iz kolona. Sada na samo redova. To je korisno jer treba da iz jedne ili vie tabela te samo zapise koji ispunjavaju uslove. Ta postaje jo vanija kada je potrebno tati samo nekoliko traenih redova iz veoma obinme tabele. To se moe obaviti odredbe WHERE komande SELECT. Jednostavan primer bio bi select employeeiD, name from employee where job='Programmer'; (Uzgred, imajte u vidu da se tekst upita moe rasporediti u vie redova. Svaki upit se zavrava znakom i zarez. (;). Upite piemo na taj da bi bili Rezultati izvravanja ovog upita u bazi podataka employee izgledaju ovako: +- --- - --------+--------------+ l employeeiD l name +--- ----------+--------------+ 6651 l Ajay Patel l 7513 l Nora Edwards l +- ------------+--------------+ 2 rows in set (0.42 sec) U odredbi WHERE zadali smo uslov zbog kojeg se izdvajaju samo redovi tabele koji ga ispunjavaju - u ovom primeru, to su zaposleni koji rade kao programeri . Obratite panju na to da smo u upitu kombinovali uslov s kolonama koje nam tre- baju (employeeiD i name) da bismo samo podatke koji su nas zanimali . U ovom primeru, u odredbi WHERE zadali smo ispitivanje jednakosti. Obratite panju na to da u SQL-u znak = slui za ispitivanje jednakosti. To je od mn - gi b drugih programskih jezika, u kojima se za tu namenu koristi == ili eq. 84 PoglavlJe o KonscenJe up1ta u My:;>UL-u Postoji veliki broj funkcija koje se mogu zadati u odredbi WHERE i koje detaljno objasniti u poglavlju 8. Zasad navesti samo operatore koji se koriste: Jednakost, ili=, to smo koristili. Nejednakost koja se pie kao ! = ili <>. Sve kombinacije > od), < (manje od), >= Uednako ili od), i <= Ued- nako ili manje od). IS NULL i IS NOT NULL, kojih se ispituje da li vrednost jeste ili nije NULL. To ne moete izraza nekavrednost=NULL. (Zbog to ne moe, u poglavlju 8.) operatori koje biste i koji se koriste u kombinaciji s operatorima za Na primer, moete ispitati da li je nekavrednost > nekadrugavrednost*lO. Standardni operatori AND, OR i NOT, koji se koriste za povezivanje vie uslova. da imaju nii prioritet od operatora za na primer, izraz plata > 30000 AND plata < 50000 se kako biste i Osim operatora, u nekim primerima i funkcije. Funkcija count (l prebrojavanje redova koje je upit Na primer: select count(*) from employee; Ovaj upit pokazuje koliko redova sadri tabela employee. I najzad, standardni redosled prioriteta delova izraza moete menjati tako to ih grupiete zagrada. primer je neto sloeniji upit u kojem je zada ta odredba WHERE: select * from assignment where employeeiD=6651 and hours > 8; Ovaj upit iz kolone assignment sve poslove na kojima je zaposleni je ifra employeeiD 6651 (Ajay Pate!) radio vie od osam Vano je da u odredbi WHERE nije dozvoljena upotreba alijasa za kolone tabela, morate navesti izvorno ime kolone. To je ANSI standarda za jezik SQL. Razlog je to to vrednost kolone predstavljene alijasom moda biti poznata u trenutku ispitivanja uslova zadatih u odredbi WHERE. Uklanjanje dupliranih vrednosti opcije DISTINCT rezervisane DISTINCT navodite da u rezultatima upita ne elite da vidite duplirane vrednosti. Na primer, upit: select job from employee; d.IJ C ove podatke: --- ------------------+ job --- ------------------+ Programmer Programmer Systems Administrator OBA -- -------------------+ rows in set (0 . 01 sec) Uklanj anje dupli ran ih vrednosti opcije DISTINCT Obratite panju na to da se podatak Programmer pojavljuje dvaput jer postoji ll dva reda tabele. Upit je u listu svih vrednosti iz kolone job tabele employee. A sada, pogledaj te upit: lect distinct job It om employee; Ovaj upit daje rezultate: -- -------------------+ job --- -------- - ---------+ Programmer Systems Administrator l OBA 1 - --------------------+ l rows in set (0.04 sec) U ovom primeru duplikati se ne pojavljuju. U ovom razlika ne izgleda tako - naravno, drugi skup rezultata je tlt' to uredniji, ali poboljanje i nije tako veliko. Bilo bi primetnije kada biste imali opsenu tabelu s velikim brojem podataka koji se ponavljaju, a ipak biste dobili podatke. S druge strane, pogledajte 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 sadri vrednosti . To navodi na jer nije da u toj koloni postoje vrednosti. Ako pogledate podatke u tabeli, da kolona j ob sadri samo tri vrednosti . Lako vam se moe dogoditi da grekom zadate prethodni upit kada ste imali na 11111u upit: l ct count(distinct job) from employee; 86 Poglavlje 6 upita u MySQL-u On daje 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 odredba koju 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 vie drugih. Pogledajte upit: select count(*), job from employee group by job; Ovaj upit prebrojava zaposlene po radnom mestu- tj. broj zaposlenih. po svakom radnom mestu. Ako izvrite ovaj upit u bazi podataka employee, trebalo bt da dobijete rezultat nalik na +----------+-----------------------+ 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 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 da izaberete redosled grupa kojim se prikazuju rezultati. Podra- zumeva se redosled. Ako elimo da ponovimo poslednji upit, ali tako da se rezultati prikau redosledom, moemo upotrebiti upit: select count(*), job from employee group by job dese; Sortiranje rezultata odredbe ORDER BY ltlzultati biti nalik na -- ---+---------------------- -+ 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 abecednim redo- lo dom. Moete da zadate opciju ASC (od engl. ascending, redosled), ali poto se 1 q tlclosled podrazumeva, nema potrebe da ga zadajete. l/dvajanje grupa podataka opcije HAVING odredba komande SELECT jeste odredba HAVING. Odredba GROUP BY kojoj je ol odata odredba HAVING deluje na 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; Ovaj upit sva radna mesta u firmi na kojima je zaposlen samo po jedan slu- : hl' nik. Trebalo bi da rezultati budu nalik na ---- ----+-----------------------+ count(*) l job l ----- -- -+-----------------------+ l l DBA l l l Systems Administrator l -- ------+---------------------- -+ ' rows in set (0.05 sec) Prema naem dosadanjem iskustvu, u jeziku SQL brkaju odredbe WII ERE i HAVING. Odredbu WHERE moete upotrebiti U gotovo svakom upitu koji snu- \li tc da biste zadali uslove koji se odnose na redove. Odredbu HAVING ori stite kada uslov treba da vai za celu grupu. Sortiranje rezultata odredbe ORDER BY odredba komande SELECT jeste odredba ORDER BY koja sortiranje redova po jednoj ili vie kolona. Redosled sortiranja moe biti to st' sa ASC, ili to se sa DESC. Na primer: ' 1 ct * l t om employee otd r by j ob a se , n me d sc ; BB Poglavlje 6 upita u MySQL-u Ovaj upit sve redove i kolone iz tabele .. R:zul.tati. sortirani po abecednom redosledu sadraja kolone job, a .ako dvoje 1h v1se ljudl 1s.to radno mesto, oni biti sortirani 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, se ASC. Ukoliko ne zadate odredbu ORDER BY, nita se ne moe pretpostav1t1 o redosledu redova u skupu rezultata. broja redova rezultata odredbe LIMIT . . . Poslednja odredba komande SELECT koju razmotriti u ovom poglavlju jeste odredba LIMIT. . . . le- Odredba LIMIT broj redova rezultata koje up1t daje. Na pnmer, pog dajte upit: select * from employeeSkills limit 5; Ovaj upit daje samo prvih pet redova koji zadati uslov. U ovom slu- to je prvih pet redova 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) Moete zadati i da elite podskup redova od prvih n. Ako p:e- thodnog upita da redove od 6 do 8, to uraditi na sledeCl nacm: select * from employeeSkills limit 5, 3; Saetak Kada u odredbi LIMIT za damo dva parametra, prvi je relativni pomak (red od kojeg a drugi je maksimalni broj redova koji elimo da se Uporedite to s prethodnim kada zadamo samo jedan parametar, on predsta- vlja maksimalni broj redova koji elimo da se Kada zadajemo pomak, on od O (kao to se vidi u prethodnom primeru- za esti red zadali smo pomak 5). Prvi navedeni primer upotrebe odredbe LIMIT redove od O do 4, a drugi primer redove od 5 do 7. Ako kao vrednost drugog parametra zadate -1, upit redove od pomaka do kraja tabele. Odreba LIMIT se koristi u kombinaciji sa odredbom ORDER BY da bi rede- sled redova u rezultatima upita imao smisao. Imajte u vidu da bez odredbe ORDER BY, redosled redova rezultata nije predvidljiv. Ova odredba je korisna u We b ili GUI aplikacijama koje koriste MySQL jer jednostavan mehanizam podele rezultata na stranice. Saetak Komanda SELECT ima opti oblik: SELECT kolone FROM tabele [WHERE uslovi] [GROUP BY grupa [HAVING uslovi_ za_grupe]] [ORDER BY kolone_za_sortiranje] [LIMIT broj] ; Odredba select * sve kolone; select ime kolone samo nave- denu kolonu. Tabele moemo 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 select kolona as alijas_kolone from tabela as alijas_tabele; Odredba WHERE slui za redova koji ispunjavaju zadate uslove. Rezervisana DISTINCT uklanja duplirane podatke iz skupa rezultata. Odredba GROUP BY 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 odredbi WHERE, ali na grupe. Odredba ORDER BY sortira redove rezultata prema sadraju kolona koje navedete. Odredba LIMIT koji redovi biti iz skupa rezultata. Maksimalni broj redova zadaje se u obliku pomaka od kojeg 90 Poglavlje 6 upita u MySQL-u Pitanja 1. Koji od narednih upita 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 upita 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 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 moe 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, odredba LIMIT je a) LIMIT lS, 20 b) LIMIT 14, 19 e) LIMIT 14, s d) LIMIT lS, s Vebe 1. Napiite upit koji daje sve podatke o zaposlenima u slubi (tabela department) je ifra 128. 2. Napiite upit koji iz kolone employeeiD sve ifre zaposlenih koji su radili za klijenta je ifra l. 3. Napiite upit koji za svaku 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 Vebe 1. 2. 3. select * from employee where departmentiD=128; select employeeiD from assignment where clientiD=l; s l cL skill , count(skill) f 1om mploy Skills CJI Oll Jl IJy ll k { ) J ; 92 Poglavlje 6 upita u U poglavlju U poglavlju, "Sloeniji upiti", upite koji obuhvataju vie tabela i druge detalje komande SELECT. 7 Sloeniji upiti u OVOM POGLAVLJU SE sloenijim upitima. prven- stveno kako se mogu izvravati upiti koji obuhvataju vie tabela istovremeno. Zbog toga morati da savladate koncept spajanja tabela, tj. na koji se tabele mogu povezati. teme: Izvravanje upita koji obuhvataju vie tabela primenom vrsta spojeva: Prirodnih, unutranjih i unakrsnih spojeva Jednakovrednih spojeva Levih i desnih spojeva Podupiti Upotreba opcija komande SELECT Upotreba spojeva u upitima koji obuhvataju vie tabela Svi upiti iz poglavlja 6, upita u MySQL-u", su podatke iz samo jedne tabele. da smo se potrudili da do normalizovane strukture baze podataka u kojoj su podaci razmeteni u vie tabela, korist od iz samo jedne tabele je Ono to je zaista zanimljivo u relacionim bazama podataka jesu relacije, odnosno veze koje postoje pojedinih tabela. Kada sc podaci iz vie tabela istovremeno, te veze se nazivaju spojevi (engl.joins). Pogledajmo prvo upite koji povezuju dve tabele. Spajanje dve tabele Pogledajte upit: select employee.name, department.name trom employee, department where employee.departmentiD = department.departmentiD; rogtaVIJC l :>IOZCniJI Upili Kao to vidite, u odredbi FROM zadali smo dve tabele umesto samo jedne. U ovom elimo da imena zaposlenih i nazive slubi 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 tabelama. (Obratite panju na to da smo upotrebili notaciju s kako je opisano u poglavlju 6, da bismo razlikovali kolonu name iz tabele employee od istoimene kolone koja postoji i u tabeli department.) Da bi to moglo da radi, morali smo da navedemo imena obeju tabela u odredbi FROM. Najzanimljiviji deo ovog upita jeste odredba WHERE. Ako ovaj upit izvrite bez odredbe WHERE, u obliku: select employee.name, department.name from employee, department; 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 pridruena odredba WHERE, prikazuje zaposlene s poda- cima o slubama u kojima rade, a drugi upit prikazuje sve kombinacije zaposlenih i slubi , pri nij e utvrditi koji redovi rezultata sadre ta pod.11 k l a koji upotreoa spoJeva u up1t1ma KOJI oounvataJu v1se taoela ' " podaci besmisleni! Ovaj skup rezultata, koji se sastoji od svih kombinacija lt'dova iz dve tabele, zove se Dekartov proizvod (engl. Cartesian product) dveju tabela. Sasvim je da je odredba WHERE za dobijanje rezultata koji nam li l!baju. Kada u upitu spajamo dve tabele, uslov ili grupa uslova kojih pove- t ujemo tabele zove se spojni uslov. U ovom uslov je employee. department ID department. department ID, to je veza tabela koju smo definisali preko \poljnih jo u emi baze podataka. Kada elite da istovremeno te podatke koji se nalaze u vie tabela, morate upo- trebiti veze tih tabela da biste pronali podatke koje traite. Ponekad to da morate put od podataka koje znate do podataka koje traite. U narednom odeljku opirnije objasniti tu ideju. U prethodnom primeru rezultata obratite panju i na to da u zaglavljima obe kolone stoji natpis"name"jerje to ime svake kolone u kontekstu tabele kojoj pripada. ltezultati biti razumljiviji ako upotrebite alijase, na primer: sel ect employee.name as employeeName, department.name as department- Name Jrom employee, department where employee . departmentiD Ovaj upit daje 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) Sadraj ovog skupa rezultata je razumljiviji nego prethodni . Spajanje vie od dve tabele Spaj anje vie tabela ne razlikuje se od spajanja samo dve tabele. Recimo da treba utvrditi iz koje su slube zaposleni koji su radili za klijenta je ime Tele o Inc. Kako da do tih podataka? Poto znamo ime klijenta, u koloni clientiD tabele client moemo njegovu i fru. tog podatka u tabeli assignment poslove obavljene za tog klijenta i ifre zaposlenih (kolona employee ID) koji su ih obavili. S tim podacima moemo zatim u tabeli employee ifre slubi u kojima rade ti zaposleni. I najzad, tih podataka u tabeli department nazive slubi! Poto smo osmislili putanju traenja kroz sve tabele, preostaje nam da tu logiku preslikamo u upit, to daje select department.name irom cl ient, assignment, employee, department wh re client . name= 'Telco Inc ' l ::IIUZeniJI Ufllll and client.clientiD = assignment.clientiD and assignment.employeeiD = employee.employeeiD and employee.departmentiD = department.departmentiD; Nakon izvravanja upita, dobijamo ove rezultate: +--------------------------+ l name +--------------------------+ l Research and Development l +--------------------------+ l row in set (0.00 sec) U upitu koji smo napisali da smo morali navesti sve tabele u putanji koju smo sJedili i zadati spojne uslove koji povezuju jednu tabelu s drugom. U ovom imamo jedan uslov- client. name = 'Tel co Inc' - i vie spojnih uslova. Obratite panju na to da smo spojili tabele tri spojna uslova. Primenom ovog pravila moete proveriti da li ste zadali sve potrebne uslove. Kada spajate n tabela, u vam po jedna veza svakog para tabela, to da imati n-1 spojnih uslova. Spojevi definisani u ovom primeru prikazani su na slici 7.1.Jasno se vidi zbog je za tabele potrebno tri (n-1) spoja. assignment.employeeiD=employee.employeeiD assignment.departmentiD=department.departmentiD Slika 7.1 Za povezivanje tabele potrebna su tri spoja. Spajanje tabele same sa sobom - samospoj Kao to jednu tabelu spajamo s drugom, isto tako moemo je spojiti i sa samom sobom. Zato bismo to uradili? Ponekad traiti veze redova u istoj tabeli. Pretpo- stavimo da elimo da saznamo imena svih zaposlenih koji rade u istoj slubi kao Nora Edwards. Da bismo doli do tih podataka, prvo moramo u tabeli employee ifru slube (kolona department ID) u kojoj radi Nora, a zatim u tabeli employee potra7iti i sve ostale zaposlene koji rade u toj slubi. To moemo obaviti 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 alijasa za tabelu employee. Time smo opisali MySQL-u da raditi kao da imamo dve zasebne tabele, el i e2, koje sadre iste podatke. Zatim smo te tabele spojili, na isti kao to bismo to uradili s bilo kojim drugim dvema tabelama. Najpre smo u tabeli el potraili red s Norinim podacima (u kojem je ispunjen uslov el. name=' Nora Edwards'), a zatim smo u tabeli e2 potraili redove koji u koloni departmentiD sadre istu ifru slube kao ona u kojoj radi Nora (el. department ID = e2. department ID). Moda vam trebati malo vremena da se naviknete, ali ako moete da zamislite da radite s dve tabele, ne bi trebalo da imate 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 slubi kao Nora. Kao to se vidi, na listi se nalazi i Nora. Upitu moemo lako dodati nov uslov koji je 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 tabela Postoji vie vrsta spojeva koji se mogu uspostaviti 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 kombinacija redova tabela. Kada tom spoju dodamo uslov (kao to je employee. department ID = department. de- partmentro), dobijamo neto to se ponekad nazivajednakovredni spoj (engl. equij"oin), koji broj redova u skupu rezultata. 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 opisano, koji se pretvara u jednakovredni spoj kada mu dodamo odredbu WHERE. MySQL podrava vie oblika sintakse za ou vrstu spoja. Pogledajmo izvorni upit: select employee.name, department . name from employee, department where employee.departmentiD ; department.departmentiD; Umesto zareza, moe se zadati neobavezna rezervisana JOIN: select employee.name, department.name from employee join department where employee.departmentiD ; department.departmentiD; Osim JOIN, moete zadati i CROSS JOIN ili INNER JOIN. Kada zadate ovu vrstu spoja, MySQL pretrauje sve tabele koje ste zadali i pokuava da najefikasniji spajanja, pri ne spaja tabele obavezno redosledom koji ste naveli. se i to da upit ne bude uvek najbolje optimizovan, to detaljnije razmatrati u poglavlju 19,"0ptimizovanje upita" .Ako elite da zanemarite rezultate optimizatora i naloite MySQL-u da spoji tabele ba redosledom koji ste naveli, zamenite JOIN STRAIGHT JOIN. Levi i desni spoj Kada smo u prethodnom odeljku zadavali jednakovredne spojeve, navodili smo rezer- visane JOIN, CROSS JOIN, INNER JOIN ili moda STRAIGHT JOIN, i traili pove- zane redove u dve ili vie tabela. ta ako elimo da sve redove u jednoj tabeli za koje ne postoje redovi u drugoj tabeli? Razmotrimo u kojem elimo da zaposlene koji jo nisu radili na poslovima za spoljne klijente kompanije, tj. zaposlene ifre (vrednosti u koloni employeeiD) ne postoje u tabeli assignment . To se moe uraditi levog spoja, odnosno operatora LEFT JOIN, na select employee . name from employee left join assignment on employee.employeeiD; assignment.employeeiD where clientiD is null; Ovaj upit daje rezultate: +- - -------------+ l name l +--- ------------+ l Ajay Patel l l Candy Burnett l l Ben Smith l +-- -------------+ 3 rows in set (0.49 sec) Ako pogledate sadraj tabela, lako se uveriti da su rezultati ali kako smo do njih doli ? Podu piti Levi spoj radi tako to za sve redove tabele na levoj strani spoja (u ovom primeru to ll' tabela employee) trai redove u tabeli na desnoj strani spoja. 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 parnj aka u desnoj moete ako zadate uslov daje vrednost u desnoj tabeli NULL. Pogledajte ponovo primer. U ovom spoju, za svakog zaposlenog koji je radio za nekog spoljnog klijenta, red s podacima o zaposlenom i o poslu koji je obavio. Kada za nekog zaposlenog ne postoji red u tabeli assignment, levi spoj generie "prazan red" u kojem sve kolone sadre vrednost NULL. Te prazne redove moemo tako to potraimo sve zaposlene koji su neto radili za spoljnog klijenta ifra (kolona clientiD) sadri vrednost NULL. (Ne bi trebalo da takav postoji u tabeli assignment daje clientiD polje U verzijama MySQL-a pre 4.1, ta tehnika se koristila jer nije bilo podu pita. Podupiti su objanjeni u nastavku ovog poglavlja. U ovom primeru upotrebili smo operator LEFT JOIN, ali isto tako smo mogli da upotrebimo i operator RIGHT JOIN, koji deluje na isti s tom razlikom to je desna tabela osnova, a redovi iz tabele na levoj strani dopunjuju se vred- nostima NULL. Pod upiti Podupit (engl. subquery) jeste upit unutar drugog upita, odnosno upit se rezultat koristi u drugom upitu. Ponekad se nazivaju i upitima (engl. nested queries). Pod upiti su novina uvedena u MySQL-u 4.1. Tu korisnici su due vreme zahtevali. Podupiti ne dodaju novu funkcionalnost, ali su upiti lake razu- nlljivi kada se, umesto sloenih spojeva tabela, upotrebe podupiti . ste videli primer podupita a da toga niste ni bili svesni. Upiti za brisanje i auri- ranj e redova u vie tabela istovremeno koje smo razmatrali u poglavlju 5, "Umetanje, brisanje i auriranje podataka" ,jedna su vrsta specijalizovanog pod upita. U ovom poglavlju 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 je rezultat jedna vrednost ili red Podupite za izraze tipa redom po jedan primer svake pomenute vrste pod upita. l UU ruyiCIVIJt: l .:>IULt:IIIJI UfJill Podupiti za izvedene tabele , . . . Podupiti za izvedene tabele (engl. derived table subqueries) omogucavaJU u odredbi FROM drugog upita. Time se formira privremena tabela koja se dodaje up1tu. Pogledajte jednostavan upit: select employeeiD, name from employee where job='Programmer'; Jasno je da ovaj upit ifre i imena zaposlenih koji su programeri . Ovaj upit moemo upotrebiti u drugom upitu da bismo dobili drugi koristan rezultat: select programmer.name from (select employeeiD, name from employee where job='Programmer') as programmer, assignment where programmer.employeeiD = assignment.employeeiD; U ovom primeru upotrebili smo podupit (select employeeiD, name from employee where j ob= Programmer ') da bismo formirali izvedenu tabel u redovi sadre samo kolone employee ID i name. Privremenoj tabeli dodelili smo alijas 'pro- grammer . Tu tabel u moemo potom pretraivati na isti kao bilo koju drugu tabelu. U ovom primeru upotrebili smo je da bismo utvrdili koji su programeri radili za spoljne klijente i dobili smo rezultate: +--------------+ l name +--------------+ l Nora Edwards l +--------------+ 1 row in set (0.01 sec) Podupiti koji daju jednu vrednost Kao u prethodnom odeljku, jednostavnim upitom: select max(hours) from assignment; Rezultat ovog upita je jedna vrednost, koja predstavlja broj radnih sati utro- enih na neki posao. Ovde smo upotrebili MySQL-ovu funkciju koju dosad nismo pominjali: to je funkcija max () , koja pronalazi vrednost u zadatoj koloni_ tabele. Funkcijom max () se vie u poglavlju 8, "Upotreba MySQL-ov1h funkcija u komandi SELECT". U pod upitima koji jednu vrednost (engl. single-value subqueries), se ova vrsta funkcija koristi za dobijanje tata koji se potom koristi za druge Kao u prethodnim odeljcima, ovaj upit upotrebiti unutar drugog upita. Rezultat upita koji jednu vrednost jeste vrednost koja se potom poredi s nekom drugom Pogledajte 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 traimo zaposlenog koji bi mogao zasluiti "titulu" najvrednijeg 1.1dnika u firmi. e je koji je zaposleni proveo najvie radnih sati dnevno nekom poslu? Ovo su rezultati izvravanja upita: 1--- ----------+---------- ----+ l employeeiD l name l -- ----------+--------------+ l 7513 l Nora Edwards l 1-- -----------+------------ --+ l row in set (0.42 sec) Mogu se napisati i upiti koji umesto jedne vrednosti, red s vie vrednosti, ali .Jl: korist od toga U nastavku teksta primer takvog upita. Podupiti za izraze tipa Podupiti za izraze tipa (engl. Boolean expression subqueries) da se u glavnom upitu upotrebi jedna od nekoliko specijalnih funkcija za rad s rezultatima tipa. Te funkcije SU IN, EXISTS i (grupisano) ALL, ANY i SOME. Rezervisana IN s grupom vrednosti. Pogledajte 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 IN da utvrdite da li se data vrednost nalazi u skupu vrednosti. U ovom 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 operatora IN podaci upita mogu porediti i s listom navedenih vrednosti, kao u narednom primeru: nelect name Irom employee where employeeiD not in (6651, 1234); 102 Poglavlje 7 Sl oeniji upiti Rezervisana EXISTS deluje na malo od rezervisane 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 upit: select e.name, e.employeeiD from employee e where not exists (select * from assignment where employeeiD = e.employeeiD); U ovom primeru traimo zaposlene koji nisu nikad radili na poslovima za spoljne klijente. Pod upit 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 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 u skup rezultata upita. Mada neki korisnici lake razumeti ovu sintaksu, rezultate jednake onima iz prethodnog odeljka dobijamo i 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 ALL, ANY i SOME sa skupom vrednosti koje podupit. Pretpostavimo da Nora Edwards, koje se moda kao programera koji najvie radi, eli da dokae da niko nema vie radnih sati od programera. Da bi dokazala tu smislila je 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 listu radnih sati, po programeru i po poslu koji je obavio. Potom glavni upit ispituje da li postoji drugi zaposleni je broj sati Opcije komande SELECT od broja radnih sati nekog programera. To se radi u delu upita a. hours > ALL, gde se da li je broj radnih sati zaposlenog od broja radnih sati svakog programera vas iznenaditi informacija da ovaj upit ne nijedan red podataka, dokazuje da niko u toj firmi ne radi vie od programera. Opcije komande SELECT Kada smo prvi put razmatrali komandu SELECT, opisali smo oblik opte sintakse te komande. Pogledajmo sada njenu potpunu sintaksu da bismo videli ta jo ne znamo. U MySQL-ovoj dokumentaciji stoji da komanda SELECT ima opti oblik: SELECT [STRAIGHT_JOIN) [SQL_SMALL_RESULT) [SQL_BIG_RESULT) [SQL BUFFER RESULT) [SQL_CACHE l SQL_NO_CACHE) [SQL CALC FOuND ROWSJ [HIGH_PRIORITY) [DISTINCT l DISTINCTROW l ALL) - - - ... [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)) odredaba poznajete. Pogledajmo ukratko one koje dosad nismo pominjali: Odredba STRAIGHT JOIN na samom komande nalae optimizatoru upita da spoji tabele ba redosledom koji ste zadali. ove opcije jednak je kao kada zadate STRAIGHT JOIN u odredbi WHERE, kao to je napomenuto u prethodnom delu ovog poglavlja. To je jedno od MySQL-ovih proirenja ANSI standarda za jezik SQL. Opcije SQL_SMALL_RESULT, SQL_BIG_RESULT i SQL_BUFFER_RESULT vaju optirnizovanje upita. opcija SQL_SMALL RESULT i SQL BIG RESULT obevetavate MySQL da da se skup upita sastoJati od malog, odnosno velikog broja redova. Opcija SQL_BUFFER_RESULT nalae MySQL-u da skup rezultata smesti u privremenu tabel u. Tu opciju moete iskoristiti kada znate da slanje skupa rezultata klijentskom programu potrajati dugo, a elite da izbegnete da on za to vreme blokira tabele iz kojih podaci treba da se Ove opcije su MySQL-ova proirenja ANSI standarda za jezik SQL. 104 Poglavlje 7 Sloeniji upiti SQL CACHE i SQL NOCACHE nalau MySQL-u da rezultate smeta, odnosno ne smeta u ostavu O o jedno proirenje ANSI standarda za jezik SQL.) SQL CALC FOUND ROWS se koristi u odredbi LIMIT; zahteva da MySQL koliko bi no -redova upit vratio kada ne bi sadrao odredbu LIMIT. Taj broj redova se zatim moe opcije select found_rows () ; U o jedno proirenje ANSI standarda za jezik SQL). Svrha ove opcije jeste da se izbegne ponavljanje posla. U verzijama MySQL-a u kojima ova opcija nije postojala, isti rezultat je mogao da se postigne tako to se najpre izvri upit s funkcijom COUNT (*),a zatim i drugi upit SELECT koji sadri opciju LIMIT. HIGH PRIORITY obavetava MySQL da taj upit treba da ima prednost nad svim komandama UPDATE koje pristup tabelama navedenim u upitu. smo opisali opciju DISTINCT, a DISTINCTROW je njen sinonim. ALL ima suprotan efekat 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 auriranje podataka". Ova komanda smeta rezultate komande SELECT u zadatu datoteku. Odredba opcije_pri_izvozu ima isto kao u komandi LOAD DATA INFILE (vie detalja o tome u poglavlju 5). Odredba PROCEDURE da zadate proceduru koja se poziva pre nego to se skup rezultata poalje klijentskom programu. Ta procedura mora biti napisana na jeziku C++ i, kao takva, izlazi izvan okvira ove knjige, ali ako vam treba vie informacija, potraite ih u MySQL-ovoj dokumentaciji . Odredbe FOR UPDATE i LOCK IN SHARE MODE deluju samo ako vaa maina baze podataka podatke na nivou stranice ili reda. U praksi, opcija je upo- trebljiva ako koristite maine InnoDB i BDB.Ako zadate FOR UPDATE, vanje podataka biti a ako zada te LOCK IN SHARE MODE, biti deljeno.Vrste u poglavlju lO",Upotreba trans- akcija u InnoDB tabelama". Saetak Spojevi Spoj je postupak povezivanja dveju tabela. Tabele koje povezujemo navodimo u odredbi FROM, zajedno s vrstom spoja. Treba zadati i uslov koji opisuje na koji bi tabele trebalo da budu spojene. Operator zarez i rezervisane JOIN, INNER JOIN i CROSS JOIN deluju na isti tj. kombinuju zadate tabele tako da traenje podataka u svim tim tabelama. Lev i desni spojevi pronalaenje redova u jednoj tabeli koji nemaju redove u drugoj tabeli . rrranJa Pod upiti Pod upit je upit unutar drugog upita. Pod upiti mogu da vrate jednu vrednost, red podataka ili skup vrednosti. Mogu se koristiti i za ispitivanje uslova operatora SOME, ALL ili ANY operatora EXISTS moe se utvrditi da li u rezultatima podupita postoji red koji je povezan s nekim redom glavnog upita. Opcije komande SELECT Komandi SELECT mogu se pridruiti razne opcije koje optirnizuju izvravanje te komande. komande SELECT INTO OUTFILE mogu se kopirati podaci iz tabele u spoljnu datoteku, na koji smo u poglavlju 5 podatke iz datoteke u tabelu komande LOAD DATA INFILE. Komandi se mogu dodati procedure (napisane na jeziku C++) koje podatke pre prenoenja u MySQL ili iz MySQL-a. Pitanja 1. De kart ov proizvod je a) skup svih kombinacija redova iz dve ili vie tabela b) skup kombinacija redova iz dve ili vie tabela koji su povezani e) skup redova iz jedne tabele kojima su dodati redovi iz druge tabele, a gde to nije red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele d) nije nita od prethodnog 2. Levi spoj je a) skup svih kombinacija redova iz dve ili vie tabela b) skup kombinacija redova iz dve ili vie tabela koji su povezani e) skup redova iz jedne tabele kojima su dodati redovi iz druge tabele, a gde to nije red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele d) nije nita od prethodnog 3. Jednakovredni spoj je a) skup svih kombinacija redova iz dve ili vie tabela b) skup kombinacija redova iz dve ili vie tabela koji su povezani e) skup redova iz jedne tabele kojima su dodati redovi iz druge tabele, a gde to nije red je popunjen vrednostima NULL na mestima gde bi bili podaci iz druge tabele d) nije nita od prethodnog 106 Poglavlje 7 Sloeniji upiti 4. Korelirani podupit se tako zove zato to uspostavlj a korelaciju a) redova tabela b) redova iste tabele e) dva spoja d) redova glavnog upita i redova podupita 5. Razlika upita sa 5.1 i 5.2 u nastavku teksta j e a) nema razlike b) podatke e) iste podatke ali je verovatno da se levi spoj (upit 5.1) bre tavati d) iste podatke ali je verovatno da se podupit (upit 5.2) bre 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 Vebe (select * from assignment where employeeiD e. employeeiD) ; 1. Napiite upit koji prikazuje imena zaposlenih i njihove kvalifikacije. 2. Napiite upit koji operatora LEFT JOIN formira listu klijenata za koje nijedan od zaposlenih nije obavio nijedan posao. 3. Upit iz vebe broj 2 napiite tako da koristi operator EXISTS. Odgovori Pitanja 1. a 2. e 3. b 4. d 5. e Vebe 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 poglavlju U poglavlju 8",Upotreba MySQL-ovih funkcija u komandi SELECT", funkcije koje postoje u MySQL-u za upotrebu u komandi SELECT. 8 Upotreba MySQL- ovih funkcija u komandi SELECT MYSQL SADRI IROK OPSEG OPERATORA I FUNKCIJA koji mogu biti korisni pri pisanju upita. je namenjena upotrebi i odredbama SELECT i WHERE. Postoje i specijalne funkcije koje deluju na grupe podataka i upotrebljavaju se u odredbi GROUP BY. smo koristili osnovne operatore za i funkcije count () i max (). U MySQL-u je na raspolaganju veliki broj funkcija. U ovom pogla- vlju najkorisnije njima. Ovu knjigu nismo zamislili kao referentni za MySQL-ove funkcije, samo pokuavamo da sliku funkcio- nalnosti koja je na raspolaganju. teme: Operatori Funkcije za upravljanje tokom izvravanja Funkcije za rad sa znakovnim vrednostima funkcije Funkcije za rad s datumima i vremenima Funkcije za konverziju tipova podataka Druge funkcije Funkcije za upotrebu u odredbama GROUP BY. Vano je zapamtiti da se u MySQL-u svaki izraz koji sadri vrednost NULL svodi na vrednost NULL, uz nekoliko izuzetaka koje kada budemo naili na njih. O lome biti vie u odeljku o operatorima za vrednosti. Poglavlje 8 Upotreba MySQL-ovih funkcija u komandi SELECT u ovom poglavlju komandu SELECT bez tabela u njoj. Komanda SELECT moe se upotrebiti kao jednostavan kalkul ator. Na primer, ako za date select 2+2; rezultat +-- ---+ l 2+2 l +-- ---+ 4 l +- ----+ 1 row in set (0.42 sec) Moete izvravati izraze koji ne sadre imena tabela i u kojima moete zadavati irok opseg i drugih operatora i funkcija. :ranje 2+2 je trivijalno, ali to svakako ne vai za izvravanje operaciJa u komandi SELECT. Na primer, to vam da uradite finansijsku analizu vrednosti u tabelama i da zatim prikaete rezultate u obliku izvetaja. U svim MySQL izrazima moete zadavati zagrade da biste upravljali redosledom kojim se pojedini delovi izraza, na isti kao u bilo kom drugom pro- gramskom jeziku. Pogledajmo najpre operatore. Operatori . . u MSQL-u postoje tri glavne grupe operatora: za vrednosti i Operatore smo ukratko opisali u poglavlju 6, upita u MySQL-u". Sada ih detaljnije razmotriti. operatori v MySQL podrava operatore koje biste ocekivali: sabiranJe(+), oduzimanje (-), mnoenje (*) i deljenje (/). Deljenje nulom daje vrednost NULL. Operatori za vrednosti . . Najvanije to bi trebalo da zapamtite ope;atorima za j este izuzev u nekohko posebmh slucaJeva, sta god poredite s vrednoscu NULL, uvek daje NULL. To vai i za NULL s NULL: select NULL=NULL; +-- -- - -- - -- - + l NULL=NULL l +-------- - - -+ NULL l -----------+ 1 row i n set (0 . 00 sec ) Uporedite to sa upitom: select NULL IS NULL; +--- - ----- - - - --+ l NULL IS NULL l +--------------+ l l +--------------+ l row in set (0.00 sec) Ovaj primer ono to smo napomenuli u poglavlju 6, a to je da morate opre- zno korisiti operatore za ukoliko se podacima moe pojaviti i NULL. Druga koju bi trebalo da zapamtite jeste da se u pri pare- vrednosti znakovnog tipa u MySQL-u ne pravi razlika malih i velikih slova. Ako elite da se znakovne vrednosti porede tako da se ipak pravi razlika malih i velikih slova, ispred jedne od njih dodajte prefiks BINARY. Na primer, select * from department where name='marketing'; Ovaj upit '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 binary, na select * from department where name = binary 'marketing'; Ovako napisan upit ne nijedan red iz baze podataka employee: Empty set (0.18 sec) Posle ovog uvoda, moemo na operatore za se koriste operatori navedeni u tabeli 8.1. Tabela 8.1 Operatori za Operator != ili <> < <= > >= Jednako od Manje od Jednako ili manje od od Jednako ili od ll !'oglavlJe tl upotreoa My:>uL-ovm ugraaenm runKCIJa u KomanOI :>tLtLI Tabela 8.1 Operatori za (nastavak) Operator n BETWEEN min AND max da li se n nalazi u opsegu vrednosti od min do max. n IN (skup vrednosti) Pripadnost skupu vrednosti koji se moe zadati u obliku liste vrednosti, izraza ili podu pita. Primer skupa: (jabuka, orah, breskva) <=> n IS NULL ISNULL(n) operatori Operator za jednakost koji se moe upotrebiti i za NULL. Kada se pored e dve vrednosti NULL, rezultat je l (true). Ispituje da li n ima vrednost NULL Ispituje da li n ima vrednost NULL. MySQL podrava sve operatore koji delove izraza. izrazi u MySQL-u mogu imati vrednost 1 (true), o (false) ili NULL. Osim toga, MySQL kao true (istinito, svaku vrednost od nule i od NULL. Kada su vrednosti NULL u pitanju, neki elementi tabela istinitosti su malo od onog to biste Tabela 8.2 prikazuje operatore. Tabela 8.2 operatori Operator AND ili && OR ili ll NOT ili XOR Primer n && m n ll m NOT n n XOR m
I. Tabela istine izgleda ovako: true&&true = true false&&bilo ta = false Svi ostali izrazi svode se na NULL. ILI. Tabela istine izgleda ovako: true l lbilo ta= true NULLI l false= NULL NULL l l NULL = NULL false! l false = false NE. Tabela istine izgleda ovako: !true = false !false = true !NULL = NULL ILI. Tabela istine izgleda ovako: true XOR true = false true XOR false = true false XOR true = true NULL XOR n = NULL n XOR NULL = NULL runkCIJe za upravlJanje tokom izvravanja komandi Funkcije za upravljanje tokom izvravanja komandi Najpre razmotriti grupu funkcija za upravljanje tokom komandi. njima su najkorisnije IF i CASE, koje deluju iskazu if, odnosno switch ili case iz programskih jezika. Prototip funkcije IF izgleda ovako IF (el, e2, e3) Ako izraz el ima vrednost true, funkcija IF rezultat e2; u suprotnom, rezultat funkcije je e3. Na primer, ako ovu funkciju upotrebimo u bazi podataka employee, moemo zadati upit: select name, if(job='Programmer', "nerd", "not a nerd") from employee; Ovaj upit daje 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 prototipe (prema MySQL-ovoj dokumentaciji): CASE vrednost WHEN THEN rezultat [WHEN THEN rezultat .. . ] [ELSE rezultat] END ili CASE WHEN [uslov] THEN rezultat [WHEN [uslov] THEN rezultat ... ] [ELSE rezultat] END Ovu funkciju moete upotrebiti da biste izdvojili jednu vrednost iz skupa od nekoliko. Primera radi, pogledajte upit: select workdate, case when workdate e 2000-01-01 then "archived" when workdate e 2003-01-01 then "old" else "current" end from assignment; 1'14 PoglavlJe 8 Upotreba My:>UL-ovlh tuni<CIJa u 1<omand1 :>tLtCI Ovaj upit ispituje vrednost kolone workdate (datum posla) u svakom redu tabele assignment. Datumi iz prethodnog veka se sa "archived", datumi iz pret- hodne godine se sa "old", dok se svi ostali datumi 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 znakovnih vrednosti. Verovatno 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. (Moda vas je iznenadilo to to je ova funkcija navedena funkcijama za rad sa znakovnim vrednostima, ali se za notaciju nekih baza koriste slova, kao u heksadecimal- noj bazi.) ukupan broj znakova sadranih u s. sadraj datoteke ime_ datoteke kao jedan niz znakova. locate (igla,plast_sena, poziciju niza znakova igla u nizu pozicija) plast_sena. Traenje od pozicije pozicija. lower (s) i upper (s) Pretvara niz znakova s u mala, odnosno velika slova. quote (s) replace(izvor, za mena) soundex(s) substring(s, ukupno) trim (s) Preslikava niz znakova s u oblik pogodan za smetanje u bazu podataka. To podrazumeva uokvirivanje znakovnog niza polunavodnicima i umetanje obrnute kose crte. niz znakova izvor u kojem je podniz zamenjen nizom zamena na svim mestima gde se pojavljuje. soundex oblik izvornog niza znakova s. Soundex oblik znakovne vrednosti predstavlja na koji znakovna vrednost treba da se izgovara na engleskom jeziku. Na primer, ponekad je lake ime osobe ako se trai sound ex oblik a ne kako je ime napisano. ukupno znakova iz niza s, od Uklanja i zavrne beline iz niza znakova s. funkcije l trim () moete ukloniti samo beline, a funkcija rt rim () uklanja zavrne beline.) runKCIJe za raa sa znaKovnim vreanost1ma Funkcije za znakovnih vrednosti Osim operatora jednakosti, u MySQL-u postoji i vie drugih funkcija za dve znakovne vrednosti: LIKE: s dokerskim znacima. RLIKE: s regularnim izrazima. STRCMP: znakovnih vrednosti, funkciji strcmp () u jeziku C. MATCH: Tekstualno pretraivanje. U ovom odeljku funkcije LIKE, RLIKE i STRCMP. Tekstualno pretrai- vanje je na raspolaganju samo u My ISAM tabelama. Vie informacija o tome u poglavlju 9, "Tipovi tabela u MySQL-u". s dokerskim znacima funkcije LIKE Pogledajmo primer upotrebe operatora LIKE: select * from department where name like '%research%'; U ovom primeru ne traimo nazive jednake 'research', nazive koji bilo gde sadre 'research'. Rezultati su +---------------+--------------------------+ l departmentiD l name +---------------+----------------- ---------+ 128 l Research and Development l +---------------+------ --------------------+ l row in set (0.04 sec) Funkcija LIKE podrava dva s dokerskim znacima. Znak za pro- cenat (%), upotrebljen kao u navedenom primeru, poklapanje s grupom zna- kova bilo koje duine i nula). To da se izraz '%research%' poklapa sa svakom znakovnom koja sadri research. Imajte u vidu da se pri znakovnih vrednosti ne pravi razlika malih i velikih slova, kao to je objanjeno u prethodnom delu ovog poglavlja. Stariji dokerski znak je podvlaka U, kojim se poklapanje s jednim zna- kom. Na primer, '_at' se poklapa sa znakovnim vrednostima cat , mat , bat itd. s regularnim izrazima funkcije RUKE Funkcija RL IKE znakovnih vrednosti s regularnim izrazima. Regularan izraz je ablon koji opisuje opti oblik znakovne vrednosti. Uslovi koje bi trebalo da ispunjavaju znakovni nizovi koje traimo, opisuju se posebnom notaci- jom. ukratko tu notaciju. Prvo, svaki literal uvek se poklapa sa istim nizom znakova. To da se ablon 'cat' poklapa s 'cat'. poklapanje vai i za catacomb i the cat sat on the mat'. ablon 'cat' pronalazi niz znakova cat na svim mestinu unutar niza znakova. 116 Poglavlje 8 Upotreba MySQL-ovih tunkciJa u komano1 ::,tLtLI Ako elite da ablon pronalazi samo 'cat', onda ga morate izmeniti u '"'cat$'. Znak karet ("') "fiksni niza znakova"; drugim niz znakova koji traimo mora da 'cat'. Znak za dolar($) "fiksni kraj niza zna- kova"; drugim niz znakova koji traimo mora da se zavrava 'cat'. Prema tome, ablon '"'cat$' prihvata samo 'cat' i nita drugo. U regularnim izrazima podrani su i dokerski znaci, isto kao u funkciji LIKE. dokerski znak je Postoji samo jedan - (.) - koji poklapanje s jednim znakom, bilo kojim. Na primer, ' . at' poklapanje s 'cat', 'bat', 'mat' itd. Dovoljan je samo jedan dokerski znak jer se u traenom nizu znakova moe zadati i ponavljanje znakova i dokerske znakove) broj puta. Kada iza nekog znaka postavite specijalni znak *, to da se prethodni znak moe pojaviti nula ili vie puta. Na primer, ablon 'n*' prihvata ' ', 'n', 'nn', 'nnn' itd. Znaci se mogu grupisati zagrada, tako da ablon ' (cat)*' prihvata ' ', 'cat', 'cat cat', 'catcatcat' itd. je i upoteba dokerskih znakova, pa ablon ' . * ' prihvata broj znakova, to svaki niz znakova. tome, znak plus(+) da se znak ili niz znakova ispred njega moe poja- viti jedanput ili vie puta, a upitnik (?) jednom ili nijednom. Moete zadati i opseg vrednosti, tako da ablon ' (cat) (2, 4) ' prihvata 'catcat ', 'catcatcat ' i 'catcatcatcat'. Osim znakova i nizova znakova, moete zadavati i skupove znakova, koji se piu uglastih zagrada. Na primer, ablon ' [a-z] ' prihvata bilo koje slovo, dok ablon ' [a- z]*' prihvata nizove sastavljene od proizvoljno g broja znakova. I najzad, postoji vie klasa znakova, koje su zapravo unapred definisani skupovi uslova. Na primer, [ [:al num: JJ prihvata svaki znak. Ako se bavite programiranjem na jeziku Perl, vredno je napomenuti da MySQL podrava regularne izraze u formatu POSIX, koji se razlikuje od formata Perlovih regularnih izraza. A sada, pogledajmo primer upotrebe ablona s funkcijom RLIKE. Razmotrite sle- upit: select * from department where name rlike 'an'; Ovaj upit pronalazi sve redove koji bilo gde u koloni department sadre 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) funkcije . Regularni izrazi mogu biti veoma ali i veoma sloeni. Ako vam treba vie pnmera i opirniji opis sintakse, na Webu mnogo dobrih tekstova na tu temu. nizova znakova funkcije STRCMP() .funkciju s:RCMP (). MySQL-u vae iste konvencije kao i u drugim programskim JeZlCllUa, kao so su e lh P HP. Prototip funkcije izgleda ovako: STRCMP(sl, s2) a funkcija 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 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 zavisi od lokalnog skupa znakova koji je akti- van. Ako Je aktivan Jez1k razlicit od engleskog, znakovne vrednosti biti sortirane kako biste i pod uslovom da ste zadali skup znakova kada ste 11:tprav1h tabelu. funkcije l'.1bela 8.4 prikazuje nekoliko korisnih funkciia. U MySQL- d k _ . .. " , OVOJ O ll nar1 rete opise mnogih drugih funkcijn iz ll' kategorije. 118 Poglavlje 8 Upotreba MySQL-ovih tunKCIJa u KomanOI ;:,tLtLI Tabela 8.4 funkcije Funkcija abs (n) ceiling (n) floor (n) mod (n, m) i div power (n, m) rand(n) round (n[, d]) sqrt (n) Svrha apsolutnu vrednost n, a to je vrednost bez predznaka. vrednost n zaokruenu navie na najblii ceo broJ. vrednost n zaokruenu nanie na najblii ceo broj. Ove dve funkcije dele n sa m. Funkcija di v celo brojni rezultat, a funkcija mod () celo brojni ostatak deljenJa. n podignuto na stepen m. .. generisan broj u opsegu O do l. Parametar n mJe . obavezan, ali kada ga zadate, njime se tructJalizuJe algontam za brojeva. istu vrednost n funkciJI rand generie se ista pseudoslucaJna vrednost.) n zaokrueno na najbliu celobrojnu vrednost. Ako zadate i parametar d, n vrednost se zaokruuje na d dectmalruh mesta. kvadratni koren od n. . . u e zi sa ovim funkcijama Pogledajmo primer upotrebe funkClj3 mod() l v.. v je dok se mod moe napisati u obhku mod(9, 2) ili 9 mod 2 ili 9 % 2 funkcija di v moe se napisati samo kao 9 div 2 Primera radi div(9, 2) raditi izazvati sintaksnu greku. U b fi k d i div u MySQL-u daje 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 ---- __ __ (o . oo 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. 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 slue za sabiranje i oduzimanje datuma. Vrednosti zadatoj parametrom datum dodaju, odnosno od nje period zadat rezervisane INTERVAL. Morate zadati i n i tip te Parametar tip moe imati vrednost SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, MINUTE: SECOND (trebalo bi da n bude izraeno u formatu 'm: s'), HOUR:MINUTE ('h:m'), DAY_HOUR ('d h'), YEAR_MONTH (' y-m' ), HOUR_SECOND (' h:m: s'), DAY_MINUTE ('d h:m'), DAY_SECOND ('d h:m:s'). Ove funkcije su zaista korisne, ali poto je gotovo zapamtiti sve formate za datume i vremena Qer se razlikuju), da ih potraite u MySQL-ovoj dokumentaciji. Ove funkcije datum, vreme, odnosno datum i vreme. ovih funkcija moete izraziti datume i vremena u gotovo svakom fom1atu koji zamislite. To se radi tako to se zada format u obliku niza znakova, kao u primeru: date_format(workdate, '%W %D of %M, %Y'). Navedeni format prikazuje datum u obliku, na primer, 'Monday 16th of June, 2003 '. Poto je spisak formata detaljnije informacije potraite 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 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 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); 120 Poglavlje 8 Upotreba MySQL-ovih funkcija u komandi Rezultat je +--------------------------------------------------+ l adddate("l999-0l-01", INTERVAL "1-6" YEAR_MONTH) l +------------------- ----------------------- --------+ l 2000-07-01 l +------------------------------------------------- -+ 1 row in set (0.41 sec) U mnogim aplikacijama u kojima formatirate izlazne podatke namenjene drugom programu, to moda biti najpogodniji oblik datuma. Unixov for- mat timestamp nije razumljiv 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) ) ; generie rezultat neupotrebljiv za 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 konverziju tipova podataka, tj. u rezultat pretvaraju jedan tip podataka (na primer, signed integer) u drugi (na primer, char). Prototipovi ovih funkcija su cast(izraz AS tip) convert(izraz, tip) Funkcija cast () podrana je u ANSI standardu, a funkcija convert () podrana je u ODBC standardu. Parametar tip moe imati vrednost BINARY, CHAR, DATE, DATETIME, SIGNED (INTEGER) i UNSIGNED (INTEGER). konverzija tipova podataka odvija se u MySQL-u automatski kad zatreba; na primer, ako funkciji za rad s vrednostima znakovnog tipa prosledite broj, on 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 funkcije. Tabela 8.6 Ostale funkcije Funkcija Namena benchmark (broj, izraz) encrypt(s[,zrnce]) found_rows () last_insert_id () md5 (s) password(s) vrednost izraza izraz zadati broj puta, Ova funkcija uvek nulu - njena svrha je da meri vreme potrebno za izraza i prikae dobijena vreme. ifruje vrednost s Unixove sistemske funkcije crypt. Neobavezni parametar zrnce je niz od dva znaka. Ako funkcija crypt nije na raspolaganju u vaem sistemu Qer imate, na primer, Windows), funkcija rezultat NULL. Daje podatak o ukupnom broju redova koji bi tao poslednji upit kada ne bi sadrao odredbu limit. Deluje samo ako je u komandi SELECT zadata opcija SQL_CALC_FOUND_ROWS, kao to je opisano u poglavlju 7. 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 u drugu tabelu. 128-bitni he ulaznog niza znakova s u MDS formatu. Ako piete aplikaciju koja imena korisnika i lozinke, to je prepo- oblik skladitenja lozinki u bazu podataka. Algoritmi za ifrovanje podataka imaju vek upotreblji- vosti. da snaga neprekidno raste, neophodni su i sve snaniji algoritmi za ifrovanje podataka. MDS se zasad smatra sigurnim. ifrovan oblik za lozinku zadatu parametrom s. To nije oblik u kojem se interno lozinke korisnika MySQL-a, to je opisano u u 11, "Upravljanje pravima korisnika". Upotreba funkcije password () za ifrovanje lozinki koje se u bazi podataka ne 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. Moete ih primeniti i na ceo skup rezultata upita, pri se svi redovi kao pripadnici jedne grupe. To smo upo- trebili u upitima kao to je select count(*) from employee; Ovaj upit daje ukupan broj redova u tabeli employee. 122 Poglavlje B Upotreba MySQL-ovih funkcija u komandi SELI::CI Ove funkcije se primenjuju na grupe podataka, kao u 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) Saetak Namena prosek vrednosti sadranih u koloni kolona. ukupan broj vrednosti u koloni kolona. najmanju vrednost u koloni kolona. vrednost u koloni kolona. standardni otklon za vrednosti sadrane u koloni kol ona. zbir vrednosti sadranih u koloni kolona. MySQL prua izbor i operatora, kao i operatora za pere- vrednosti. Pri upotrebi operatora morate obratiti panju na pojave vrednosti NULL jer u tom rezultati uvek biti kakve MySQL prua bogat izbor funkcija za rad s vrednostima znakovnog i 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 operatora ne mogu upotrebiti za ispitivanje da li je 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 funkcija upotrebili da dobijete ime meseca u datumu? a) dayname () b) extract() e) subdate () d) now() 4. Koju od 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 Vebe a) to je sintaksna greka b) cela tabela se kao jedna grupa e) ceo skup rezultata se kao jedna grupa d) svaki red se kao jedna grupa l. Napiite upit koji prikazuje imena zaposlenih i radnih mesta, ali ako je naziv rad nog mesta 'Programmer', treba da se prikae 'Analyst 1 Programmer'. 2. Napiite upit koji u kolonu department dodaje novu slubu je naziv Property Services. Zatim napiite upit koji dodaje novog zaposlenog, je ime Fred Smith a radno mesto DBA i radi u toj slubi. Upotrebite funkciju last_insert_id (} da biste dobili identifikator nove slube. 3. Napiite upit koji najnoviji posao iz tabele assignment. Savet: upotrebite grupnu funkciju max () . Odgovori Pitanja l. d 2. b 3. b 4. a 5. e 124 Poglavlje 8 Upotreba MySOL-ovih funkcija u komane11 Vebe 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 poglavlju Ovo poglavlje zavrava deo "Upotreba MySQL-a" . U narednom. delu knjige, "Tipovi tabela i transakcije u MySQL-u", pojedine maine baze podataka koje MySQL podrava i posebne koje one pruaju.
Tipovi tabela i transakcij u MySOL- 9 Tipovi tabela u MySQL-u 10 Upotreba transakcija u InnoDB tabelama 9 Tipovi tabela u MySQL-u u OVOM POGLAVLJU TIPOVE TABELA koje su na raspolaganju projektantu MySQL aplikacija. U dosadanjim primerima koristili smo uglavnom InnoDB ili My ISAM tabele, ali postoje i druge. Projektovanje sistema za upravljanje bazama podataka, projektovanju sistema za druge namene, podrazumeva mnogo kompromisa. Na primer, poeljno je da se mnogi poslovi u bazi podataka obavljaju kao transakcije, ali da bi se to obezbedilo, treba vie vremena i troi se vie prostora na disku i memorije. Deo posla pronalaenja najboljih kompromisa autori MySQL-a su preneli na vas, projektanta baze podataka, tako to su vam prepustili izbor tipa tabela koje koristiti. Moete se opredeliti zajedan od tipova koji podravaju transakcije, ukoliko je to neophodno u vaoj aplikaciji, ili moete izabrati tip tabela koji bolje performanse, ali ne podrava transakcije. U oba morate biti svesni kompromisa koje morate da napravite. Moda da se tipovi tabela nazivaju maine za skladitenje (engl. storage engine). To odraava da je za upotrebu nekih tipova tabela neophodna zna- posebnog programskog koda koji upravlja smetanjem podataka, indek- siranjem, podataka i pristupanjem disku. To odraava sutinu baze podataka: skladitenje podataka. Izrazi transakcij"a ili podrka za transakcije se u ovom poglavlju. To je vaan uslov o kojem treba da vodite kada birate tip tabele. U primerima koje smo dosad naveli u ovoj knjizi, SQL upiti su se izvravali potpuno izolovana do drugih korisnika baze podataka, ali u mnogim aplikacijama to se u stvarnosti ne deava. Zamislite da imate bazu podataka o prometu na bankovnim Ako elite da prebacite 1.000 dinara s jednog na drugi, potrebna su vam najmanje dva SQL upita- jedan, koji na prvom smanjuje stanje za 1.000 dinara i drugi, koji stanje na drugom za 1.000 dinara. Bilo bi prava katastrofa kada bi se 128 Poglavlje 9 Tipovi tabela u My:;,uL-u zbog (na primer, prestanka napajanja) prvi upit izvrio do kraja, ali ne i drugi. U takvim bilo bi neuporedivo bolje da se izvre ili oba upita, ili nijedan, jer baza podataka mora uvek biti u stanju. Tabele koje podravaju transakcije da za date da je grupa upita nedeljiva jedinica obrade -transakcija. Trebalo bi da se cela transakcija obavi do kraja, a ako to nije baza podataka mora da je po11iti (engl. roll back), odnosno da se vrati u stanje u kojem je bila pre 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 tipovi tabela: ISAM MyiSAM InnoDB BerkeleyDB (BDB) MERGE HEAP Sve navedene tipove tabela ali najvie prostora posveti- upotrebljavanim tipovima: My ISAM i InnoDB. InnoDB i BerkeleyDB podravaju transakcije. Drugi (ISAM, My ISAM, MERGE i HEAP) to ne U ovom poglavlju i posebne koje pruaju My ISAM tabele, a to su komprimovane tabele i tekstualno pretraivanje. Celo poglavlje 1 O je posebnim maine za skladitenje InnoDB. ISAM tabele ISAM tabele su u MySQL samo radi podrke starijim aplikacijama. daje njihova funkcionalnost u potpunosti odrana MyiSAM tabelama, ih detaljno razmatrati. Planirano je da budu uklonjene iz 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 brz pristup podacima ali ne podravaju transakcije. deo onoga to o My ISAM tabelama vai i za ISAM tabele, pri za sta- rije ISAM tabele postoji vie IVIYIJMIVI . MyiSAM tabele su uvele poboljanja: Prenosivost tabela. Tabele smeten e na disk ili na druge medije mogu se prene ti na drugi na kojem radi MySQL, bez obzira na platformu. To ne vai za ISAM tabele. Podrka za veoma velike tabele. ISAM tabela je na 4 GB. MyiSAM da tabela bude velika onoliko koliko to dozvoljava ope- rativni sistem. da to biti vano samo nekim korisnicima, paljivo da odaberete operativni sistem (i sistem za rad s datotekama). Mnogi sistemi za rad s datotekama datoteka na najvie 2 GB. (Imajte u vidu da to moete ako upotrebite MERGE tabele.) Efikasnije prostora na disku. Manji su rascepkanost i praznine na disku. Manja ograni{enja klju{eva. ISAM tabele podravaju najvie 16 po tabeli, a podrazumevana maksimalna duina je 256 bajtova. My ISAM tabele podravaju 64 po tabeli, a podrazumevana maksimalna duina 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 uloiti je veoma mali, a prednosti su MyiSAM tabele Mnogi ljudi godinama koriste MySQL ne da moe da radi i s tabelama drugog tipa. Razlog je to to se taj tip tabela podrazumeva u svim novijim verzijama MySQL-a. My ISAM tabele veoma brz pristup podacima ali ne podravaju transakcije. One visoke performanse u mnogim situacijama, i kada projektant napravi greke, a u rukanu administratora mogu da podre i veoma obimne i/ili veoma baze podataka. Naredni kod formira MyiSAM tabelu: create table article ( } ; articleiD int not null auto_increment primary key, title varchar(255}, body text Nije obavezno, ali na kraj moete dodati red type=MyiSAM; i isti rezultat. MyiSAM tabele mogu biti jedne od tri vrste: ili kompri movane.Tabela automatski postaje ili u zavisnosti od definicija njenih kolona. Komprimovane tabele moete praviti samo alatke myisampack. IJU ruyodYIJC ::J IIJJUYI ldUCid U IYIY.>UL-U Tabele su redovi fiksne duine automatski se prave kao dok se tabele s redovima promenljive duine prave kao tabele. Po moemo utvrditi da li tabela ima redove fiksne ili promenljive Tip podataka char i svi tipovi su fiksne kolona tipa varchar, text i b lob menja se u zavisnosti od sadraja. Tabela su sve kolone tipa char ili tipa, ali tabela koja sadri barem jednu kolonu tipa varchar, text ili blob U odeljku "Tekstualno pretraivanje My ISAM tabela", tabel u koju nazvati article. To biti tabela zato to sadri kolonu tipa varchar i kolonu tipa text. Prostor na disku koji biti potreban za skladitenje svakog reda tabele od podataka u poljima tabele. tabela prua vie prednosti. Pretrauje se bre od ili komprimo- vane tabele. Baza podataka moe veoma lako zapis na osnovu indeksa kada se svaki zapis nalazi na pomaku od datoteke. Tabela se veoma lako smeta u ostavu (ke). Manja je verovatno nepovratnog podataka u ozbiljnog kvara sistema- alatka za popravku tabela uspeva da restaurira sve redove osim Nedostatak tabela jeste to to se pri umetaqju stvarnih podataka u kolone fiksne veli gotovo uvek rasipa prostor na disku. Tu cenu mogli biste da platite uko- liko se vaih podataka ne razlikuje previe. Na primer, to vai za imena i pre- zimena ljudi. cena vam moda biti previsoka ako se podaci veoma mnogo razlikuju po Ako smatrate da prezimena zaposlenih imati uvek maqje od 80 znakova, moda eleti da nepotrebno rasipate po 75 znakova svaki put kada se neko preziva ili Za tabele potrebno je sloenije upravljanje unutar samog MySQL-a. Posao keiranja, ili popravljaqja zapisa nije tako jednostavan za mainu za skladitenje. Razlog je to to je tabele promenljiva, ali i to to tabela postaje rascepkana (fragmentirana).Ako je zbog promene sadraja red postao deo podataka ostati na izvornom mestu, a deo biti smeten u novi blok unutar dato- teke. To da se ne moe garantovati da segment datoteke koji je operativni sistem u ke sadri sve delove reda. Osim toga, tabele moe biti tee popra- vljivo jer ako se izgube blokovi podataka ili veze njih, ne moe se lako utvrditi koji delovi kojim redovima pripadaju. Da biste popravili ili defragmentirali My ISAM tabelu, moete s komandne linije upotrebiti alatku myisamchk ili MySQL-ovu komandu REPAIR TABLE. (To je opir- nije objanjeno u poglavlju 13",Administriranje baze podataka") . Za defragmentiranje baze podataka, ali bez popravljanja, moete upotrebiti MySQL-ovu komandu OPTI- MIZE TABLE. (To je opirnije opisano u poglavlju 18",0ptimizovanje baze podataka".) IVIYI.li'IIVI liiUCIC KomprimovanjeMyiSAM tabela Iako tabele nastaju kao ili bez vaeg 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 za ISAM tabele, ukoliko ih koristite.) Mada se komprimovanje na prvi pogled korisno, trebalo bi da ga primenjujetc samo za neke aplikacije jer se komprimovane tabele mogu samo Ako treba da izmenite strukturu komprimovane tabele, ili da aurirate podatke u njoj, ili da joj dodate nove, morate da dekomprimujete celu tabelu, unesete izmenc i zatim ponovo komprimujete tabelu. Postupak komprimovanja koji obavlja alatka myisampack kombinacija pravog komprimovanja (Hafinanovim kodom) i vie optimizacija je cilj saimanje kolona, na primer, konverzijom tipova podataka u manje, i konverzijom sadraja kolona u nabrajanja. da se svaki zapis komprimuje zasebno, dekomprimovanje zapisa je relativno jednostavno. Na sporijim za skladiteqje podataka trajanje operacije dekomprimovanja moe biti i zanemarljivo u pare- s trajanjem podataka s diska. Tekstualno pretraivanje MyiSAM tabela Jedna od koju zasad pruaju samo My ISAM tabele jeste tekstualno pretra- ivanje i indeksiranje. Standardni indeksi su veoma efikasni kada u tabeli treba vrednost jednaku traenoj, ali se trae ili nizovi znakova unutar blokova tek- sta. U takvim tekstualno pretraivanje je korisnije. Naredna SQL komanda formira MyiSAM tabelu sa indeksom za tekstualno pretraivanje: create table article ( articleiD int not null auto increment primary key, title varchar(255), body text, fulltext (title,body) ) ; Naredni upit sve zapise koji sadre re 'merger : select title from article where match (title,body) against ('merger'); su i sloenija pretraivanja. Naredni upit zapise koji sadre bilo koju re iz skupa 'merge ', 'acquis i tion', 'acquire' ili 'take over'. select title from article where match (title,body) against ('merge acquisition acquire takeover'); l ..lL 1 ,,._,uv1 LdUCid u tvty..JuL.-u Obratite panju na to da zapise koji sadre barem jednu od navedenih U ovom ne traimo nizove znakova niti zapise koji sadre sve navedene modifikatora IN BOOLEAN MODE, koji objasniti u nastavku teksta, mogu se zadati obe vrste pretrage istovremeno. . , acquire' i acquis i tions' morali smo da navedemo odvojeno zato sto MySQL zasad jo ne podrava pretraivanje od korena (engl. stemming). pre- traivanja od korena postoji u mnogim drugim sistemima za tekstualno pretrazrvanJe. Ona da sistem prepoznaje da skup ima koren. Na primer, 'acquire' je koren drugih kao to su 'acquire s', 'acquired' 1 'acquisition'. Za svako otkriveno poklapanje se koeficijent povezanosti s traenim pojmom (engl. relevance value), a rezultati se automatski sortiraju po vred-. nosti tog koeficijenta. Ako elite, moete pogledati i koeficijente povezan os tr za svaki zapis. Naredni upit prikazuje nesortiranu listu koeficijenata za sve zapise. Svaki zapis koji ima koeficijent nula nije ni po povezan s traenim pojmom i zato se ne
select title, match (title,body) against ('merge acquisition acquire takeover') as relevance from article; Obratite panju na to da relevance nije rezervisana samo alijas za . match(title,body) against ('merge acquisition acquire smo je samo zato da bi rezultati bili lake Korisniji je upit, koji prikazuje naslove i koeficijente povezanosti dokumenata. da imamo uslov MATCH u odredbi WHERE, rezultati biti sorti- rani, a redovi koji se ne odnose na traeni pojam 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 koje se ne mogu traiti. Da bi se poboljale performanse, su iz indeksa ili se zanemaruju pri pretraivanju. Kratke se ne indeksiraju. Standardno se zanemaruju i sve koje sadre manje od slova. Na nekim instalacijama, kao to je Slashdot.org, to je ozbiljan problem, poto su troslovni akronimi vaan deo sadraja tekstova.To moete ako konfiguracionoj promenljivoj ft_min_word_len zadate drugaCIJU vrednost, ali onda morate ponovo generisati sve indekse. U indeksima za tekstualno pretraivanje moete zadati nebitne (engl. stop words). Nebitna je bez vrednosti. To su uglavnom koje su vane za sasta- vljanje ali za koje je malo verovatno da biti vane za sadraj teksta. MyiSAM tabele U engleskom jeziku, kao to su 'the', 'and', 'then' i 'soon' neophodne su, ali nisu korisni pojmovi za traenje. U MySQL-u postoje standardne liste takvih (za engleski j ezik) , a moete i sami sastaviti takve liste za tekstove na drugim govornim jezicima koje indeksirate. da je pretraivanje veoma sloen posao, vano je imati na umu da postoje ozbiljna u pogledu performansi . Kada MySQL-ove tabele postanu veoma velike (npr. preko 1.000.000 redova), performanse pretraivanja osetno se pogoravaju. U manjim aplikacijama to ne bi da pred- stavlja problem, imajte tu na umu kada pravite sloenije aplikacije. koje su podacima ne koriste se pri pretraivanju.Ako vaa tabela sadri tekstove objavljene u biltenu vae kompanije Acme PTY Ltd., verovatno nmogi tekstovi u zaglavlju sadrati 'Acme'. Pretraga po toj verovatno gene- risati mnogobrojne rezultate, koji ipak biti upotrebljivi. Ako 50% ili vie zapisa sadri smatra se da ta nema vrednosti za koeficijenta povezanosti. tekstualno pretraivanje Pri pretraivanju moete imati stepen kontrole ako upotrebite modifikator IN BOOLEAN MODE. Naredni upit tati samo zapise koji sadre 'linux' i izraz "Open source", ali ne i 'desktop'. 'Java' i 'Oracle' nisu obavezne, ali kada se koeficijent povezanosti, 'Java' rang zapisa, a 'oracle' smanjuje rang zapisa. Redosled traenih 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 pretraivaqje
( ) ll ll Ova je obavezna. Ova ne treba da se pojavi u rezultatima. Ova je manje vana. Ova je vanija. Grupie u podizraz. Ova se moe pojaviti u rezultatima ali smanjuje rang zapisa. Dokerski sufiks. Na primer, merge i merger, ali merge* i merge i merger. Moe se upotrebiti samo na kraju za prctragu. vo je izraz. Pronalazi samo sadraj, u istom redosledu. -------------------- 134 Poglavlje 9 Tipovi tabela u MySQL-u Za pretraivanje nije neophodno da postoje indeksi za tekstualno pretrai- vanje. Tako se mogu pretrai vati i neindeksirane tabele, ali je postupak s Jo jedna mala razlika tekstualnog pretraivanja i jeste to to se pri pretraivanju zanemaruju koje se poJaVlJUJU podacima. U tom ne vai pravilo 50%. Ako pretraujemo tekstove obJaVlJene u biltenu kompanije Acme PTY Ltd., naredni upit bi verovatno 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 razmotriti InnoDB tabele. InnoDB je maina za skladitenje koja je brza i podrava transakcije. Njene transakcione obrade su toliko vane da njihovoj primeni posvetiti celo naredno poglavlje. InnoDB table Transakcionu obradu.Videti poglavlje 10. Zakiju{avanje podataka na nivou reda. To da samo red koji se trenutno obra- u nekom upitu nije na raspolaganju drugim drug1h . maina za skladitenje (osim BDB-a) primenjuje podataka na mvou cele tabele, tj. kada jedan proces aurira jedan red tabele, cela tabela nije dostupna drugim procesima. Upotrebu spoljnih kiju{eva. Primeri iz prethodnih poglavlja u kojima se koriste spoljni 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 skla- ditenja podataka. Dok My ISAM smeta svaku tabelu u zasebnu datoteku, InnoDB smeta sve tabele i indekse u tabelarni prostor, to da se delovi jedne tabele mogu nalaziti u vie datoteka. tome, InnoDB moe raditi s veoma obimnim tabelama za ne vae koja operativni sistem. imajte u vidu da u s MyiSAM tabelama,jedna InnoDB tabela zauz1ma znatno vie prostora na disku za skladitenje istih zapisa. . . . , . Celo naredno poglavlje, 10, je upotrebi ovih speclJalmh mogucnost1 JnnoDB-a. Podeavanje InnoDB-a zahteva napor. Osnovnu opisali u poglavlju 1, "Instaliranje MySQL-a", a konfiguracione opclje razmatracemo opslr- nijl! u poglavlju 12",Podeavanje MySQL-a" . BerkeleyDB (BDB) tabele Iako je razvijen odvojeno od dela MySQL-a, InnoDB se moe koristiti pod jednakim uslovima dve vrste licence. Mnoge opsene i veoma Web lokacije koje koriste MySQL, kao to su Slashdot (www. slashdot. org), Google (www. google. com) i Yahoo! Finance (http: l l finance. yahoo. com), koriste mainu InnoDB. je pogodna za obradu velikih podataka, velikom brzinom i u okruenju koje podrava transakcije. InnoDB je jedan od najbrih sistema na svetu koji podrava transakcije, ali po cenu izvesnih rtava. Pri upotreba, My ISAM biti bri, ali razlika biti tako InnoDB proizvodi kompanija InnoBase Oy, koja ima vlastitu Web lokaciju. Najno- vije informacije o InnoDB-u na www. innodb. com. BerkeleyDB (BDB) tabel e Druga koju imate kada za MySQL birate mainu za skladitenje koja podr- ava transakcije jeste BerkeleyDB se na BDB). BDB se moe nabaviti od kompanije Sleepycat software (www. sleepycat. com) . Ova maina se koristi za trans- akcionu obradu u MySQL-u nego InnoDB. Mada je BDB maina due vreme na tritu, integracija s MySQL-omje relativno novijeg datuma, a u MySQL-ovoj dokumentaciji stoji da je kvalitet s MySQL-om nivoa "gama". To da j e pouzdanost bolja od verzije beta, ali postoje 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 podataka na nivou stranice, usled su perfor- manse neznatno slabije od InnoDB-a. Postaje spor i kada istovremeno otvorite broj tabela. Sve BDB tabele moraju imati primarni (to i nije neki problem, poto se to ionako U stvari, primarni automatski biti napravljen ako ga sami ne zadate. BDB tabele se u bazi podataka u obliku b-stabala (engl. b-trees) . Uporedite to s drugim tipovima tabela za koje se indeksi u obliku b-stabala. Posledica je sporije sekvencijalno redova tabele (to se primenjuje, npr. kada bezuslovno sve redove tabele ili izvravate upite u kojima su indeksi neupotrebljivi). Osim toga, BDB tabele zauzimaju vie mesta na disku. Vano BDB tabela jeste to da ne moete po meri ti podatke na drugo mesto na disku. Razlog je to to se zajedno s podacima tabele skladiti 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 da pokrenete bazu podataka. Poglavlje 9 Tipovi tabela u MySQL-u MERGE tabele MERGE tabele predstavljaju vet zaobilaenja maksimalne datoteka koja operativni sistem. Poto se svaka MyiSAM tabela smeta u zasebnu datoteku, tabele je na maksimalnu datoteke koju operativni sistem dozvoljava. To se moe MERGE tabele,j:r one da se u upitima vie My ISAM tabela kao Jedna log1cka tabela. Pogledajmo primer. Listing 9 .l sadri 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, i log2003Mar. MERGE tabele se primenjuju za beleenje promena, k.10 to 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 IVICn\JC taUt'll" osobine: ima istu strukturu kao tri tabele koje grupisati, njen tip je MERGE, a sadraj je unija (UNION) sadraja sve tri tabele. Osim toga, zadali smo last (poslednja) kao vrednost opcije INSERT_ METHOD. To da nov red koji unesemo u ovu MERGE tabel u biti smeten u poslednju tabelu u grupi, u ovom log2003Mar. Ostale su FIRST (podaci se u prvu tabelu u grupi) ili NO (umetanje novog reda nije dozvoljeno u MERGE tabelu). Tako smo formirali tabelu s kojom moemo da radimo na i koja prividno sadri sve podatke iz svih tabela u grupi. Ako izvrimo upit select * from logs; 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 vano da zapamtite da, iako smo zadali da je kolona log id primarni MERGE tabele, mehanizam radi malo od na koji rade primarni Njihove vrednosti moraju biti jedinstvene, ali poto MERGE tabela upravlja istovremeno s tri skupa primarnih nipoto nije da postoji vie od jednog reda koji sadre istu vrednost primarnog kao to je prikazano u rezultatima navedenog upita. i kad su tabele koje njene komponente grupisane u MERGE tabel u, nad njima i dalje moemo izvravati upite na komande DROP, ALTER, DELETE FROM TABLE, REPAIR, TRUNCATE, OPTIMIZE i ANALYZE ne mogu se vie izvriti ni nad jednom tabelom u grupi. Neke od tih komandi (DELETE FROM TABLE) ipak moete izvriti ukoliko MERGE tabela trenutno nije otvorena. Moete je zatvoriti komande FLUSH TABLES. U MySQL-ovoj dokumentaciji stoji da nakon komande FLUSH moete izvriti i bilo koju od navedenih komandi, ali mi smo ustanovili da to nije uvek sasvim Na primer, u vreme pisanja ove knjige, ako se komande DROP izbrie jedna od tabela u grupi, automatski se brie i sama MERGE tabela. Ako je potrebno da neku od navedenih komandi izvrite nad jednom od tabela u grupi, najbolje je da prethodno izbriete MERGE tabel u i da je zatim ponovo napra- vite. Brisanje MERGE tabele ni na koji ne na njene komponente niti na podatke u njima. Tabele koje MERGE tabelu moete komprimovati alatke myisam- pack. To je korisno u kao to je na primer u kojem skladitima datoteke dnevnika promena -jer se datoteke iz ranijih meseci mogu ko mp rimovati da se novi podaci upisuju samo u poslednju datoteku. l ' 138 Poglavlje 9 Tipovi tabela u MySOL-u HEAP tabele HEAP tabele su izuzetno brze i cele se u memoriji. Brzina se postie zahvalju- upotrebi heiranih indeksa. Nedostatak cele tabele u memoriji jeste, naravno, to da u problema s napajanjem podaci iz HEAP tabele nestaju zauvek. tabele tog tipa su savrene za privremenih podataka. Tabelu tipa HEAP moete napraviti na 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 pravilo maksimalnog broja redova u tabeli. Ako vaa HEAP tabela previe naraste, lako se moe dogoditi da vam ponestane memorije. Maksimalan broj redova u HEAP tabeli moe se zadati u konfiguracionoj opciji max_heap_table_size. HEAP tabele imaju Nisu podrane kolone tipa AUTO_ INCREMENT. Nisu podrani tipovi podataka BLOB i TEXT . U HEAP tabelama ne mogu se traiti redovi na osnovu dela indeksa. (Ako ne znate ta ovo vie informacija o indeksiranju u poglavlju 19.) Indeksi se mogu koristiti pri pretraivanju redova tabele samo u upitima koji u uslovima za pretragu sadre operatore = ili <=>. Saetak MySQL podrava est tipova tabela: ISAM, My ISAM, InnoDB, BDB, MERGE i HEAP. Samo tabele tipa InnoDB i BDB podravaju transakcije. Samo MyiSAM tabele podravaju tekstualno pretraivanje i indeksiranje. ISAM ISAM je zastareli tip tabela, zamenjen tipom My ISAM. ISAM tabele imaju od najvie 4 GB. ISAM tabele nisu prenosive dva sistema. Jedna tabela moe imati najvie 16 a svaki moe sadrati 256 bajtova (znakova). .Jdl.l:ldl\ MyiSAM My ISAM je podrazumevani tip tabele. Veoma je brz, ali ne podrava transakcije. MyiSAM podrava komprimovanje tabela. tabela je na maksimum koji dozvoljava operativni s1stem, al1 se to moe MERGE tabela. Datoteke u koje su smetene My ISAM tabele prenosive su ope- rativnih sistema. Jedna tabela moe imati najvie 64 a svaki moe sadrati najvie 1024 bajta. lnnoDB InnoDB tabele podravaju transakcije. InnoDB podravaju na nivou redova. Ne postoji teorijska gornja granica tabele jer jedna tabela moe biti smetena u vie datoteka. InnoDB dosledno redova bez u komandama SELECT. InnoDB tabele su prenosive operativnih sistema. InnoDB tabele zauzimaju vie prostora na disku od MyiSAM tabela. InnoDB tabele podravaju spoljne . BDB Kao i InnoDB tabele, BDB tabele podravaju transakcije. BDB tabele se koriste u MySQL-u od InnoDB tabela . BDB podrava podataka na nivou stranice. BDB tabele nisu prenosive. MERGE MERGE tabele da se vie My ISAM tabela tretira kao jedna tabela, se zaobilazi problem dozvoljene MyiSAM tabela . HEAP se u celini u memoriji i njihova se mora da b1 se Izbegla prevelika potronja memorije . u HEAP tabelu nisu trajni i gube se u prestanka napa- JanJa racunara . HEAP tabele su superbrze, pod uslovom da imate dovoljno memorije u koju ih smestiti. I lEA l' tabele ne podravaju kolone tipa AUTO_INCREMENT, TEXT i BLOB. 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 pretraivanje. 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 pretraivanje. Za tu namenu pogodne su tabele tipa a) MyiSAM b) InnoDB e) BDB d) HEAP S. Pogledajte upit za tekstualno select title from article where match (title,body) against ('+php +pdf pdflib >tutorial -reference' IN BOOLEAN MODE); Koja od tvrdnji o ovom upitu nije a) Teina traene 'tutorial' je b) Rang rezultata koji sadre 'reference' e) Rezultati pretrage moraju sadrati re 'ph p' . d) Rezultati pretrage koji sadre re 'pdfl ib' rangirani vie od onih koji je ne sadre. u poglaVlJU Vebe Za ovo poglavlje nema formalnih vebi, ali bi bilo korisno da vebate 1 upotrebu tabela pojedinih tipova. Odgovori Pitanja 1. e 2. d 3. a 4. a 5. b U poglavlju U sled poglavlju, "Upotreba transakcija u Inn oD B tabelama", ta pojam transakcija, zbog su transakcije tako vane i kako se one pri- menJUJU u InnoDB tabelama. 10 Upotreba transakcija u lnnoDB tabelama u OVOM POGLAVLJU SE transakcijama u MySQL-u. U pri- merima tip tabela InnoDB, ali gotovo sve to bude podjed- nako i za Berkeley DB tabele. teme: ta je transakcija Upotreba transakcija u MySQL-u InnoDB-ov model transakcije i 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 kao nedeljiva celina. Drugim sve to treba da bude u trans- akciji mora se uraditi u celini, ili ne sme nita uraditi. Ovaj koncept je poznat kao nedelji vost (engl. atomicity). Kae se da je transakcija atom obrade jer se ne moe razbiti na manje delove - se u celini ili se uopte ne Ovaj koncept ima vane posledice kada se razmatra pristup podacima u okruenju s vie korisnika, procesa i niti izvravanja (engl. threads) istovremeno, a vaan je i za obna- vljanje podataka nakon kvara. Savremenim pristupa vie korisnika istovremeno. Na njihovim je aktivno vie programa u isto vreme, a koriste i programe kao to je softver za Web server koji formiraju vie istovreme- nih procesa ili niti izvravanja. Svakom od tih korisnika, programa, procesa ili niti izvravanja moe biti neophodan pristup serveru baze podataka. Vie niti izvravanja ne smeju uticati jedna na drugu kada rade istovremeno. Ako do greke, pri obnavljanju podataka baza podataka mora zavriti otvorene trans- akcije. To da se baza podataka mora vratiti u stanje u kojem je bila pre Poglavlje 10 Upotreba transakcija u lnnoDB tabelama transakcije, ili mora da izvri celu transakciju do kraja. Uglavnom je bolje izgubiti celu transakciju koja se sastoji od povezanih izmena nego u stanje deli- unetih izmena rezultat moe biti sadraja baze podataka. Ovaj koncept se moe izraziti formalno, ali je verovatno najbolje da na primeru shvatite o se radi. Recimo da imate vrlo jednostavnu (ali potencijalno veoma vanu) bazu podataka u kojoj se podaci o prometu na bankovnim nima. Za svaki postoje barem podaci o identifikatoru i stanju. Tabelu bankovnih accounts, moemo napraviti sa strukturom: create table account number int not null auto increment primary key, balance float type = InnoDB; Verovatno vas iznenaditi na koji otvoriti tri nova upita: insert into account (balance) values (O. O); insert into account (balance) values (1000.0); insert into account (balance) values (2000.0); Poto dosad nita nije moglo da krene ba naopako, trebalo bi da rezultati budu sle- podaci: +--------+---------+ l number l balance l + ------- +---------+ l l l l l 2 l 3 l o l 1000 l 2000 l +--------+---------+ Ako nita unapred ne u vezi s brojevima koji se generiu u koloni tipa auto-increment, nevaan je redosled kojim izvriti ove upite. Sasvim je nebitno da li ih izvriti istovremeno s tri interaktivna klijentska i ne moete znati koji upit biti izvren prvi. To nije kada se izvravaju sloeniji upiti ili grupe upita. Pogledajte naredne dve komande koje SOO dolara na broj 2: # najpre stanje na 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 povezana i moraju se izvriti zajedno. Ako klijentski programi s drugih mogu da izmene stanje na ovom nae pro- vere stanja i naeg stanja, moe se dogoditi da ne dobijemo rezultate koje SiliO ..JI.d j\. ll dllltU\l.ljtll Ukoliko dva klijentska programa izvravaju parove ovakvih upita istovremeno, rezultati zavisiti od toga koji se u kom trenutku izvrio. Ako smo ovih upita pokuali da upiemo uplatu od 500 dolara, a drugi klijentski program je naredna dva upita pokuao da uplati 1 OO dolara, stanje moe biti 11 OO dolara ili 1500 -a nijedno od toga biti rezultat. # najpre stanje na 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 problem moe lako reiti. Ako izmene zadamo kao relativne a ne kao apsolutne, nedeljive jedinice i reili smo problem. Naredni upit davati ispravne rezultate, bez obzira na to da li se u isto vreme izvravaju i drugi upiti: update account set balance = balance + SOO where number = 2; U MySQL-u je jedna komanda update uvek nedeljiva. Ne moe je prekinuti druga komanda, niti se moe izvriti samo se cela, ili u greke cela biti ponitena. Sloeniji su malo tee shvatljivi . Pogledajte naredni par upita je svrha prenoenje iznosa od 1000 dolara sa 2 na l: update account set balance = balance - 1000 where number = 2; update account set balance = balance + 1000 where number = l; Oba upita unose izmenu u relativnom obliku, ali je vano da se oba upita izvre da bismo dobili smislene rezultate. Trebalo bi da nakon izvravanja upita iznos novca u sistemu bude isti kao pre izvravanja upita. Novac treba da bude s jednog na drugi, a ne da se samo pojavi na jednom ili nestane s drugog. Ako do prekida napajanja izvravanja prvog i drugog upita, podaci vie biti
U jednostavnim problem se moe tako to se oba upita zdrue u jednu SQL komandu. U ovom prim eru moemo napisati upit: update account as source, account as dest set source.balance = source.balance - 1000, dest.balance = dest.balance + 1000 where source.number = 2 and dest.number = l; Poto smo upotrebili dva alijasa (source i dest) za istu tabelu, account, obezbedili smo da izmena postane nedeljiva i da se u potpunosti izvri ili da se uopte ne izvri. Ne moramo da brinemo da li server prestati da radi tokom izvravanja nekog dela operacije koju smo zahtevali. U ovom "stradala" je jedino razumljivost upita. Ovako kombinovan upit je slabije razumljiv i tee se otkrivaju greke nego u prvoj verziji koju smo naveli. ruyldVIjt: lU UJJUllt:Ud U IIIIIUUD l.dU'Cidllld U mnogim biti zdrui vanje svih povezanih upita u jedan kao u navedenom primeru.Jedino reenje u takvim ukoliko elite razu- mljiv kod, jeste da koristite MySQL-ovu sintaksu za transakcije. Ako grupu komandi kao transakciju, time obavetava te bazu podataka da je to povezan i nedeljiv skup, koji se mora obraditi kao nedeljiva jedinica; moraju se izvriti ili sve komande u skupu ili nijedna od njih. Pomenuta dva upita moete izvriti kao jednu transakciju 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 ' Vana osobina transakcija jeste da nisu vidljive u drugim sesijama dok ne budu zavrene i (tj. izmene unete u bazu podataka). Nijedna druga nit izvravanja (proces) ne moe da podatke iz tabele ili tabela dok se ne zavri postupak auriranja koji ste Druga prednost transakcija jeste to da se izvrene transakcije mogu ponititi. Ako transakciju ponitimo pre nego to je potvrdimo (engl. commit), sve izmene koje su upiti koji transakciju ponitene. U naem primeru prenoenja novca na drugi ako dodamo komandu SELECT da bismo proverili da ne skidamo vie novca sa izvornog nego to ga ima na njemu, moemo upotrebiti rezervisanu ROLLBACK ukoliko elimo da ponitimo r clu 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 lect balance from account where number = 2; ll select kae da je stanje na broj 2 negativno! ll bolj e da ponitimo promenu rollback; Komanda ROLLBACK prekida transakciju i ponitava sve izmene od transakcij e. Transakcija koja je bila ponitena umesto da bude ne ostavlja nikakav trag na podacima. da rezultati nisu bili vidljivi iz drugih lt .msa kcija, stanje baze podataka isto je kao da transakcija nije ni bila Upotreba transakcija u MySOL-u l >.t bi ste mogli da koristite transakcije kako je opisano u prethodnom odeljku, morate upotrebiti tip tabela koji podrava transakcije- to moe biti InnoDB ili BDB. Postoje sintakse koje daju isti rezultat. Sintaksa START TRANSACTION je sinonim za BEGIN ili BEGIN WORK. Moda kori stiti jedan od ovih oblika da bi va kod ostao kompatibilan s drugom bazom poda- l ;tka koju imate, ali uglavnom se sintaksa START TRANSACTION, da Jl' propisana standardom SQL- 99. UjJUllt:Ui:l u IVIY;)UL- U Podeavanje automatskog transakcije U MySQL-uje standardno automatsko transakcija (reim rada autocommit). Svaki upit koji pokrenete, automatski se izvrava u okviru vlastite transakcije. Moete zamisliti da se sve odvija kao da ste zadali komande START TRANSACTION i COMMIT ispred i iza svakog upita koji pokrenete. Par jednostavnih upita kao to su update account set balance = balance - 1000 where number update account set balance = balance + 1000 where number izvrava se kao da su bili napisani u ovom obliku: s tart transaction; update account set balance commit; s tart transaction; update account set balance commit; Ukoliko upiete s tart transaction; balance - 1000 where number balance + 1000 where number nita se dogoditi dok ne upiete i commit; 2 ' l ' 2; l ' Automatsko transakcija moete komande SET na
set autocommit=O; Kao to biste i sami komanda MySQL u reim autocommit: set autocommit=l; Poto je promenljiva autocommi t lokalna za sesiju, izmena reima rada vai samo za upite koje sesija, dok je ta sesija aktivna. Ako automatsko transakcija, nije potrebno zadati komandu START TRANSACTION da biste transakciju. Nipoto ne zaboravite da povremeno izdate komandu COMMIT da biste izmene koje ste trajno preneli u bazu podataka. Bez obzira na to da li je reim autocommit ili u slu- se izmene koje automatski (i prenose u bazu).Ako koristite tip tabela koji ne podrava transakcije, kao to je My ISAM, sve izmene koje odmah se u bazu, bez obzira na vrednost promenljive autocommit. Slobo- dno moete grupisati komande komandi START TRANSACTION i COMMIT, ali to imati nikakvog uticaja ako tabela ne podrava transakcije. Moete upotrebiti i komandu ROLLBACK. Time izazvati greku, ali u tabeli koja ne podrava trans- akcije, ta komanda prosto imati nikakvog efekta ni na ta to ste izmenili.To moe biti korisno kada testirate kod ili kada iz datoteke slike stanja te podatke na server koji radi s drugim tipom tabela. l ruyldVIJt: lU UfJUllt:Ud U IIIIIUUD ldUt:ldllld U tabelama koje podravaju transakcije, postoje akcije (osim izdavanja komande COMMIT) koje automatski pokrenuti komandu COMMIT. Ako zahtevate podataka, time implicitno potvrditi sve upite. podataka Druga da iskoristite deo prednosti transakcija jeste da i tabele. Ako zaista elimo da primer koda za deponovanje novca na bankovni 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 pokuava da sve tabele koje navedete da bi nit izvrenja mogla da radi s njima bez ometanja. Komanda UNLOCK TABLES sve blokade koje je nit postavila. Postupak deblokade tabela vrlo je jednostavan. Ukoliko ste tabel u, imajte u vidu da je morate to pre osloboditi da biste to manje ometali druge niti. tabela je sloenije pitanje. Sve tabele koje vam trebaju morate istom komandom. U prethodnom prim eru zahteva se samo jedne tabele, ali ako nameravate da pristupate grupi tabela istovremeno, ili alijasima iste tabele, morate ih sve navesti u istoj komandi, na primer: lock tables account write, account as a read, othertable low_priority write; Poto komanda LOCK TABLES sve blokade koje ste pre nje postavili, ako pokuate da grupiete blokade koje su vam potrebne za vie komandi, sve prethodne blokade ukinute a blokada vaiti samo za poslednju komandu u grupi. Postoje dve vrste blokada: za i za pisanje. Ako vam je potreban pristup tabeli radi upisivanja podataka i ne moete dozvoliti da druge niti pristupaju tabeli u isto vreme kad i vi, blokada za pisanje da bilo koja druga nit tabelu ili pie u nju dok vi ne oslobodite tabelu. Ukoliko nameravate samo da tabelu, nema nik:lkvc tete ako dozvolite da i druge niti tabelu u isto vreme. Blokada za sprcbva druge niti da piu u tabel u samo dok je vaa nit blokira. nlokada za pisanje moe se zadati sa opcijom low_priority (nizak prioritet). U sva- kon! sistemu koji blokiranje tabela, i MySQL, neophodna su pr.1v1Ll koja ko u sukobljenih zahteva prvi da postavi blokadu. MySQL daje prioritet zahtevima za blokade radi pisanja da bi da mncnc uskladitenih podataka budu obavljene to pre. Ako vam takvo ponaanje ne odgov:mt, moete zahtevati blokadu za pisanje niskog prioriteta kao to smo uradili "' tabel u othertable u prethodnom primeru. postoji Kad god :t.illtcvatc blokadu tabele, moe se dogoditi da morate da ona bude odobrena. moae1 1nn on Blokada niskog prioriteta odobrena samo ako nema nijedne druge niti koja je zahtevala blokadu za ili pisanje u toj tabeli. ako je server veoma opte- takva situacija se moda nikad dogoditi. Verovatno upravljati blokadama na ovakav ali postoje izvesni razlozi zbog kojih biste to ipak Ako imate aplikaciju koja treba da obez- bedi veoma visoke performanse a transakciona obrada joj je potrebna samo u redim slu- moe biti isplativije da koristite brze tabele koje ne podravaju transakcije i da postavljate blokade da biste reili problem transakcione obrade. Jo jedan u kojem izdavati komande LOCK TABLES jeste kada direktno manipuliete MySQL-ovim datotekama s podacima. Na primer, ako elite da obezbedite da sadraj datoteka na disku ostane i nepromenjen dok pravite njihove rezervne kopije, morate te datoteke. Najvanije to treba da zapamtite u vezi sa podataka jeste da morate to pre ukinuti sve blokade koje ste postavili drugi sistemi i korisnici morati da vas Imajte u vidu da neki poslovi za obavljanje postavljati blokade, kao to su indeksiranje ili izrada rezervne kopije velike datoteke, mogu potrajati pri- dugo. Transakcioni model lnnoDB Svi transakcioni sistemi za upravljanje bazama podataka nastoje da postignu manje-vie iste ciljeve ali uz primenu pristupa problemu. Da bi izolovao transakcije jedne od drugih, InnoDB primenjuje podataka na nivou reda tabele. To da se transakcije mogu odvijati nad sadrajem iste tabele u isto vreme, pod uslovom da samo tabelu ili da ne menjaju iste redove kada upisuju podatke. izmene da druge niti pristupaju samo redovima na koje deluje transakcija, ali ne i celoj tabeli. toj osobini, InnoDB obezbe- visoke performanse uz prednosti koje biste od jednog savremenog sistema za upravljanje bazama podataka.Jedna od tih prednosti jeste s gru- pom pravila ACID. sa ACID pravilima Vaan pojam iz terminologije baza podataka koji jo nismo definisali jeste ACID. To je akronim od engleskih Atomicity, Consistency, Isolation i Durability (nedeljivost, izolovanost i trajnost). Mnogima smeta da pri MyiSAM tabela",MySQL pada na ACID ispitu". Kada se koriste InnoDB tabele, MySQL je sa ACID pravilima. Atomicity (nedeljivost) da je svaka transakcija nedeljiva celina. U bazu poda- taka moraju se uneti sve izmene koje transakcija zahteva, ili nijedna od njih. U spoljne greke, jasno je da bi bilo savreno kada bi postupak obnavljanja baze podataka bio u stanju da dovri sve transakcije koje su bile u trenutku greke; tim, prihvatljivo je i da te transakcije budu ponitene. Poglavlje 10 Upotreba transakcija u lnnoDB tabelama Consistency da svaka operacija nad podacima treba da prebaci bazu podataka iz jednog ispravnog stanja u drugo ispravno stanje. sme biti stanja" u kojima podaci nisu potpuno Osim toga, trebalo b1 da baza pvodataka operacije koje naruavaju podataka. Ako u baz1 podataka :u vate bankovne koji pripadaju klijentima banke, ne b1 trebalo da bude moguce da neko otvori koji pripada klijentu, niti bi trebalo dozvoliti brisanje klijenta iz tabele klijenata ukoliko u tabeli ima koji mu pripadaju .... Isolation (izolovanost) da transakcije ne deluju jedna na drugu dok se odviJaJU. Svaka transakcija vidi svet oko sebe kao da je jedina koja i menja nosti to nije uvek tako, ali se blokada moe takav priv1d. U zav1snost1 od podeenosti baze podataka i opcija koje upotrebite, u praksi imati raz- nivoe izolovanosti. (Opirnije objanjenje u odeljku.) Durability (trajnost) da izmene koje je transakcija a su bazi podataka, treba da postanu trajne. Ovaj uslov se moe lako ispuniti u programu, ali u sloenom sistemu za upravljanje relacionim bazama podataka, kojl podatke i odrava vie verzija istih podataka u isto vreme, problem se pret- vara u pravo "minsko polje". Osim toga, trajnost i to da bi u kvara trebalo da postoji povratka baze podataka u stanje. Ako se napa- janja, kvar diska ili druga katastrofa dogodi trenutka u kojem klljentski pro- gram poslao transakciju i trenutka upisivanja izmena na d1sk, trebalo b1 da postOJI da se, kombinacije rezervnih baze 1 . transakcija, baza podataka vrati u stanje pre kvara, pa cak 1 da se dovrse transakciJe koje su bile ali ne i Ako koristite Inn oD B tabele (ili Berkeley DB tabele), MySQL je sa ACID pravilima. Nedeljivost je upotrebom za Transakcije i spoljni podataka. Mozete mvo 1Zolovanost1 transakcija jedne od druge. Binarni dnevnik i alatke za popravlpnJe podataka trajnost izmena. (Replikovanje izgradnju sistema s vrlo v1sokun stepenom trajnosti bez ijedne Izolovanost transakcija InnoDB tabele mogu da se rade s nivoa izolovanosti transakcija. Redosledom od ka najslabijem, to su Serializable (transakcije se serijalizuju) Repeatable read (podaci su ponovljivi pri svakom Read committed (dozvoljava se podataka iz transakcija) Read uncommitted (dozvoljava se podataka iz transakcija) Kao i u mnogim drugim morate napraviti kompromis robu- snesti i performansi. l ransakciOni model lnnoDB Nivo izolovan osti serializable je savren gledano iz ugla i robusnosti S podataka i njihove izmene odvijaju se pnv1dno u mzu, pn cemu se svaka 1zmena cela upisuje u bazu podataka pre nego to dozvoljeno istog podatka. Transakcije ne moraju da se uvek ?dVIJaJU bez 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 biti serijalizovane. Poto u tom mora do podataka i na njih, kombinovano s obavezom ispitivanja i pred- koje se transakcije rezultat je to da je nivo izo- lovanosti serializable naj sporiji transakcione obrade. Ako elite da radite s tim nivoom izolovan osti, komanda je set transaction isolation level serializable; Podrazumevani nivo za InnoDB je repeatable read. Pri tom nivou izolovanosti svaka transakcija radi sa zasebnom verzijom tabele u kojoj svaki red ima isti sadraj k;o na transakcije. Garantuje se da je reda ponovljivo, tj. da se iz istog reda svaki put isti podaci. Ako na transakcije pozovete sel ect * from account where number=l; a zatim isti upit ponovo izvrite kasnije u transakciji, oba puta isti rezultat. moete dobiti i ono to se zove jm1tomski podaci (engl. phantom reads). Moe se dogoditi da druga transakcija koja se zavri pre vae doda nove redove u tabelu.Ako dvaput izvrite isti upit koji sadri uslov, kao select * from account where balance>lOOO; moe se dogoditi da pri drugom dobijete nove redove - fantomske redove - kojih nije bilo prvi put. Trebalo bi da u praksi vrlo retko na fantomske podatke u MySQL-u. lnnoDB reava problem algoritma nazvanog blokiranje (engl. 11ext key lock ing) , pod uslovom da je kolona za koju ste zadali uslov u upitu indeksirana. Verovatno znate da InnoDB primenjuje podataka na nivou redova. se transakcija odnosi na red tabele, taj red se da bi transakcija bila Izolovana od drugih. Osim redova na koje se transakcija odnosi, ,tl goritam blokiranja blokira i razmake redova koje u tndeksu. Poto se problem fantomskih podataka reava na taj nivo izolovanosti wrializ able da koristite samo u malom broju sistema . _Kada na serveru podesite nivo izolovanosti read committed, transakcije zapravo vie nece b1t1 Ako izvrite neki upit, a zatim ga kasnije u transakciji pono- VIte, dob1cete razhc1te rezultate ukoliko je druga transakcija u izmenila podatke i prenela izmene u bazu. Ako vam ba to odgovara, komanda je Hl'L transaction isolation level read committed; 2 Poglavlje 1 O Upotreba transakCIJa u lnnouts taoe1ama Pri najnieg nivoa izolovanosti, read uncommitted,javljaju se dva pitanja- da li su transakcije izolovane i pa prema tome, ne kre ACID pravila, i da li se uopte moe o transakcijama. U ovom reimu rada, transakcije mogu da izmene koje su druge transakcije a da te izmene jo nisu (prenete u bazu podataka). To se zove prljavih podataka (engl. dirty reads) i moe sc prihvatiti samo u zaista posebnim okolnostima, npr. kada znate da sve aktivne niti samo ili samo upisivati podatke, ali ne i jedno i drugo. Da biste podesili nivo read uncommitted, upotrebite 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 Read Committed Nisu Repeatable Read Nisu Serializable Nisu Saetak Neponovljivi podaci
Nisu Nsu Fantomski podaci
(ali malo verovatni) Nisu Transakcija je grupa SQL upita koja se kao nedeljiva celina. Izvrava se u potpunosti ili se ponitava u potpunosti. Standardna SQL-ova sintaksa za transakcije izgleda ovako start transaction; # do work commit; ali postoji i vie drugih ekvivalentnih da se postigne isti rezultat. ACID je akronim za Atornicity, Consistency, Isolation i Durability (nedeljivost, izolovanost i trajnost). Trebalo bi da zapamtite ta ove drugi za hteti da razgovaraju s vama. Redosledom od ka najslabijem, nivoi izolovanosti transakcija su serializable, repeatable read, read committed i read uncommitted. Podrazumevani nivo u Inn o DB tabelama je repeatable read. Pitanja l. Ako je reim autocommit transakcija biti a) kada se izda komanda COMMIT b) kada se zahteva blokada tabele e) i a) i b) d) ni u jednom od navedenih 2. Nedeljivost transakcije a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava b) operacije prebacuju bazu podataka iz jednog stanja u drugo e) transakcije ne jedna na drugu d) izmene koje su transakcije treba da ostanu trajne 3. Izolovanost transakcije a) se izvravaju sve operacije koje transakcija zahteva ili se nijedna ne izvrava b) operacije prebacuju bazu podataka iz jednog stanja u drugo e) transakcije ne jedna na drugu d) izmene koje su transakcije treba da ostanu trajne 4. Trajnost transakcije a) izvravaju se sve operacije koje transakcija zahteva ili se nijedna ne izvrava b) operacije prebacuju bazu podataka iz jednog stanja u drugo e) transakcije ne jedna na drugu d) izmene koje su transakcije treba da ostanu trajne 5. U reimu ponovljivog moe se dogoditi da Vebe a) prljave podatke b) neponovljive podatke e) fantomske podatke d) nijedno od prethodnog Dokumentacija za MySQL/InnoDB sadri mnogo saveta za poboljanje performansi sistema kada se koriste InnoDB tabele. Primenite to broj na svoj sistem. Moete od ovog mesta: www.innodb.com/ibman.html#InnoDBTuning Na serveru koji nije previe vaan za poslovanje firme, sruite MySQL dok ste usred neke transakcije. Nije neophodno da gurnete diskova s velike visine, niti da kabi za napajanje iz Dovoljno je da prekinete rad MySQL-ovog procesa. Pregledajte sadraj dnevnika izmena i posmatrajte ta se kada ponovo pokrenete server. 154 Poglavlje 10 Upotreba transakcija u lnnoDB tabelama Odgovori Pitanja l. e 2. a 3. e 4. d 5. e U poglavlju U poglavlju ll MySQL-ov sloen sistem upravljanja pravima korisnika. Na raspolaganju je bogat izbor za koju dati korisnicima baze podataka. U tom poglavlju opcije i na koje se njima upravlja. v Administriranje MySQL-a 11 Upravljanje pravima korisnika 12 Podeavanje MySQL-a 13 Administriranje baze podataka 14 Izrada rezervnih kopija i obnavljanje podataka 15 Zatita MySQL servera 16 Replikovanje baze podataka 11 Upravljanje pravima korisnika J EDNA OD MYSQL-OVIH NAJBOLJIH OSOBINA jeste njegov sloen sistem prava korisnika. U ovom poglavlju se pravljenjem naloga, pravima koja su na raspolaganju i na koji su ta prava predstavljena u MySQL-ovim l<lbelama. teme: Pravljenje naloga komandi GRANT i REVOKE Nivoi prava Tabele prava Pravljenje naloga komandi GRANT i REVOKE Prava za pristup podacima dodeljuju se nalozima komande GRANT, n ukidaju se komande REVOKE. To su standardne SQL-ove komande koje moete izvriti na isti kao i bilo koju drugu komandu navedenu u ovoj knjizi. Svi podaci o korisnicima MySQL-a i njihovim pravima pristupa se u MySQL-ovoj bazi podataka, potpuno isto kao i podaci s kojima rade aplikacije koje ste vi napravili. Da biste mogli da izvravate komande koji se pominju u ovom odeljku, potreban vam je nivo prava za pristup podacima. Ako ste sami instalirali MySQL, imate pristup nalogu root, pa prema tome i nivo prava. Ako MySQL koristite na koji neko drugi administrira (kao to je na poslu ili iznaj- mljeni moda nemate nivo prava da biste izvravali te upite. U tom poruku o greci nalik na ERROR 1045: Access denied for user: 'laura127.0.0.1' (Using pass- word: YES) Dodeljivanje prava Najpre razmotriti komandu GRANT, koja da pravite nove naloge i da dodeljujete korisnicima prava za pristup bazama podataka, tabelama i funk- cija mn. Pogledajte primer: gran l liU (e 158 Poglavlje 11 Upravlj anje pravima kori snika Ova komanda fomura nalog za korisnika je ime l uke kada on pokua da se pri- javi na MySQL server s localhost. Tom nalogu dodeljuje lozinku lozinka, koju je vrlo teko pogoditi - razume se, vi zadati neto bolje!). usage opisuje pravo koje dodeljujemo korisniku luke. Pravo usage da korisnik moe samo da se prijavi na server i nita vie. U odredbi ON zadajemo objekte na koje se odnose prava koja dodeljujemo korisniku. da korisniku dodeljujemo samo pravo da se prijavi na server, ta odredba je u ovom izlina. Opti oblik komande GRANT je, kako stoji u MySQL-ovoj dokumentaciji, 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 [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, u narednom odeljku. Neka prava su globalna (odnosno, vae za sve baze podataka na serveru), dok druga vae samo za objekte (baze podataka, tabele ili pojedine kolone tabela). U odredbi ON treba da navedete objekte na koje se odnose prava koja dodeljujete. To moe biti ime tabele ili ime baze podataka, ili ime baze podataka sa svim njenim tabelama (oblik ime_baze. *). Umesto imena objekta, moete zadati i *. *, to ozna- sve baze podataka i sve tabele u njima. Ako zadate samo *, prava koja dodeljujete vae samo za 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 ima nalog, dodaju mu se nova prava. Ukoliko nalog ne postoji, MySQL ga napraviti . U ovoj odredbi moete zadati vie od jednog korisnika te imena s kojih se mogu prijavljivati, na primer, fredlocalhost. Ako imate pri prija- vUivanju kao korisnik za kojeg je upravo napravljen nalog, u komandi GRANT navedite i ime s kojeg se prijavljujete. Ime MySQL-ovog naloga ne mora biti jednako imenu pod kojim se korisnik prijavljuje u operativni sistem. Ime kori- snika moe sadrati najvie 16 znakova. Odredbom IDENTIFIED BY zadaje se lozinka novog korisnika, ili dodeljuje nova lozinka korisniku. Korisnici mogu da menjaju svoje lozinke komande: seL password = password('novalozinka'); Korisnikovu lozinku moete izmeniti ako izdate komandu, na primer, set password for fredlocalhost = password('novalozinka'); Da biste to uradili, morate imati pristup bazi podataka mysql. Nivoi prava Odredba WITH GRANT OPTION je specijalno pravo koje korisniku da svoja prava dodeljuje drugim korisnicima. Ako ustanovite da ne moete da dodeljujete prava drugim korisnicima, razlog je to to vam nedostaje ovo pravo. Osim toga, dru- gom korisniku ne moete dodeliti pravo koje sami nemate. Odredbu WITH moete upotrebiti i da biste po satu broj izvrenih upita, unetih izmena, ili uspostavljenih veza s bazom podataka. Podrazumevana vrednost tih parametara je nula, to da nema Odredba REQUIRE da zahtevate da se korisnik prijavljtije putem veze. Da biste mogli daje koristite, da podesite MySQL na To podrobnije razmotriti u poglavlju 15, "Zatita MySQL " servera . Nivoi prava Prava koja moete dodeliti komande GRANT dele se u dve osnovne kategorije: prava za korisnike i prava za adnunistratore. Prava za korisnike Prava za korisnike pobrojana su u tabeli 11.1. Ta bela 11 .1 Prava za korisnike Pravo 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 brie redove iz tabela. Korisniku je dozvoljeno da izvrava procedure. Korisniku je dozvoljeno da pravi indekse. Korisniku je dozvoljeno da nove redove u table. Korisniku je dozvoljeno da tabele. Korisniku je dozvoljeno da redove. Korisniku je dozvoljeno da izdaje komandu SHOW DATABA- SES da bi dobio listu baza podataka koje postoje na serveru. Korisniku je dozvoljeno da aurira podatke. Korisniku je dozvoljeno da se prijavi na server, ali osim toga, ne moe da radi nita drugo. U tabeli 11.2 prikazana su prava koja bi trebalo da se dodeljuju samo administratorim3. Neka njima moete dodeliti i korisnicima, ako procenite da bi to bilo ispravno, ali nijedno od tih prava ne treba da se podrazumeva za korisnike. Poglavlje 11 Upravljanje pravima korisnika Tabela 11.2 Prava za administratore Pravo ALL Korisnik ima sva prava osim WITH GRANT OPTION. ALTER Korisniku je dozvoljeno da menja strukture tabela. Ovo pravo moete dodeliti korisnicima koji imaju dovoljno znanja, ali budite oprezni pri tome jer se moe (zlo)upotrebiti i za promenu sadraja tabela prava. DROP Korisniku je dozvoljeno da brie tabele. Ovo pravo moete dodeliti korisnicima u koje imate dovoljno poverenja. FILE Korisniku je dozvoljeno da podacima iz jedne datoteke dopunjuje ili menja sadraj druge datoteke. Ovo pravo moete dodeliti korisnicima u koje imate dovoljno poverenja. Pazite se korisnika koji pokuavaju da proslede podatke u datoteku koju slobodno izaberu, kao to je /etc/passwd ili datoteka! PROCES S Korisniku je dozvoljeno da prikae listu svih procesa- tj. da vidi sve procese koje MySQL izvrava. RE LOAD Korisniku je dozvoljeno da izdaje komandu FLUSH. Ova komanda ima vie namena. U nastavku ovog poglavlja komandu FLUSH PRIVILEGES, a komandom FLUSH se detaljnije u poglavlju 13. REPLICATION CLIENT Korisniku je dozvoljeno da ispituje gde se nalaze glavni i zavisni serven. REPLICATION SLAVE Specijalno pravo namenjena specijalnom korisniku replikovanja na zavisnom serveru.Vie informacija o tome u poglavlju 16. SHUTDOWN Korisniku je dozvoljeno da izdaje komandu mysqladmin shutdown.Vie informacija o tome u poglavlju 13. SUPER Korisniku je dozvoljeno da se prijavljuje na server i kada je s MySQL-om uspostavljen maksimalni dozvoljeni broj istovremenih veza i moe da izvrava komande CHANGE MASTER, KILL (thread) , mysqladmin debug,PURGE MASTER LOGSiSET GLOBAL. WI TH GRANT OPTION Korisniku je dozvoljeno da drugima dodeljuje svako pravo koje sam 1ma. Postoji jo jedno pravo koje se zove REFERENCES. Rezervisano je za upo- trebu i mada ga moete dodeljivati, zasad nema nikakvog efekta. ukupnih prava komande GRANT moete dodeliti prava na nivoa: Globalna prava koja vae za sve baze podataka na serveru. Zadaju se niza znakova*.* u komandi GRANT. Na primer: grant all on*.* to fred; Prava koja vae samo za bazu podataka. Zadaju se izrazom irne_ba z e . * u komandi GRANT: q n mL a ll on empl oyee .* to fred; .............. ,., ..... . Pravo pristupa tabeli. Dodeljuje se tako to se navede ime te tabele u komandi GRANT: grant select on department to fred; Prava pristupa koloni. Dodeljuje se tako to se zada ime kolone u odredbi GRANT komande GRANT. Na primer: grant select (employeeiD) on employee to fred; Kada da li korisnik ima pravo da izvri posao, MySQL kombi- nuje 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 slui za ukidanje prava koja korisnik ima. Na primer: revoke all on employee.* from fred; Opti oblik komande revoke izgleda ovako: REVOKE vrsta_prava [ (lista_kolona) l [, vrsta_prava [ (lista_kolona) l ... l ON {irne_tabele l * l ** l ime_baze.*} FROM ime korisnika [, ime_korisnika ... l Kao to vidite, odredbe su u sutini iste kao u komandi GRANT i uki- danje prava. Tabele prava Podaci koje menjate komandi GRANT i REVOKE se u bazi podataka koja se zove mysql. Umesto komandi GRANT i REVOKE, tabele u toj bazi podataka moete i direktno, ukoliko znate ta treba da uradite. Osim toga, podatke iz tih tabela moete i da da biste lake reili probleme u vezi s pra- vima ukoliko se pojave. Ako sadraj tih tabela menjate direktno, morate izdati komandu flush privileges; da bi izmene da vae. U bazi podataka mysql nalazi se est tabela: user tables_priv db columns_priv host func Prvih pet tabela koristi se za podataka u vezi s pravima korisnika. (U tabeli func skladite se podaci koji se funkcija koje korisnici piu, ali to je tema koja izlazi izvan okvira ove knjige.) t"091CIVIjt: ll Uf.HCIVIJCIIIjt: fHCIVIIIICI I'.UII)IIII'.d Prve tri tabele- user, db i host -koriste se kada se da li imate pravo pri- stupa bazi podataka. Svih pet tabela se koristi kada se imate li pravo da izvrite komandu. Tabela user Tabela user sadri podatke o globalnim pravima korisnika. Ova tabela ima kolone: Kolone za opseg vidljivosti Na osnovu sadraja ovih kolona se koji red treba Ovoj grupi pripadaju kolone: Host: Ime s kojeg korisnik uspostavlja vezu user: Ime korisnika Password: Korisnikova lozinka, u formatu ifrovanom funkcije PASSWORD () Kolone za prava Svaka kolona odgovara jednom globalnom pravu i moe sadrati vrednost y (korisnik ima to globalno pravo) ili N (korisnik nema to glo- balno pravo). Ovoj grupi pripadaju 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 veze Odgovaraju podacima koji se zadaju u odredbi REQUIRE komande GRANT. Ovoj grupi pripadaju kolone: ssl_type ssl_cypher x509_issuer x509_subject Kolone za upotrebe resursa Sadre podatke o eventualnim njima upotrebe resursa koje zadajete na kraju komande GRANT. Ovoj grupi pripadaju kolone: max_ questions max_updates max_ connections Tabela db U ovoj tabeli se podaci o pravima korisnika za pojedine baze podataka. Tabela se sastoji od kolona: Kolone za opseg vidlj'ivosti Na osnovu njihovog sadraja, MySQL koji red treba Ako imate pravila za ostavite polje host prazno, a u tabeli host dodajte grupu redova da biste obezbe- dili detaljnije podatke. Ovoj grupi pripadaju kolone: Host Db User Kolone za prava Njihov sadraj koja sve prava ima kombinacija Host, Db i User. Ove kolone mogu sadrati samo vrednosti Y ili N. Kolone za prava su 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 pretrauje tabelu host kad god na prazno polje u tabeli db. Takvo ponaanje ne moete zadati komandom GRANT, ali moete ga podesiti. Tabela ima kolone: Kolone za opseg vidljivosti Na osnovu njihovog sadraja, MySQL koji red treba u Svaki red u ovoj tabeli sadri podatke o jednoj bazi podataka kojoj se pristupa s jednog Ovoj grupi pripadaju kolone: Host Db Kolone za prava Njihov sadraj koja sve prava ima kombinacija Host i Db. Ove kolone mogu sadrati samo vrednosti Y ili N. Kolone za prava su
Select _pri v Insert_priv Update_priv Delete_priv Index _pr iv Alter _pri v Create _pri v Drop _pr iv Grant_priv Create_tmp_table_priv Lock_tables_priv ou-. Tabela tables_priv U tabeli tables_priv se podaci o pravima koje korisnici imaju za pojedine tabele. Ova tabela ima kolone: Kolone za opseg vidlj"ivosti Imaju istu namenu kao i u prethodne tri tabele. U ovom imamo i kolonu Table_name, koja sadri podatke o tabeli na koju se pravo odnosi. Kolone za opseg vidljivosti su Host Db User Table name Kolone o dodeli podatke o tome ko je i kada dodelio pravo. Ovoj grupi pripadaju kolone: Gran tor Time stamp Kolona Table_priv podatak o pravu koje je dodeljena kombinaciji Host/Db/User za tabelu navedenu u koloni Table_name. Kolona moe sadrati jednu iz skupa vrednosti: Select, Insert, Update, Delete, Create, Drop, Grant, References, Index i Al ter. Kolona Column _pri v podatak o pravu koje korisnik ima za sve kolone tabele. Moe sadrati jednu iz skupa vrednosti: Select, Insert, Update i References. Ako je ova kolona prazna, MySQL potraiti u tabeli columns_priv detaljnije podatke o tome ta jeste a ta nije dozvoljeno u kolonama tabele. Tabela columns_priv U tabeli columns _pri v se podaci o pravima korisnika za pojedine kolone. Tabela ima kolone: Kolone za opseg vidlj"ivosti Na osnovu njihovog sadraja, MySQL koji red treba Ovoj grupi pripadaju kolone: Host Db User Table name Column_name Kolona column _pri v podatak o pravu dodeljenom kombinaciji vrednosti navedenoj u kolonama za opseg vidljivosti. Moe sadrati jednu iz skupa sle- vrednosti: Select, Insert, Update i References. Kolo/la Time stamp Pokazuje kad je pravo bilo dodeljena. Sa ela Saetak GRANT i REVOKE Komanda GRANT da korisniku dodelite prava pristupa ili da napravite nov nalog. Format komande je 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 [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 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 Ovo su prava namenjena korisnicima: CREATE CREATE TEMPORARY TABLES DELETE EXECUTE INDEX INSERT LOCK TABLES SELECT SHOW DATABASES UPDATE U SAGE Ovo su prava administratorima: ALL REPLICATION CLIENT ALTER DROP FILE PROCES S RE LOAD REPLICATION SLAVE SHUTDOWN SUPER WITH GRANT OPTION G Poglavlje 11 Upravljanje pravima korisnika Tabele prava Podatke o nalozima i njihovim pravima MySQL u bazi poda- taka mysql. Postoji pet tabela prava. U tabeli user se imena korisnika, njihove lozinke i podaci o globalnim pravima . U tabeli db se podaci o pravima za pojedine baze podataka. U tabeli host se podaci o tome kojoj se bazi podataka s kojeg moe pristupati. U tabeli tables _pri v se podaci o pravima za pojedine tabele. U tabeli columns_priv se podaci o pravima za pojedine kolone u tabelama. Pitanja l . Pravo GRANT OPTION korisniku da a) podatke iz datoteke b) drugima dodeljuje prava koja sam ima e) se prijavljuje na server, ali nita vie d) izdaje komandu FLUSH 2. Pravo USAGE korisniku da a) podatke iz datoteke b) drugima dodeljuje prava koja sam ima e) se prijavljuje na server, ali nita vie d) izdaje komandu FLUSH 3. Pravo RELOAD korisniku da a) podatke iz datoteke b) drugima dodeljuje prava koja sam ima e) se prijavljuje na server, ali nita vie d) izdaje komandu FLUSH 4. Pravo FILE korisniku da a) podatke iz datoteke b) drugima dodeljuje prava koja sam ima e) se prijavljuje na server, ali nita vie d) izdaje komandu FLUSH U 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 Vebe b) ima vrednost Y ili N kada je korisniku dozvolj en pristup toj bazi podataka e) opisuje jedno od prava koje korisnik ima za tu tabel u d) pokazuje da li za tu tabelu postoji red u tabeli columns_priv l. Napiite komandu GRANT koja pravi nalog bill, je lozinka secret i kome je dozvoljeno da podatke iz tabele department, aurira ih, dodaje u tabelu i brie iz 2. Napiite komandu REVOKE koja ukida prava tog korisnika. Odgovori Pitanja l. b 2. e 3. d 4. a 5. a Vebe l. 2. grant select, update, insert, delete on employee.department to billlocalhost identified by 'secret'; revoke select, update, insert, delete on employee.department from bill; U poglavlju U poglavlju, "Podeavanje MySQL-a", mnogobrojne opcije za podeavanje MySQL-a. 12 Podeavanje MySOL-a U OVOM POGLAVLJU nadovezujemo se na kratak uvod u podeavanje MySQL-a iz poglavlja l, "Instaliranje MySQL-a". razne opcije za podeavanje MySQL servera, s posebnim osvrtom na internacionalizovanje servera. teme: Podeavanje MySQL-ovih konfiguracionih opcija Konfiguracione opcije za vie servera na istom Internacionalizovanje Podeavanje MySQL-ovih konfiguracionih opcija Kao to ste iz dosadanjeg ove knjige saznali, mnogi programi za rad s MySQL- -om imaju konfiguracione opcije. Njihove vrednosti zadajete na komandnoj liniji, ali u mnogim moete ih zadati i u obliku datoteke opcija. U istoj datoteci opcija moete zadati vrednosti opcija za komandne linije vie programa za rad s MySQL-om, kao to su mysql, mysqladmin, mysqld, mysqld_safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack. Prednost upotrebe datoteke opcija jeste to to vam da na jednom mestu zadate standardne vrednosti za sve opcije. Kada je instaliran na Unixu, MySQL podrava i upotrebu zasebnih datoteka opcija koje vae za ceo server i za korisnike. Reenje s datotekama opcija je pogodno kada upravljate s vie servera. Ako svi serveri imaju istu konfiguraciju, to je kada se primenjuje replika- vanje, moete koristiti istu konfiguracionu datoteku za svaki server. Konfiguracione opcije prvi put smo pomenuli u poglavlju l. Sada ih ponovo razmotriti, ali opirnije. Datoteku ili datoteke opcija u direktorijumima navedenim u nastavku teksta. Kada je MySQL instaliran na Windowsu, datoteku opcija moete smesti ti u sistem- ski direktoriju m Windowsa i nazvati je my. ini, a moete je smesti ti i u kore nski din:ktorijulll diska na koji je instaliran server (na primer, C:\) i nazvati my. cnf. To glob.dn.t .1 opcija tj. vrednosti opcija u njoj vah 1' <1 sve korisnike 170 Poglavlje 12 Podeavanje MySQL-a Kada je MySQL instaliran na Unixu, moete imati jednu globalnu datoteku opcija, po jednu datoteku opcija za svaki MySQL server instaliran na i po jednu datoteku opcija za svakog korisnika. (Na jednom moe raditi istovremeno vie MySQL servera, to je objanjeno u nastavku ovog poglavlja.) Globalna datoteka opcija nalazi se u direktorijumu /etc/my. cnf. Datoteke opcija za pojedine servere nalaze su direktorijumima data svakog servera, a datoteke opcija za pojedine korisnike nalaze se u direktorijumu svakog korisnika. Imajte u vidu da imena datoteka opcija za korisnike imaju prefiks tj. ime datoteke je .my.cnf a ne my.cnf. Pogledajmo ponovo datoteku opcija koju smo u poglavlju 1 naveli kao primer sintakse za tu vrstu datoteka. Njen sadraj ponovo prikazujemo u listingu 12.1. Listing 12.1 Primer datoteke opcija my.cnf [mysqld] # binarno beleenje i beleenje sporih upita log-bin log-slow-queries # podeavanje za InnoDB tabele # ovo je osnovna datoteka opcija predloena u dokumentaciji. # Datoteke za podatke treba da # skladitenje podataka i indeksa. # obezbedite dovoljno slobodnog # prostora na disku. innodb_data_file_path = ibdatal:lOM:autoextend # podesite rezerve za bafere na # so-so% memorije # na set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=lOM # podesite dnevnika na priblino # 25% rezerve za bafere set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=BM # podesite .. flush_log_at_trx_commit # na o ako moete da prihvatite gubljenje u nekoliko poslednjih transakcija innodb_flush_log_at_trx_commit=l Pogledajmo format ove datoteke. Prvi red u datoteci je [mysqld] To da su opcije navedene iza ovog reda namenjene programu mysqld. Ako elite da zadate opcije za drugi program, navedite njegovo ime na grupe opcija. Imc mora biti napisano unutar uglastih zagrada. ruut:)iiVilllJt: IVJy.::>uL-uvul J<.uruJyurill:IUillll upnJA Na isti kao to zadajete opcije za pojedine programe, moete zadati i grup11 opcija [client], koje vaiti za sve programe. Redovi koji znakom # su komentari . Postoje tri oblika sintakse za zadavanje vrednosti opcija: Moete navesti ime opcije koju elite da na primer: log-bin Ovo je ekvivalentno pozivanju mysqld --log-bin s komandne linije. Moete navesti ime opcije i vrednost koju joj dodeljujete; na primer: innodb_flush_log_at_trx_commit=l Moete navesti ime opcije i do deli ti joj vrednost sintakse set -vari a- ble; na primer: set-variable = innodb_log_buffer_size=BM oblik sintakse smatra se zastarelim, ali smo ga naveli radi celovitosti. Poto nailaziti na ovaj oblik sintakse u nekim datotekama primera, trebalo bi da znate ta on Na primer, to je s primerom datoteke my. cnf, koju smo preuzeli iz MySQL-ove dokumentacije kao jednostavnu datoteku opcija za lnnoDB. Neke opcije koje kako se koristiti datoteke opcija vae za sve programe: --no-defaults da nema datoteka opcija bi sadraj trebalo - -print-defaults prikazuje sve vrednosti opcija koje vae za program. --defaults-file=/putanja/do/datoteke nalae programu da koristi zadatu datoteku umesto standardnih datoteka opcija. To je korisno pri testiranju izmena konfiguracije. --defaults-extra-file=/putanja/do/datoteke navedenu datoteku nakon globalne datoteke opcija, ali pre datoteka opcija za korisnike. Opcije za mnoge programe koje moete podesiti datoteka opcija opisane su na drugim mestima u ovoj knjizi. Izuzetak je mysqld. U narednom odeljku razmo- najvanije i najkorisnije opcije za komandnu liniju programa MySQL server. Opcije za program mysqld Naredna lista opcija nije potpuna, a svrha joj je da opcije za mysqld. Svaka opcija se moe zadati na komandnoj liniji pri pokretanju programa mysqld ili, kao to smo pomenuli, putem datoteke opcija. Listu svih opcija (upozorenje: je ako na komandnoj liniji otkucate mysqld --help 1/2 Poglavlje 12 Podeavanj e MySQL-a Evo nekoliko korisnih opcija: ansi: server u reimu kompatibilnosti sa standardom ANSI. U tom slu- 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: binarno beleenje u dnevnik izmena. Moete zadati ime i direktorijum datoteke dnevnika izmena. log-error: beleenje greaka. Moete zadati ime i direktorijum dato- teke dnevnika greaka. log-slow-queries: beleenje sporih upita. port: Zadaje TCP na kojem server oslukuje. Podrazumeva se broj 3306. user: Zadaje ime naloga pod kojim MySQL server treba da radi. Tokom ovog poglavlja jo nekoliko drugih opcija, a to 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 moete koristiti i ako ne zadate vrednosti za te opcije, ali trebalo bi da ih podesite radi boljih performansi . Ranije smo podesili sle- opcije: innodb_data_file_path = ibdatal : lOM:autoextend Ova opcija opisuje MySQL-u gde da smeta podatke kojima upravlja InnoDB. Za razliku od My ISAM tabela koje su smetene svaka u svojoj datoteci, InnoDB tabele se u deljenom prostoru za tabele, koji se moe sastojati od jedne ili od vie datoteka. U ovom primeru nalaemo MySQL-u da sve InnoDB podatke smeta u istu datoteku je ime ibdatal, a 10 MB automatski se (u koracima od po 8 MB) kada se prostor za tabele popuni. Opti format ove opcije je [; .. . ] [ :autoex- tend [:max: Opcija autoextend da se prostora za tabele prema potrebama. Opcija max da zadate maksimalnu do koje dato- teka moe da naraste. innodb_buffer_pool_size=70M Ova opcija podeava bafera koji se koristi kao ostava za (ke) pri radu s podacima u InnoDB tabelama i indeksima. Kao i svaka druga ostava, to to bolja- manje direktnih pristupa disku. Koliko memorije odvojiti za rezervu bafera od toga da li na serveru ima i drugih aplikacija i kmisnik.l, ali i ml memorijl' s kojo111 raspolaete. innodb_additional_mem_pool_size=lOM Ova opcija odvaja memoriju koja sluiti za MySQL-ovih internih struktura podataka. Ako MySQL- u ponestane ove vrste memorije, da upisuje upozorenja u dnevnik greaka . innodb_log_file_size=20M Ova opcija podeava datoteka dnevnika. InnoDB popunjava n datoteka dnevnika- gde je n vrednost zada ta opcijom innodb_log_files_ in _group; podrazumevana vrednost je 2 i se. innodb_log_buffer_size=8M Ova opcija podeava bafera u koji sc upisuje dnevnik izmena pre nego to se upie na disk. innodb_flush_log_at_trx_commit=l Ako ovoj opciji zadate vrednost 1, to da se sadraj dnevnika izmena iz bafera upisuje na disk kad god potvrdite transakciju. To je normalno ponaanje. Kada je ova opcija podeena na vrednost nula, dnevnik se upisuje i prenosi na disk otprilike jedanput u sekundi. Ako je vrednost ove opcije 2, podaci se upi- suju u dnevnik kad god potvrdite transakciju, ali se sadraj bafera prazni i upisuje na disk jedanput svake sekunde.Vrednosti o ili 2 poboljavaju performanse, ali verovatno ne treba da objanjavamo koliko je to Postoje i druge konfiguracione opcije za InnoDB. Vie informacija o tome u MySQL-ovoj dokumentaciji. Konfiguracione opcije za vie instalacija na istom je korisno da vie MySQL servera radi na istom Na pri- mer, korisnici Internet usluga mogu imate vlastite instalacije. Ovu odliku MySQL-a koristimo kada elimo da polaznicima kursa o MySQL-u da svako podeava svoj server. Za svaki server koji morate zadati vrednosti opcija za mysqld: port: Svaki server mora oslukivati na drugom TCP socket: Na Unixu, svaki server mora koristiti drugu datoteku Na Windowsu, opcijom socket zadaje se ime imenovanog cevovoda koji server koristi. U oba vrednost opcije socket mora biti za svaki server. shared-memory-base-name (samo na Windowsu): Svaki server mora koristiti drugi blok deljene memorije. pi d- file (samo na Unixu): Svakom serveruje potrebna vlastita datoteka u koju upisuje identifikator svog procesa (picl). Opcije za beleenje podataka u dnevnike izmena: Ako zadate vrednost bilo koje opcije koja se odnosi na datoteke dnevnika, za svaki server da 1h 111-1i direktorij um za datoteke dnevnika. 1 14 Poglavlje 12 Podeavanje MySUL-a Jednostavan da to postignete jeste da opciji basedir dodelite vred- nost za svaki server. Tako direktorijumi data i datoteke dnevnika automatski biti Toplo da svaki server ima svoj direktorijum data, tako izbe- gavate razne neprijatnosti. Opcija --defaults-fileje veoma korisnajer da se svaki server pokrene s skupom podrazumevanih vrednosti opcija (ili da se svaki server instalira kao Windowsov servis s vlastitim skupom podrazumevanih vrednosti opcija). Vano je da zapamtite kada na istom radi vie servera, klijentskim programima i drugim programima koji uspostavljaju veze sa serverom, kao to je mys- qladmin, morate zadati server s kojim treba da se poveu. U takvim situacijama moe biti veoma pametno da za svakog korisnika napravite po jednu datoteku my. conf u kojoj zadati broj TCP tako korisniku da automatski uspostavi vezu sa svojim serverom. lnternacionalizovanj e Postoje dve opcije za mysqld koje da se zada podrazumevani skup zna- kova i pravila. Skup znakova je skup simbola koji se moe koristiti na serveru. pravila na koji se parede nizovi znakova iz tog skupa- se i redosled sortiranja- to zavisi od govornog jezika. Podrazumevani skup znakova moete zadati opcije --default -charac- ter-set. Svakom skupu znakova pridruen je i podrazumevani skup pravila, ali moete zadati i neki drugi opcije --default-collation option. Ako kombinacija skupa znakova i skupa pravila nije ispravna, mysqld prikazati poruku o greci. Ako nijedna od ovih opcija nije zadata, podrazumeva se skup znakova latin l i skup pravila latinl_swedish_ci. Taj skup znakova se kao IS0- -8859-1 West European. pravila latinl_swedish_ci redosled sor- tiranja teksta na vedskom i finskom jeziku koji se sastoji od znakova iz skupa latin l. (Moda niste znali da za napisane istim slovima vae pravila sortiranja u jezicima.) Postoje i pravila koja se mogu pridruiti skupu znakova latinl koja opisuju kako se sortira tekst na danskom i norvekom jeziku. Vie informacija o skupovima znakova koje MySQL podrava, ako vas ba skup, potraite u MySQL-ovoj dokumentaciji. Saetak MySQL-ovi programi mysql, mysqladmin, mysqld, mysqld_safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk i myisampack podravaju upotrebu datoteka opcija. Opcije moete podesiti tako da vae na globalnom nivou, na nivou nog servera i/ ili korisnika, ili na svim navedenim nivoima istovremeno. Sintaksa datoteke imenom programa uglastih zagrada, slede opcije koje se odnose na taj program. Komentari znakom ll. Sv.d.;,1 opcija moe se zadati u obliku opcija, opcija=vrednost, ili set-variabl opcija=vrednost. Listu svih opcija za program mysqld moete dobiti komande mysqlcl --help. Vie MySQL servera moe raditi na istoj maini u isto vreme, pod uslovom da podesite opcije tako da serveri ne ometaju jedan drugog. Za svaki server morate zadati brojeve TCP i datoteka dnevnika. U datoteci opcija moete zadati podrazumevani skup znakova i pravila koja vaiti na serveru. Skup znakova se sastoji od skupa dozvoljenih simbola. pravila redosled sortiranja. Pitanja l. Opcija --no-defaults za mysqld a) ne vae podrazumevane vrednosti, samo vrednosti zadate u datoteci opcija b) ne nita iz datoteka opcija e) vrednosti samo iz globalnih datoteka opcija d) nijedno od prethodnih 2. Opcija za Inn oD B koja podeava prostora za tabele je a) innodb_buffer_pool_size b) innodb_data_file_path e) innodb_log_buffer_size d) nijedna od prethodnih 3. Opcija za InnoDB koja podeava bafera za podatke je a) innodb_buffer_pool_size b) innodb_data_file_path e) innodb_log_buffer_size d) nijedna od prethodnih 4. Kada vie servera radi na istom nUe neophodno da elementi budu odvojeni: a) datoteke dnevnika b) TCP e) d) klijentski programi Poglavlje 12 Podeavanje MySOL-a S. ta je od Vebe a) Jedan skup pravila moe se pridruiti samo jednom skupu znakova. b) Jedan skup pravila moe se pridruiti svakom skupu znakova. e) Jednom skupu znakova moe se pridruiti samo jedan skup pravila. d) Nijedno od prethodnih. Instalirajte stariju verziju MySQL-a (na primer, 3.23) na svoj Podesite sistem tako da imate i i stariju verziju servera koje rade na istom Pokuajte da uspostavite vezu sa obe verzije. . Odgovori Pitanja l. b 2. b 3. a 4. d S. a U poglavlju U poglavlju, "Administriranje baze podataka", t svakodnevne poslove odravanja koje treba obavljati u MySQL-ovoj bazi podataka. 1 Administriranje baze podataka u OVOM POGLAVLJU poslove koji su neophodni za upravljanje MySQL-ovom bazom podataka. To obuhvata aktivnosti: Pokretanje i sputanje srevera Prikazivanje podataka o serveru i bazama podataka na njemu Podeavanje serverskih promenljivih Unitavanje niti Pranjenje ostava Analiziranje tabela Pregledanje datoteka dnevnika izmena Mada prvenstveno objanjava poslove koje treba da obavlja administrator baze podataka, ovo poglavlje opisuje i jedan vaan skript, mysqladmin, koji da automatizujete neke od tih poslova. Zadavanjem parametara, skript mysqladmin se moe upotrebiti za obavljarUe velikog broja administrativnih poslova. Na kraju ovog poglavlja njihov spisak. U ovom poglavlju i upotrebu skriptova mysqlshow i mysqlcheck, te SQL-ovih komandi KILL, RESET, CHECK, REPAIR i ANALYZE TABLE. Pokretanje i sputanje MySQL servera Kao to smo napomenuli u poglavlju l ",Instaliranje MySQL-a", svoj server naj- verovatnije podesiti tako da se automatski zajedno sa operativnim sistemom. postoje situacije u kojima morati da spustite, pa da ponovo pokrenete server jer je dolo do greke. smo objasnili kako se MySQL server. na koji to uraditi zavisi od vaeg operativnog sistema, sadraja standardnih putanja i opcija koje ste izabrali kada ste instalirali MySQL server. Na Linuxu, server moete pokrenuti komande /t Lc/lnit ,d/ mysqld start 18 Poglavlje 13 Administriranje baze podataka ali samo ako imate kopiju izvrne datoteke mysqld u direktorijumu koji se podrazu- meva u distribuciji Red Hat. Ako se ta datoteka nalazi na drugom mestu, da zadate putanju. Vie informacija o tome u poglavlju l. Server moete pokrenuti i skripta safe_mysqld Ovaj skript najpre pokuava da automatski odredi opcije za pokre- tanje MySQL-a, a zatim MySQL s tim opcijama.Ako skript nije na vaoj podrazumevanoj putanji, da zadate celu putanju na kojoj se on nalazi. Da biste na Linuxu spustili MySQL server, imate dve Moete izdati komandu /etc/init.d/mysqld stop ili mysqladmin -u root -p shutdown Razume se, moete koristiti i neki drugi adm.inistratorski nalog, ali nalog root je uvek upotrebljiv. Nalozi pod kojima rade korisnici ne bi trebalo da imaju pravo sputanja servera. Na Windowsu, ukoliko ste mysqld instalirali kao Windowsov servis, najjednostavniji da pokrenete bilo koji servis jeste da otvorite Control Panel i u Admini- strative Tools, Services. Ako izaberete servis MySQL,Windows vam za njega ponuditi opcije Stop (sputanje), Pause (zaustavljanje) ili Restart (ponovno pokretanje), kao to je prikazano na slici 13.1. (Poto je ovo ekranska slika iz Windowsa XP Professional, sadraj vaeg ekrana se moda malo razlikovati, to zavisi od verzije operativnog sistema.) Server moete spustiti i skripta mysqladmin za Linux, na opisani Prikazivanje podataka o serveru i bazama podataka na nJemu Skript mysqlshow i SQL-ova komanda SHOW pruaju vam, kao administratoru, puno informacija o onome to se odvija u bazama podataka i na samom serveru. Prikazivanje podataka o bazama podataka Skript mysqlshow prikazuje podatke o bazama podataka. Ako ga pokrenete bez para- metara, na mysqlshow se lista baza podataka u koje vam je dozvoljen pristup pod vaim nalogom. Rezultat je isti kao kada zada te show databases; u programu mysql ili u nekom drugom interfejsu. f'i'"""" ... '-""''"'..,- ... ...,,._,_. 1'1-0Yidosn.., ....... ... ........ (alecb ..... ..
Kao i skriptova koji se s komandne linije, skript mysqlshow moete pokrenuti s parametrom -u kojem sledi ime naloga, i parametrom -p, kojim se lozinka tog naloga. Postoje i druge korisne opcije. Ako zadate mysqlshow --help se lista svih opcija na raspolaganju. Jedna od njih da zadate ime baze podataka da biste prikazali podatke samo o bazi koja vas zanima. Na primer, ako ime baze podataka zadate u obliku, se lista tabela u toj bazi podataka: mysqlshow -u ime_korisnika -p ime_baze Ako na kraj ovog reda dodate i parametar --status, detaljnije podatke o tabelama. Isprobajte to na bazi podataka employee, na mysqlshow -u imekorisnika --status employee Rezultati su malo tee zbog redova, ali se za svaku tabelu prika- zuju podaci o maini za skladitenje podataka koja se koristi, podataka u tabeli, vrednosti u koloni tipa auto-increment (ukoliko postoji takva kolona) i podaci o skupu znakova koji vai za tabelu. l tlU Podatke o bazi podataka i stanju servera moete pribaviti i SQL-ove komande SHOW koju zadate unutar MySQL-ovog klijentskog programa. Dosad bi tre- balo da znate da izdate komande show databases; show tables; da biste prikazali podatke o bazama podataka i tabelama u njima. komanda SHOW ima veliki broj drugih opcija koje moete iskoristiti. Na primer, zadajte show columns from ime_tabele; da biste dobili iste podatke kao komande DESC. tome, moete zadati show table status da biste dobili iste podatke kao skripta mysqlshow --status. Prikazivanje statusa servera i vredn..asti serverskih promenljivih Da biste dobili podatke o !l!!rveru i na koji radi, pogledajte status servera i vred- nosti serverskih promenljivih Da biste saznali kakav je MY_SQL-a, moete izdati komandu SHOW STATUS unutar MySQL-a, ili komandu mysqladmin -u imekorisnika -p -extended-status na komandnoj liniji. Time dobiti podataka o tome ta se sve na serveru od trenutka pokretanja. Moe vas zanimati da pogledate vrednosti svih pro- menljivih ime s com_*- na primer, promenljiva com_ select pokazuje koliko je server izvrio komandi select. Ovo su neke od najzanimljivijih vrednosti: threads_connected: Broj otvorenih i aktivnih veza korisnika i servera. slow _queries: Ukupan broj upita koje je server izvrio i je izvravanje trajalo due od vrednosti zadate u serverskoj promenljivoj long_query_time. Ti upiti se belee u dnevnik sporih upita (Slow Query Log). Sporim upitima se vie u poglavlju 19",0ptimizovanje upita". uptime: Broj sekundi koji je protekao od trenutka pokretanja servera. Da biste videli vrednosti serverskih promenljivih, moete izdati komandu show variables; unutar MySQL-a, ili komandu mysqladmin -u imekorisnika -p variables na komandnoj liniji. l 111'-U"-IWUIIJ"'- t'"'._.._. ..... ,....,.""'-- -- ..,._"_,.._. .,,.,_. -''l "' Vrednosti serverskih promenljivih moete zadati u konfigur a<:tonoj datoteci, na komandnoj liniji kada server ili unutar MySQL ,t, kon1ande SET. Podeavanje servera opisano je u poglavlju 12",Podeavanjc .t'', a upotreba komande SET opisana je u nastavku ovog poglavlja. Prikazivanje podataka o procesima Koji su sve procesi aktivni na serveru moete videti ako unutar MySQL-a izdate sle- komandu: show processlist; se podaci barem o upitu koji ste upravo poslali (show processlist). Iste podatke moete dobiti i s komandne linije, ako zadate mysqladmin -u imekorisnika -p showprocesslist Prikazivanje podataka o dodeljenim pravima Koja su sve prava dodeljena korisniku moete saznati komande show grants for Rezultat je izraen u obliku komande GRANT koje moete zadati drugom korisniku ista prava kao korisnik. Na primer, mysql> show grants for root@localhost; na mom sistemu daje 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) Moete se podsetiti i koja sve prava postoje ako zadate show privileges; Time prikazati spisak svih prava koja postoje u sistemu. Prikazivanje sistemskih podataka o tabelama koji se sve tipovi tabela mogu koristiti u sistemu ako zadate show table types; Ako vas zanima kako bi izgledala komanda create koja formira tabelu koja postoji u sistemu, zadajte show create table ime_tabele; Na primer, ako u bazi podataka employee zadate show create table department; 182 Poglavlje 13 Administriranje baze podataka rezultat: CREATE TABLE 'department' 'departmentiD' int(ll) NOT NULL auto_increment, name' varchar(30) default NULL, PRIMARY KEY ('departmentiD') TYPE=InnoDB CHARSET=latinl (Obratite panju na to da su, za svaki imena polu- navodnika i naveden je podrazumevani skup znakova, koj l rusmo lZnClto zadah kada smo napravili tabel u). Podeavanje serverskih promenljivih .. . . Komanda SET da zadajete vrednosti serverskih promenljlVlh - koje ste mogli da vidite komande show variables. Sintaksa komande izgleda ovako: set promenljiva=vrednost; Na primer, moete zadati: set sql_safe_updates=l; Time se bezbedno auriranje podataka (isto se postie i ako na koman- dnoj liniji zadate --i-am-a-dummy). v. . . . Ovu komandu kada budemo dosh do opt1m1zovanp servera u poglavlju 17 ",Optimizovanje MySQL Servera". Unitavanje niti . Komanda show processlist koju smo pomenuli u prethodnom delu ovog poglavlja da vidite koje se sve niti izvravaju na serveru. ostalog, komanda prikazuje i jedinstveni identifikator dodeljen svakoj niti. za da je uzrok problema (na primer, upit koji s; izv.rava "celu vecnos: ih klljentskl pro- gram zbog kojeg je nastao problem), mozete je prekinuti pomocu komande kill id_procesa; Pranjenje ostava v . . , MySQL koristi pri radu grupu internih ostava (keova), koje m.ozete komandi FLUSH i RESET. Na primer, ako ste izmenili prava konsmka tako sto ste rucno izmenili sadraj tabela prava, te izn1.ene da vae u celom sistemu tek kad izdate komandu: flush privileges; Druga upotreba komande FLUSHjeste pranjenje bafera za upite: (lush query cache; Time defragmentirati bafer za upite, se poboljavaju performanse. Uatoteke dnevnTk.t Komanda RESET koristi se na isti kao komanda FLUSH. Na primer, moete 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 u MySQL-ovoj dokumentaciji. Datoteke dnevnika MySQL odrava vie datoteka dnevnika koje mogu biti korisne. da beleenje u tih datoteka dnevnika nije u standardnoj konfiguraciji servera, to morati sami da Svaki dnevnik se aktivira opcije zadate na komandnoj liniji pri pokretanju servera ili komande set. Moete odravati dnevnike: Dnevnik greaka (engl. Error log): tu se belee sve greke nastale pri radu servera. Ovaj dnevnik je standardno aktivan a njegova datoteka se nalazi u direktorijumu data. U Linuxu, ime te datoteke je hostname. err, a u Windowsu, njeno ime je mysql. err. Moete je smestiti i u neki drugi direktorij um, koji morate navesti u opciji log-error=imedatoteke u konfiguracionoj datoteci my. ini ili my. cnf. Dnevnik upita (engl. Query log): tu se belee svi upiti koji se izvravaju u sistemu. Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku opcije log=imedatoteke. Dnevnik izmena (engl. Binary log): tu se belee rezultati svih upita koji menjaju podatke. Ovaj dnevnik zamenjuje nekadanji Update log, koji ostati na raspo- laganju i u MySQL-ovoj verziji 5.0, ali se smatra zastarelim. Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku opcije log-bin=imedatoteke. Dnevnik sporih upita (engl. Slow query log): tu se belee svi upiti izvravanje traje due od vremena zadat og u promenljivoj long_ query _t ime. Ovaj dnevnik moete aktivirati i zadati direktorijum za njegovu datoteku opcije log-slow-queries=imedatoteke Svi navedeni dnevnici, osim dnevnika izmena, su tekstualne datoteke. Sadraj dnevnika izmena moete videti komande mysqlbinlog logfile Upotrebu dnevnika sporih upita u poglavlju 19. Poto datoteka dnevnika raste, trebalo bi da ih zamenjujete dru- gim datotekama. Ako koristite Linux, uz MySQL dobijate i skript mysql-log- rota te koji formira grupu datoteka za upotrebu. R4 Poglavlje 13 Administriranje baze podataka Ako koristite neki drugi operativni sistem, stare datoteke dnevnika moete premestiti na bezbedno mesto a zatim naloiti MySQL-u da upisivanje u novu datoteku dnevnika, komande mysqladmin flush-logs Opcije za skript mysqladmin Za skript mysqladmin postoje mnogobrojne, manje ili vie korisne opcije. Neki poslovi, kao to je pravljenje i brisanje baza podataka, mogu se obaviti SQL-ovih komandi ili skripta mysqladmin: mysqladmin create databasename mysqladmin drop databasename Skript mysqladmin se upotrebljava za prikazivanje podataka o serveru i njegovom. stanju. Podatak moe biti bilo ta u opsegu od vrlo jednostavnog, npr. "Da li server radi?'' (ping), do znatno detaljnijeg, kao to je lista vrednosti serverskih promenljivih ili aktivnih procesa. U nastavku je opisana upotreba skripta mysqladmin za mnoge takve poslove. Da biste saznali da li server uopte radi, zadajte mysqladmin ping Da biste saznali koja je verzija softvera za MySQL server instalirana na zadajte mysqladmin version Da biste prikazali kratak ili opis statusa servera, zadajte mysqladmin status mysqladmin extended-status Da biste prikazali listu aktivnih niti na serveru, zadajte mysqladmin processlist Ako se prikae lista procesa (niti), neeljene niti moete unititi na mysqladmin kill idl,id2,id3 ... Da biste prikazali vrednosti MySQL-ovih serverskih promenljivih, zadajte mysqladmin variables Saetak Server se moe pokrenuti skripta mysqladmin, pokretanjem izvrne datoteke mysqld, ili Windowsove alatke Services manager. Server se moe spustiti komande mysql. server stop ili skripta mysqladmin shutdown . Komanda mysqlshow prikazivanje podataka o bazi ili o MySQL serveru. Vrednosti serverskih promenljivih moete zadati konlalhh menlj iva=vrednost;. Listu aktivnih niti moete prikazati komande show proceoo l l t 1 1 11 moete unititi komande kill id_procesa. Ostave se prazne komandi FLUSH i RESET. Brzinu upita u kojima se spajaju tabele moete komandl" 111, lyze table ime_tabele; . MySQL belei podatke u dnevnik greaka, dnevnik upita (svi upiti), dnevnik izmena (upiti koji menjaju podatke) i dnevnik sporih upita (upiti izvrava liJI' traje due nego to je zadato upromenljivoj long_query_time). Pitanja 1. Koji su od dnevnika standardno aktivni? a) dnevnik upita b) dnevnik sporih upita e) dnevnik greaka d) dnevnik izmena e) svi prethodni 2. SQL-ova komanda SHOW moe se upotrebiti za prikazivanje a) liste svih baza podataka na serveru b) liste svih tabela u bazi podataka e) liste svih kolona u tabeli d) svega prethodnog 3. Skript mysqladmin moe se upotrebiti za a) prava nakon izmena da bi se obezbedile da izmene da vae b) prikazivanje statusa servera e) sputanje i pokretanje servera d) zatvaranje i ponovno otvaranje datoteka dnevnika e) sve prethodno Vebe Aktivirajte sva dnevnika. Poto izvrite vie upita, pregledajte sadraje dnevnika. Ako nemate pristup bazi podataka, moda da se neto upie u dnevnik sporih upita. Definicija "sporog" je najmanje jedna sekunda . 186 Poglavlje 13 Administriranje baze podataka Odgovori Pitanja l. e 2. d 3. e U poglavlju U poglavlju 14, "Izrada rezervnih kopija i obnavljanje podataka", objanjavamo izradu rezervnih kopija baza podataka i ta treba uraditi kad neto krene naopako. Izrada rezervnih kopiJ i obnavljanje podatak u OVOM POGLAVLJU KAKO SE prave kopije baze podataka, bko se one mogu preneti na drugi i kako se podaci obnavljaju kada neto krene naopako. 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 na nekom elektronskom ure- morate praviti rezervne kopije datoteka baze podataka. To moete i radi replikovanja baze podataka ili prelaska na drugi Rezervnu kopiju MySQL-ove baze podataka moete napraviti na skripta mysqldump napravite datoteku slike stanja (engl. dump file), tj. datoteku koja sadri sve SQL komande koji su neophodne da biste obnovili stanje baze podataka. skripta mysqlhotcopy napravite datoteku s podacima. Ovaj skript direktno kopira datoteke u kojima se nalaze podaci koji pripadaju bazi. Sami direktno napravite kopiju datoteka s podacima. Time zapravo radite ono to skript mysqlhotcopy radi. Ako se opredeli te za ovu da zatvorite bazu podataka, ili da ispraznite ostave za podatke i da tabele da biste obezbedili da podaci u njima ostanu uskla Poto skriptovi mysqldump i mysqlhotcopy prazne ostave i u tabele umesto vas, oni su bezbednije reenje . Upotrebite komande BACKUP TABLE i RESTORE TABLE da biste napravili rezervne koptjt :tadatc tabele ili grupe tabela. 188 Poglavlje 14 lzraaa rezervnih Koplja 1 oonaviJanje poaataKa redom sve navedene Ako je izrada rezervnih kopija od vanosti, imajte u vidu da se za vreme tog postupka korisnicima pristup podacima. Zbog Da bi se napravila uskla- kopija stanja baze podataka, baferi tabela moraju se isprazniti a sadraj tabela mora ostati nepromenjen dok traje kopiranje. To se moe obezbediti njem tabela (u ili servera iz upotrebe (to se ne prepo- ali u oba pristup bazi podataka biti dok traje izrada kopije podataka. Jedno reenje problema jeste replikovanje. Jedan od zavisnih servera moete iz upotrebe i napraviti kopiju njegovih podataka, dok za to vreme korisnici obavljaju svoje poslove. Replikovanje razmotriti u poglavlju 16",Replikovanje baze podataka". Izrada rezervnih kopija i obnavljanje podataka skripta mysqldump izrade rezervnih kopija baze podataka jeste skripta mysqldump koji pokrenete s komandne linije svog sistema. Ovaj skript uspostavlja vezu s MySQL serverom i formira datoteku slike stanja, koja sadri sve SQL komande potrebne za rekonstruisanje stanja baze podataka. 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 grupie nekoliko drugih opcija, koje su opisane u nastavku teksta. Naveli smo ime baze podataka, a rezultat preusmeravamo u datoteku rezervne kopije koju elimo da napravimo. Ako skript pri meni te na jednostavnu bazu podataka employee, rezultu- datoteku sadraj 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; l 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 l UUIIc:tYIJOIIJ\. tJUUQUII\CI tJUIIIU\..U .:JI" l tJ lO employeeiD int(ll) NOT NULL default '0', skill varchar(l5) NOT NULL default PRIMARY KEY (employeeiD,skill) TYPE=InnoDB CHARSET=latinl; Dumping data for table 'employeeSkills' /*!40000 ALTER TABLE employeeSkills DISABLE KEYS */; LOCK TABLES employeeSkills WRITE; INSERT INTO employeeSkills VALUES (6651, 'Java'), (6651, 'VB'), (7513, 'C'), (7513, 'Java'), (7513, 'Perl'), (9006, 'Linux'), (9006, 'NT'), (9842, 'DB2'); UNLOCK TABLES; /*!40000 ALTER TABLE employeeSkills ENABLE KEYS */; Bazu podataka employee moete da rekonstruiete na drugom ako uradite
l. Napravite bazu podataka sa imenom na ciljnom 2. ovu datoteku komande mysql -u imekorisnika -p < backup.sql Skript mysqldump ima vie opcija koje moete upotrebiti. U ovom zadali smo --opt, koja grupie opcije: --quick: Nalae MySQL-u da podatke upisuje direktno u datoteku, umesto da ih prethodno upie u memorijski bafer (to je standardni rada).Time se postupak kopiranja ubrzava. --add-drop-table: Nalae MySQL-u da ispred svake komande CREATE TABLE u 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 datoteci. --extended- insert: Nalae MySQL-u da koristi sintaksni oblik s vie redova da bijednom komandom INSERT uneo vie zapisa u tabelu. Na primer, u listingu to izgleda ovako: INSERT INTO employeeSkills VALUES (6651, 'Java'), (6651, ' VB'), (7513,'C'), J t'OglaVIJe '14 Izraela rezervn1n kopiJa 1 oonaviJanJe podataka Ako vam zatreba da ove datoteke ponovo formirate bazu podataka i njen sadraj, postupak biti bri nego kada zadate niz komandi INSERT. --lock-tables: Nalae MySQL-u da sve tabele pre nego to izradu datoteke slike stanja. Imajte u vidu da opcija --opt (koja optimizovati) optimizuje vreme potrebno za rekonstruisanje baze podataka datoteke slike, a ne vreme potrebno za izradu same datoteke slike. Postupak izrade datoteke slike moe biti spor. Evo jo nekoliko korisnih opcija: --databases: da zadate vie odjedne baze podataka slike stanja elite da napravite. --all-databases: Nalae MySQL-u da napravi slike stanja svih baza podataka na serveru. --allow-keywords: Ako u tabelama imate polja sa istim imenima kao rezervi- sane MySQL-a (ili onima koje u mogu postati rezervisane ova opcija nalae MySQL-u da svakom imenu kolone pridrui i ime tabele kojoj kolona pripada. -d ili --no-data: Formira samo sliku strukture baze podataka, ali ne i njenog sadraja. To je veoma korisno kada testirate baze podataka ili ih instalirate na druge Prednosti skripta mysqldump jesu u tome to se jednostavno upotrebljava i auto- matski reava problem tabela umesto vas. ima i nekoliko nedostataka. Prvi je to to skript tabele: kada skript pokrenete na serveru, korisnicima pristup tokom vie sekundi ili minuta, to zavisi od tabela. Ako planirate izradu slike stanja na serveru koji se ne replikuje, trebalo bi da pokuate da taj postupak obavite u vreme manje nosti sistema da ne biste previe ometali korisnike. Ako u svako doba dana imate velike podataka i veliki broj korisnika, trebalo bi da se opredelite za drugi izrade rezervnih kopija. Drugi nedostatak je poto skript mysqldump za svoj rad koristi MySQL server, postupak je sporiji nego kada koristite skript mysqlhotcopy. Skript mysqlhotcopy ne zavisi mnogo od MySQL servera, se pri svom radu direktno sistemu datoteka na Izrada rezervne kopije i obnavljanje baze podataka skripta mysqlhotcopy Skript mysqlhotcopy razlikuje se od skripta mysqldump po tome to direktno kopira datoteke baze podataka, umesto da podatke preko veze koju uspostavi sa serve- rom. On se povezuje sa serverom da bi ispraznio bafere tabela i tabele, ali da komunicira sa sistemom datoteka na i ne izvrava upite na serveru, trebalo bi da bude neto bri od skripta mysqldump. IL.IUUU 1'-L.'-1 or ooooo '"""I"''J..,. o."..,..,,_,.,)-'')- r---oo-- r--.----.--..... ..----- Ovaj skript se na mysqlhotcopy -u imekorisnika -p ime_baze ciljni_direktorijum Skript je napisan na jeziku Perl. Ako imate Unix ili srodni operativni sistem, golovn je sigurno da negde imate i izvrnu datoteku perl. Ukoliko imate Windows, morale instalirati Perl da biste mogli da koristite ovaj skript. Ako ga jo nemate, moete p rl' uzeti verziju Perla za Windows s Web lokacije kompanije ActiveState: www.activestate.com/Products/ActivePerl Datoteke koje pravi skript mysqlhotcopy 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. izrada rezervnih kopija i obnavljanje podataka Umesto skripta mysqlhotcopy, moete i sami uraditi sve to taj skript radi. To podrazumeva pranjenje bafera, tabela i kopiranje datoteka s podacima u odredini direktorij um, pri tabele moraju biti To da morate otvoriti novu sesiju na MySQL serveru. Moete najpre izdati komandu LOCK TABLES da biste 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 je dovoljna blokada tipa READ. To da druge niti (otvorene veze sa serverom) mogu neometano da tabele ali ne mogu nita da menjaju u njima dok traje postupak kopiranja. tabela je vano u ovakvim situacijama jer kopiranje moe da potraje dugo. U naem primeru baze podataka employee, bilo bi veoma nezgodno da nakon izrade rezervne kopije tabele, a pre kopiranja tabele department, neko izbrie sve zaposlene iz neke slube, a zatim izbrie i samu slubu. Rezultat bi bio kopija podataka u kojoj bismo imali zaposlene koji rade u slubi. korak je izdavanje komande FLUSH TABLES: flush tables; Ako pravite rezervnu kopiju svih baza podataka na serveru, ovaj korak moete kombinovati s prethodnim komande: flush tables with read lock; Sada moete kopiranje datoteka s podacima.Veoma je vano da vaa sesija (u kojoj ste tabele i ispraznili njihove bafere) ostane otvorena tokom celog I!J4 PoglavlJe 14 Izrada rezervni h kOpiJa 1 obnavlJanJe podataka postupka jer tako blokade koje ste postavili biti odrane. Kada zatvorite tu sesiju, tabele biti Kada zavrite kopiranje, trebalo bi da oslobodite tabele: unlock tables; Opisani postupak je ono to radi skript mysqlhotcopy, a podatke moete obnoviti iz kopija na isti kao da ste kopije napravili tog skripta. Izrada rezervni h kopija i obnavlj anj e podataka komandi BACKUP TABLE i RESTORE TABLE Osim primenom postupaka koje smo opisali u prethodnim odeljcima, isti rezultat moete i dve SQL-ove komande, BACKUP TABLE i RESTORE TABLE. Te komande deluju samo na tabele tipa MyiSAM. Rezervnu kopiju MyiSAM tabele moete napraviti na backup table tl to 'putanja/do/kopije'; Ako koristite Windows, imajte u vidu da morate zadati slovnu oznaku diska kao u 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 tako da bude dozvoljeno samo i pravi se njena kopija. Moete zadati i listu imena tabela razdvojenih zarezima; u tom se tabele i kopiraju jedna za drugom.Ako elite da podaci u svim navedenim tabelama budu izdajte najpre komandu LOCK TABLES (pogle- dajte prethodni odeljak, izrada rezervnih kopija i obnavljanje podataka") . Da biste iz rezervne kopije obnovili tabelu, izdajte komandu: restore table tl from 'c:/tmp'; Rezultat biti uspean samo ako tabele koje obnavljate ne postoje u bazi podataka. Ako imate tabel u sa istim imenom, morate je prethodno izbrisati komandom DROP TABLE da biste zatim mogli da upotrebite komandu RESTORE. Komanda RESTORE deluje samo na MyiSAM tabele. Restauriranje podataka iz dnevnika izmena l<;1da obnavljate bazu podataka iz rezervne kopije, vrlo se deava da korisici dodaju nove podatke i auriraju nakon izrade poslednje rezervne kopije. U tom se stanje baze podataka moe restaurirati iz rezervnih kopija na jedan od opisanih u prethodnim odeljcima, a zatim treba ponovo primeniti sve i;-mene nakon izrade rezervne kopije. Tc izmene se u dnevniku izmena (engl. binary log), to ga izuzetno va7n im. Listu izvrenih operacija moete u iz dnevnika izme na komande mysqlbinlog logfile > updates.sql O O-' -- O - --.-e .... _....., ____ _ Korisno je da pregledate tu listu pre nego to ponovo izvrite upite ev1dclllll.lll u dnevniku jer neke njima moda ele ti da izvrite. je d.1 \l zbog loe osmiljenog upita morali da restaurirate stanje baze podataka iz reze t Vl H kopije. Na primer, imali smo da je program er zadao upit nalik na update user set password='password'; Jasno je da kada obnav ljate tabelu, ne biste eleli da se ovakav upit ponovo izvri i da lozinka svakog korisnika sistema ponovo bude password! Testiranje rezervne kopije Bez obzira na metod izrade rezervne kopije za koji se opredelite, veoma je vano da je testirate ili, da ispitate njenu upotrebljivost za obnavljanje podataka. Nisu retki administratori koji redovno prave rezervne kopije ali nikad ne proveravaju da li bi iz tih kopija mogli da restauriraju podatke ako zatreba. Postupak izrade rezervne kopije morate paljivo razmotriti kada analizirate rizike i o tome ta raditi. Gde smestiti datoteke rezervnih kopija da bi bile na drugom disku? Kako obezbediti da rezervna kopija ostane na udaljenoj lokaciji gde je Ako donesete odluke na osnovu ovih pitanja i da pravite rezervne kopije u redovnim vremenskim razmacima, nema razloga da brinete da li te kopije biti upotrebljive. Ukoliko resta- urirate bazu podataka kao vebu, moete otkriti eventualne probleme pre nego to postanu nereivi. Izuzetno vaan element pri instaliranju MySQL-a, kao i za postupak obnavljanja podataka, jeste da beleenje izmena u dnevnik izmena. Taj dnevnik stan- dardno nije aktivan, ali je neophodan za res ta urirane baze podataka u poslednje ispravno stanje. Proveravanje i popravljanje tabela Proveravanje da li su tabele deo je standardnog postupka odravanja tabela a deo je i postupka restauriranja baze nakon katastrofalne greke, na primer, u prekida napajanja U MySQL-u postoje tri da proverite ispravnost tabela: komande CHECK TABLE, skripta myisamchk (ili isamchk) i skripta mysql- check.Tabele u kojima otkrijete problem moete popraviti komande REPAIR TABLE ili skripta myisamchk (ili isamchk) ili mysqlcheck. Kada razmatrate koju primeniti, trebalo bi da imate u vidu nekoliko Komande CHECK i REPAIR moete izdati iz samog MySQL-a, dok sc druge mogu primeniti samo s komandne linije. Komande CHECK i REPAIR deluju i na MyiSAM i na InnoDB tabele. Skript isamchk upotrebljiv je za ISAM tabele, dok se skriptovi myisamchk i mysqlcheck mogu koristiti za My ISAM tabele. 1:70 rU!JiliVIJC l'+ ILl dUll l CLCI VIlli l II.Uf.IIJ<I l UUII<IVIJ<IIIJC Ako se tabele upravo koriste, nemojte pokretati skript myisamchk ili isamchk. Bolje je da spustite server pre nego to pokrenete jedan od tih skriptova, ali ako je neophodno, moete i tabele. Ako te skriptove pokrenete za tabele s kojima u isto vreme moda rade druge MySQL-ove niti, podaci se mogu otetiti. Komande CHECK, REPAIR i skript mysqlcheck mogu se slobodno koristiti dok server radi i tabele se koriste. redom navedene alatke. Proveravanje i popravljanje tabela komandi CHECK i REPAIR Ispravnost tabele moete proveriti 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 (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) Moe se pojaviti i poruka Table is already up to date, koja da je sve u redu. Ako se pojavi bilo kakva poruka, to da imate problem pa pokuajte da popravite tabel u. To moete komande REPAIR TABLE (ako je u pitanju MyiSAM tabela) na repair table tl; Ako se postupak popravljanja zavri uspeno (ili ako popravljanje zapravo nije ni bilo poptrebno), trebalo bi da dobijete rezultat nalik na +---------+--------+----------+----------+ 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 od OK, komanda REPAIR nije delovala i morate da upotrebite alatku myisamchk. Proveravanje i popravljanje tabela alatke myisamchk U ovom poglavlju samo alatku myisamchk a alatku isamchk. Ako jo radite sa ISAM tabelama, predlaemo da ih pretvorite u My ISAM tabele (videti poglavlje 9",Tipovi tabela u MySQL-u"). Program myisamchk izuzetno je koristan i vas iz neprilika u koje ste moda upali. Za program myisamchk vai da se ne sme pokrenuti dok se server jo koristi. Bezbednije je da ga spustite. Najjednostavniji da pokrenete myisamchkjeste da na komandnoj liniji otkucate l myisamchk tabela Vrednost parametra tabela mora biti putanja do.MYI datoteke u kojoj je smetena MyiSAM tabela. Ovaj program prikazuje podatke o svim grekama do kojih moe vam se da ne uspeva da rei va problem, pokuajte da ga pokrenete sa opcijom -m. Standardno ponaanje je da progran1 ispituje da li su indeksi kada zadate ovu opciju, ispituju se i redovi tabele. Alatka myisamchk i ispravljanje otkrivenih greaka. Tako se moe ispra- viti velika greaka do kojih dolazi u MyiSAM tabelama. Program myisamchk moete pokrenuti sa opcijama -q -r za brzo popravljanje, kao u primeru: myisamchk -q -r tabela Ako je rezultat neuspean, napravite rezervnu kopiju datoteke s podacima a zatim pokuajte potpuno obnavljanje tabele: myisamchk -r tabela Ako i to bude bezuspeno, pokuajte opciju --s af e- recover, koja ispravlja neke greke koje opcija -r ne moe da ispravi: myisamchk --safe-recover tabela Program myisamchk ima veliki broj opcija, koje videti ako na komandnoj liniji otkucate myisamchk bez parametara. Proveravanje i popravljanje tabela alatke mysqlcheck Program mysqlcheck moe se upotrebiti za proveravanje i popravljanje MyiSAM i InnoDB tabela, kao i za popravljanje MyiSAM tabela dok se server koristi. Da biste alatke mysqlcheck proverili tabele baze podataka, pokrenite je kao u primeru: mysqlcheck -u imekorisnika -p employee Iza ovih parametara moete navesti imena tabela koje elite da proverite, ali ako nita ne zada te, proverene sve tabele u bazi podataka (to je korisna odlika). Ako se sve zavri bez greaka, trebalo bi da dobijete rezultate nalik na employee.assignment employee.client employee.department employee.employee employee.employeeSkills OK OK OK OK OK 8 Poglavlje 14 Izrada rezervn1n KOpija 1 flUUCILCIII.d Opcijom --databases moete zadati listu baza podataka koje treba proveriti, a opcija --all-databases da se proveravaju sve baze podataka na serveru. Programu mysqlcheck moete zadati opciju -r da bi popravio sve MyiSAM tabele na koje Saetak Izrada rezervnih kopija mysqldump pravi datoteku slike stanja koja sadri SQL komande. mysqlhotcopy kopira datoteke baze podataka u odredini direktorijum. BACKUP TABLE kopira datoteku tabele u odredini direktorijum. Rezervne kopije moete napraviti i tako to tabele, ispraznite njihove bafere a zatim napravite kopije datoteka baze podataka. Restauriranje podataka Izvrite komande iz datoteke slike stanja napravljene skripta mysqldump. Vratite kopije datoteka koje ste napravili skripta mysqlhotcopy ili
komande RESTORE TABLE obnovite stanje iz datoteke koju ste napravili komandom BACKUP TABLE. Ponovo izvrite sve operacije evidentirane u dnevniku izmena nakon izrade poslednje rezervne kopije. Proveravanje i popravljanje tabela Proverite stanje tabela komandi CHECK TABLE ili skriptova myisamchk, isamchk ili mysqlcheck. Popravite tabele 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) tabele i isprazniti njihove bafere e) i a) i b) d) nijedno od prethodnog U poglaVlJU l' 2. Trebalo bi da tabele pre nego to a) izradu rezervne kopije b) pokrenete skript mysqldump e) pokrenete skript mysqlhotcopy t' J d) nijedno od prethodnog 3. Koji se tipovi tabela mogu proveravati komande CHECK a) InnoDB i MyiSAM b) samo MyiSAM e) MyiSAM i BDB d) InnoDB i BDB 4. Koji se tipovi tabela mogu popravljati 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 Vebe b) komanda CHECK TABLE ne podrava mainu baze podataka e) tabela je dobra d) nijedno od prethodnog Napravite rezervnu kopiju 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 poglavlju U poglavlju",Zatita MySQL servera", kako da izbegnete bezbednosne propuste. 15 Zatita MySQL servera U OVOM POGLAVLJU opte probleme zatite o kojima bi trebalo da vodite kada koristite MySQL server. Iako je jedno poglavlje nedovoljno da se objasne i najsitniji detalji, prilaemo spisak najvanijih preporuka o tome ta ne treba raditi. teme: Kako sistem prava korisnika deluje u praksi Zatita naloga Zatita instaliranih datoteka Filtriranje podataka koje alju korisnici Drugi saveti Kako sistem prava korisnika deluje u praksi U poglavlju ll",Upravljanje pravima korisnika", objasnili smo pravljenje naloga, dodeljivanje i ukidanje prava pristupa podacima, kao i tabele prava. Ovo poglavlje opisom na koji MySQL server primenjuje prava koja dodelite korisnicima. Sistem kontrola prava pristupa sastoji se od dva koraka. U prvom koraku, MySQL da Ji je korisniku uopte dozvoljeno da uspostavlja veze sa servera m. Tome slui tabela user u bazi podataka mysql. MySQL trai u toj tabeli red koji sadri kori- ime i lozinku koje ste zadali te ime s kojeg pokuavate da se poveete sa serverom. Ako ne red, vam dozvoliti da uspostavite vezu. da kolona host tabele user prihvata i dokerske znake, kombinacija kori- ime/ime moe se nalaziti u vie redova te tabele. MySQL koji je red najvaniji za identiteta tako to prvo ispituje redove koji sadre konkretna imena Na primer, ako tabela sadri red za korisnika test koji se prijavljuje s localhost i red za korisnika test koji u koloni host sadri % (to bilo koji MySQL uzima u obzir red koji sadri ime localhost. 202 Poglavlje 15 Zatita MySQL servera Imajte u vidu da dva reda mogu sadrati lozinke. To moe biti uzrok velike zabune. (Primer takve situacije u odeljku "Brisanje anonimnih naloga", u nastavku ovog poglavlja.) Drugi korak se odvija kada pokuate da izvrite upite ili komande. Pre izvrenja svakog upita, MySQL proverava u tabelama prava da li je vam dozvoljeno izvravanje upita koji ste poslali. Ako je za upit koji pokuavate da izvrite potrebno globalno pravo - npr. kao za komande LOAD DATA INF ILE ili SHOW PROCESSLIST - ispituje se tabela user. Pri izvr- avanju upita u 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 da li moda ima pravo pristupanja tabelama i kolonama. Zatita naloga Postoji nekoliko optih bezbednosnih principa koji vae i za upravljanje nalozima na MySQL serveru. ih u narednom odeljku. Zadavanje lozinke za nalog Root Kada zavrite instaliranje MySQL-a, korisnik root nema lozinku. Obavezno zadajte lozinku za tog korisnika pre nego to da koristite MySQL za bilo ta drugo osim za eksperimentisanje. Dok ne zadate lozinku za korisnika root, svako se moe prijaviti na va server i raditi s vaim podacima ta god pocli.To gotovo nikad nije prihvatljiva situacija. Ako jo niste zadali lozinku, 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 ime. Ime jednog naloga je localhost a drugo je % (predstavlja bilo koji to uspostavljanje veza sa udaljenih Ti nalozi stan- dardno nemaju lozinke. Verovatno ste shvatili zbog ali ipak da izbriete te naloge. To moete uraditi na 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 pokua da uspostavi vezu sa serverom. Primera radi, recimo da ste napravili nalog je ime laura i koji sme da se prijavljuje s bilo kojeg kada 1 ura pokua da se prijavi s localhost, MySQL server trai Zatita instaliranih datoteka redove u tabeli user. Tamo kombinacije laura% i (anonymous) localhost. da MySQL daje prvenstvo redovima koji sadre konkretna imena uzima red (anonymous) localhost. Kao to vidite, iako je laura navela svoje kori - ime, u ovom ono ne slui Za anonimne naloge nije potrebno zadati ime. Anonimni nalog verovatno ima lozinku od naloga korisnika laura (anonimni nalozi standardno nemaju lozinke, tj. korisnik koji se tako prijavljuje ne mora da zada lozinku).To da laura, kada pokua da se pod svo- jim imenom i lozinkom prijavi s localhost, dobiti poruku Access Denied (pristup nije dozvoljen) bez razloga. Najbolji da izbegnete tu vrstu problema jeste da izbriete anonimne naloge i zaboravite da oni uopte postoje. Opasna prava MySQL ima veoma detaljan sistem prava korisnika, to je opisano u poglavlju ll. Morate vrlo paljivo razmotriti kome dodeliti neka od tih prava. Budite veoma oprezni s pravima FILE, PROCESS i WITH GRANT OPTION. Pravo FILE korisnicima da izdaju komandu LOAD DATA INF ILE. Ta komanda moe se zloupotrebi ti za menjanje sadraja datoteka na serveru (kao to je datoteka za lozinke, /etc/passwd) ili za menjanje datoteka baza podataka, se zaobilazi sistem prava pristupa. Pravo PROCESS korisnicima da izdaju komandu SHOW PROCESSLIST. Tako u svakom trenutku mogu videti koji se sve upiti izvravaju, to im da do poverljivih podataka o drugim korisnicima. Pravo WITH GRANT OPTION korisnicima da svoja prava dodeljuju dru- gim korisnicima. Ako znate kakve mogu biti posledice tog prava, moete ga oprezno dodeljivati drugima. ifrovanje lozinki MySQL 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 je zatita lozinki i mehanizma prijavljivanja. Ako piete aplikaciju koja skladiti imena i lozinke svojih korisnika (ne korisnika MySQL-a), nemojte ih ifrovati funkcije PASSWORD ().Umesto nje, prepo- funkciju MDS () ili ENCRYPT ().Te funkcije su detaljnije objanjene u pogla- vlju 8",Upotreba MySQL-ovih funkcija u komandi SELECT". Zatita instaliranih datoteka Osim zatite MySQL-ovih naloga, morate kontrolisati i pristup MySQL- -ovim binarnim datotekama, skriptovima i datotekama s podacima. neko liko preporuka koje moete primeniti na svoj sistem. Poglavlje 15 Zatita MySQL servera Nemojte pokretati mysqld pod nalogom Root . . Ovo se na Linuxu i drugim operativnim sistemima srodrum sa Nemojte pasti u iskuenje da pokrenete MySQL server (program mysqld) pod .kon_- nalogom root. Isto kao za Web server, napravite poseban nalog pod kojlm ce raditi samo MySQL server. Tako prava pristupa koja MySQL server imati u sistemu datoteka. Pristup datotekama i prava upotrebe u operativnom sistemu Nema svrhe da troite vreme na pravilno podeavanje prava naloga za pristup MySQL-u ukoliko nemate kontrolu nad pristupom operativnom sistemu. je da korisnicima p_ristup MySQL-ovim binarnim datotekama, skr.1ptov1ma, a direktorij umu data. Cest bezbednosni propust je da se nekom konsruku dozvoh pristup na kojem radi MySQL server, ali ne i, na primer, bazama dr.u- gih korisnika. Ako taj korisnik ima pristup u direktorijum data, moe da naprav1 koplje datoteka s podacima i da ih otvori na nekom drugom MySQL serveru. Trebalo bi da uvek preduzimate opte bezbednosne mere: Samo i pouzdani korisnici treba da imaju pravo da mysqld. To pravo moete dodeliti jedino nalogu koji ste napravili za mysqld . Samo 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 od programa do programa. Samo i pouzdani korisnici treba da imaju pristup u MySQL-ov direk- torijum data. Ako server radi pod nalogom mysql, tom nalogu je neophodan pristup u direktorijum data. Poto nijednom drugom konsmku to nije neophodno, najbolje da im zabranite pristup tamo. Filtriranje podataka koje korisnici alju . Pre nego to MySQL-u prosledite bilo koji podatak k? ji je une.o: treb.al.o b1 dn klijentska aplikacija izvri provere. Kako cete to tacno obav1t1, zav1s1 od . razvojne platforme s kojom radite, ali pogledajmo primer koji objanjava zbog b1 ttd)nlo da proveravate ulazne podatke. v . v . Problem se moe pojaviti i pri tako jednostavnom kao sto je unosenje 1 w(Ijcg imena i prezimena- npr. Patrick O'Leary- u vau aplikaciju. te po?atke pmslcdite direktno MySQL-u, problem nastati zbog apostrofa u prez1menu O Leary. u zlonamernijem kontekstu, mogu se pojaviti korisnici koji pokuavaju da unesu MySQL-ove komande putem interfejsa vae aplikacije ili Web obrazaca. Postupak kojim proveriti prihvatljivost ulaznih podataka zavisi od programskog .JL':nb na kojem radite, a u MySQL-ovoj dokumentaciji nekoliko optih pn:poruka za veliki broj programskih jezika. Drugi savet l Drugi saveti Razmotrili smo sistem prava pristupa, obradili naloge, opisali datoteke u sistemu datoteka i ukratko pomenuli filtriranje ulaznih podataka. Ako vas brine zatita vae mree (to bi verovatno trebalo da vas brine imate bilo kakvu vezu sa spolj- nim svetom), MySQL da se prenoenje podataka zatiti protokola S SL. Trebalo bi da razmotrite i zatitu Upotreba SSL veza Ako elite da da neko zlonameran "njuka" pakete podataka koje razmenjuju MySQL server i klijenti, podesite MySQL za uspostavljanje veza 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 podeavanja na komandnoj liniji. Dobar primer skripta koji obavlja potrebne operacije nalazi se u MySQL-ovoj dokumentaciji; ovde ga nismo reprodukovali. Poto obavite neophodna podeavanja, komande GRANT zahtevajte da se korisnici prijavljuju putem SSL veza ili da imaju sertifikate. Evo jedno- stavnog primera upotrebe komande GRANT: grant all on employee.* to testuser identified by 'password' require ssl; Ova komanda pravi (ili menja) nalog testuser, je lozinka pass- word. Taj korisnik moe da se prijavljuje na server samo putem SSL veza. Moete zahtevati da se na taj prijavljuju svi korisnici servera ili moda samo korisnici koji se prijavljuju sa udaljenih zatita instalacije Opta preporuka glasi: ako ste se potrudili da paljivo podesite naloge u MySQL-u i u operativnom sistemu, pa i zahtevate da se korisnici prijavljuju putem SSL veza, najbolje je i da zatitite instalaciju. Ako postoji da neko obori server zato to se sapleo o njegov kabi za napajanje, ili ako neko moe da ukrade podatke tako to odnese ceo imate ozbiljan problem. zatita se zaboravlja, u malim i srednjim kompanijama. Moda manje kada je u pitanju Windows, ali i bezbedni Unix/ Linux sistemi postaju ranjivi kada se zanemari zatita. Na primer, na Linuxu je postupak izmene lozinke naloga root trivijalno jednostavan kada imate pristup Naravno, kada neko podacima moe da pristupa kao korisnik root, moe da menja koje god podatke u MySQL-ovim bazama podataka . :ICI Poglavlje 15 Zatita MySQL servera Saetak Sistem prava pristupa Korak 1: Provera da li ima pravo pristupa s lozinkom koju je zadao. Korak 2: Provera svakog upita da bi se utvrdilo da li ima pravo. Najpre se pretrauju tabele user i host, zatim db, a onda tables_priv i columns _pri v. MySQL daje prednost redovima u tabeli User koji sadre konkretna imena
Bezbednosne preporuke Obavezno zadajte lozinku za MySQL-ov nalog root. Izbriite anonimne naloge; oni pristup korisnicima i mogu da pristup regularnim korisnicima. Veoma paljivo razmotrite kome dodeliti prava FILE, PROCESS i WITH GRANT OPTION. Lozinke koje se koriste samo za pristup aplikacijama ifrujte funkcija MOS () ili CRYPT () a ne funkcije PASSWORD () . Nemojte pokretati mysqld pod Unixovim nalogom root. Napravite poseban nalog s vrlo pravima koji upotrebljavati samo za mysqld. Pristup programu mysqld dozvolite samo MySQL-ovom korisniku s nim pravima. Korisnicima pristup programima i skriptovima prema potrebama. Drite se principa najmanjeg prava: dozvolite korisnicima pristup samo onome to im zaista treba! Dozvolite pristup direktorijumu data samo MySQL-ovom korisniku . Nikad ne prihvatajte podatke direktno od korisnika. Uvek ih prethodno filtri- rajte u aplikaciji u kojoj se unose . upotrebu SSL veza ako su potrebne ifrovane veze. Ne zanemarujte zatitu MySQL servera! Pitanja l . Koj a se tabela u bazi podataka mysql pretrauje kada se 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 pretrauje kada se da li je korisniku dozvoljeno d,1 izvri upit? a) user b) host e) db d) tables_priv 3. Ako MySQL u tabeli user vie redova koji sadre isto ime korisnika, koji red uzima za proveru identiteta korisnika? a) Red koji sadri ime b) Red koji sadri ime e) Svaki red koji sadri lozinku. d) Nijedno od prethodnog. 4. Koja od prava verovatno ne bi trebalo da dodeljujete korisnicima? a) FILE b) PROCESS e) WITH GRANT OPTION d) Sva prethodna S. Koji je nalog pogodan za mysqld? a) Nalog s vrlo pravima b) Root e) a) ili b) d) Ni a) ni b) Vebe primera podeavanja 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 Poglavlje 15 Zati ta MySQL servera U poglavlj u U poglavlju16",Replikovanje baze podataka", kako se dva servera . podataka mogu podesiti da rade sa istim podacima. Time se opterecenJe, robusnost sistema i olakava izrada rezervnih kopija podataka.
16 Replikovanj e baze podataka J EDNA OD VEOMA KORISNIH KOJE PRUA MYSQL jeste replika- vanje. ostalog, replikovanje da iste podatke na vie servera . To moete raditi iz vie razloga,_npr. da biste postigli bolje performanse, pouzdanost sistema ili da biste lake pravili rezervne kopije baze podataka. Osim toga, moete se opredeliti za replikovanje kao reenje kada elite da raspodelite baze podataka na vie servera koje imate, umesto da nabavite jedan (nov) server. Replikovanje baze podataka moe obezbediti otpornost sistema na greke (engl. tolerance). Ako se glavni server pokvari,jedan od zavisnih servera moete tretirati kao njegovu kopiju i odmah ga proglasiti za glavni server. U sistemima gde se operacija svodi na podataka, a ne na pisanje, tepli- kovanje moe da pobolja performanse jer se izvravanje upita raspodeljuje na vie nara. Ukupno sistema moete pokuati da smanjite tako to izvravanje upita rasporedi te na broj manje optere a druga je da pokuate da smanjite u mrei tako to svaki upit usmerite na geografSki naj- blii server. Ako su upiti koji se izvravaju u vaoj bazi podataka uglavnom jed- nostavni, i jednostavan algoritam koji moe biti efikasno reenje. Ako neki upiti zahtevaju sloenu obradu, verovatno morati da osmislite sloenije algoritme koji na nivou aplikacije. Druga primena replikovanja jeste izrada rezervnih kopija baze podataka. Kao to smo napomenuli u poglavlju 14",Izrada rezervnih kopija i obnavljanje podataka", izrada rezervne kopije obimne baze podataka moe da potraje dugo. Kada koristite replikovanje, moete spustiti zavisni server i napraviti kopiju njegovih poda- taka bez ometanja korisnika glavnog servera. Principi replikovanja Replikovanje se moe odvijati u vie oblika. U MySQL se koristi usmerena veza glavni- -zavisni server.Jedan od servera je glavni (engl. master).Jedan ili vie servera tretiraju sc kao zavisni (engl. slaves) od glavnog servera. Glavni server koji sc podaci u sistemu, dok zavisni serveri pokuavaju da preslikaju njegov sadr,j. IV Postupak replikovanja oslanja se na sadraj dnevnika izmena na glavnom serveru. U tom dnevniku se podaci o svakom upitu koji je bio izvren na serveru od beleenja u dnevnik. Zavisnim serverima se alju upiti iz dnevnika izmena glavnog servera a oni ih primenjuju na svoje podatke. Sve operacije upisivanja podataka uglavnom se odvijaju direktno na glavnom serveru, dok se operacije raspodeljuju zavisnih servera, ili glavnog i zavisnih servera. To se postie ugradnjom logike u aplikacije. Vano je imati u vidu da kada da repliku jete bazu podataka koja sadri podatke, dnevnik izmena moda biti potpun. da beleenje izmena u dnev- nik standardno nije podaci koje ste uneli u sistem moda nisu zabeleeni u dnevniku izmena. Kada replikovanje, svi zavisni serveri moraju sadrati pot- puno iste podatke kao glavni server na beleenja u dnevnik izmena.Ovu temu detaljnije u nastavku poglavlja. Poto zavisne servere napunite podacima i pokrenete ih, oni usposta- vljaju veze s glavnim serverom i na svoje podatke primenjuju izmene zabeleene u dnevniku izmena glavnog servera. Jedna nit izvrenja na zavisnom serveru uspostavlja vezu s glavnim serverom i ispituje da li ima novih izmena. Te izmene se smetaju u prenosni dnevnik (engl. relay log) na zavisnom serveru. Druga nit izvrenja na zavisnom serveru izmene iz prenosnog dnevnika i primenjuje ih na lokalnu kopiju podataka. da glavni i zavisni serveri mogu biti dostupni u vremena (npr. zato to se u sistem mogu dodati novi serveri ba u trenutku izvravanja upita, ili zato to je mrea postala zaguena, ili je prestala da radi), neophodno je da zavisni serveri belee dokle su stigli sa unoenjem izmena.Vano je da se sve transakcije 'izvre u celini i da se izmene primenjuju pravilnim redosledom. U aplikacija, ako se garantuje da baza podataka uvek prelazi iz jednog stanja u drugo, manje je vana da se ponekad podaci zastareli nekoliko sekundi ili minuta. Ako razmatrate primenu replikovanja, morate shvatiti ta se Auriranje podataka odvija se asinhrono, a ne u realnom vremenu. Poto aurirate podatke u bazi na glavnom serveru, upiti poslati zavisnim serverima nakon toga mogu izvesno vreme davati rezultate. To se moe smatrati nedostatkom, ali prednost je u tome to zavisni server koji radi na prenosivom ili u nepouzdanoj mrei, sasvim lepo raditi u intervalu dva auriranja s glavnog servera. Napomena o verzijama MySOL-a je prvi put u jednu od novijih verzija MySQL-a (3 .23 .15), to da se ta jo uvek razvija gotovo sa svakom novom izdatom verzijom. Ako nameravate da koristite replikovanje, dobro je da na svim koji u tome instalirate aurnu i istu verziju MySQL-a. su kombinacije verzija MySQL-a glavnog i zavisnih servera, ali poto time samo uvodite stepen nepouzdanosti, najbolje je da to izbe gava te ako je ikako Primera radi, moete na problem da se funkcij e, kao to j e PASSWORD (),razlikuju dve verzije MySQL- a s kojima pokuavate da radit e.
Ako su vam zaista neophodne dve verzije MySQL-a u istom sistemu, na adresi dokumentaciju s matricom verzija glavnih i zavisnih servera koje mogu raditi zajedno: www.mysql.com/doc/en/Replication_Implementation.html Podeavanje sistema za replikovanje U sistema u kojima se primenjuje replikovanje koristi se vie pove- zanih u jednu internu mreu. Ako imate are povezane putem javnog Interneta, paljivo razmotrite bezbednosne mere. Za obavezno proverite da li je TCP koji ste odredili za MySQL dostupan kroz zatitni zid svim koji treba da komuniciraju sa serverom (podrazumevani broj TCP za MySQL server je 3306) . Pod pretpostavkom da na svojim imate noviju verziju MySQL-a i jednu ili vie baza podataka koje elite da replikujete, naredni koraci su obavezni da biste napravili sistem s jednim glavnim serverom i jednim ili vie zavisnih servera. Napravite nalog koji upotrebljavati samo pri replikovanju Umesto da za sve to radite koristite nalog root, da za poslove repE- kovanja napravite naloge koji imati samo prava neophodna za te poslove, to smo napomenuli u poglavlju 1, "Instaliranje MySQL-a" . Dakle, potreban vam je poseban nalog na glavnom serveru, namenjen poslovima replikovanja. Ako nameravate da stanje zavisnih servera generiete komandi LOAD TABLE FROM MASTER ili LOAD DATA FROM MASTER, nalogu za replikovanje potrebna su specijalna prava. Naredna komanda GRANT (koju izdate na glavnom serveru) pravi nalog s pravima koja su potrebna alatkama za uspostavljanje veza 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 vae baze podataka i, razume se, obavezno odaberite bezbedniju lozinku.) Poto zavrite kopiranje podataka s glavnog servera na zavisni server, nalogu za replikovanje vie biti potrebna tako velika Ako zavisne servere punite iz rezervne kopije ili nameravate da smanjite kori- naloga za replikovanje nakon zavretka kopiranja, tom nalogu je dovoljno samo pravo replikovanja. Naredni upit pravi nalog je ime replication i koji ima pravo da uspostavlja vezu s glavnim serverom sa svakog zavisnog servera (kao i sa svakog drugog grant replication slave on logs.* to replication"%" identifi e d by 'password' ; ' l .it rUyli:tVIJC l 0 UdLC 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 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 podeen za replikovanje Na glavnom serveru mora biti beleenje izmena u dnevnik. Ako ste uputstva za instaliranje MySQL-a iz ove knjige, verovatno st.e dnevnik . izmena jer on slui i za druge svrhe osim replikovanja. Da b1ste provenli da li Je uklju- beleenje izmena u dnevnik, moete izdati komandu SHOW VARIABLES. Dovoljno je da zadate show variables; da biste prikazali vrednosti svih serverskih promenljivih, ali za rezultat zadajte
show variables like "log_bin"; Ako je beleenje izmena u dnevnik dodajte opciju log-bin u datoteku opcija, kako je prikazano u listingu 1.1. Ime datoteke opcija my. ini ili my. cnf, u zavisnosti od konvencije operativnog sistema koju ste primenili. U datoteci my . ini/my. cnf zadajte glavnom serverujedinstven identifikator. Trebalo bi da vaa datoteka opcija sadri barem redove: [mysqld] log-bin server-id=1 Opcija server- id je jedinstven identifikator koji treba da svakom MySQL serveru. To mora biti pozitivna celo brojna vrednost, a u ovom pnmeru sasv1m pro- izvoljno zadali smo 1. . . Ako izmenite sadraj datoteke opcija, morate ponovo pokrenut1 server da bl izmene da vae. Napravite kopiju stanja glavnog servera Da biste replikovanje, obezbedite potpunu i kopiju stanja baze podataka na glavnom serveru ime datoteke dnevnika izmena na glavnom serveru pomak od dnevnika koji odgovara stanju servera. postupak kojim obaviti navedene poslove moe s.e malo u zavisnosti od toga da li koristite MyiSAM ili InnoDB tabele 1 od toga kohko vam .Jl! neprijatna pomisao da za vreme morati da zabranite pristup bazi podataka.
Podeavanje sistema za replikovanjr Za My ISAM tabele, kopiju stanja svakog zavisnog servera moete napraviti nakon njegovog pokretanja. Pogledajte odeljak "Pokretanje zavisnih servera", u nastavku ovog poglavlja. ova metoda nije posebno efikasna, kad imate veliku podataka i veliki broj zavisnih servera. Komanda LOAD DATA FROM MASTER izdata sa svakog zavisnog servera podatke na glavnom serveru do zavretka kopiranja. Baze podataka biti znatno vreme ako kopiju stanja napravite komandi operativnog sistema. To vam da istom kopijom stanja glavnog servera inicijalizujete koliko god vam zavisnih servera treba, ete interval u kojem je server Za InnoDB tabele ne moete izdati komandu LOAD DATA FROM MASTER. Kopiju stanja morate napraviti komandi operativnog sistema ili nabavite softver i opremu koji izradu kopije podataka dok se server koristi . Ako kopiju stanja servera pravite komandi operativnog sistema, morate se uveriti da su podaci i aurni, tako to izdati komandu: flush tables with read lock; Time tabel u i upisivanje izme na dok je ne oslobodite. Ime datoteke dnevnika i pomak od njenog moete dobiti komande: show master status; Trebalo bi da dobijete rezultate nalik na +-------------------+----------+---- - ---------+------------------+ l File l Position l Binlog_do_db l Binlog_ignore_db l +-------------------+----------+--------------+------------------+ l server-bin.000007 l 211 l +-------------------+----------+--------------+------------------+ Zapiite podatke iz prve kolone (ime datoteke dnevnika izmena) i iz druge kolone (pomak od te datoteke). Ako nema podataka, umesto imena datoteke zadajte prazan znakovni niz, a vrednost pomaka treba da bude 4. Da biste napravili kopiju stanja My ISAM tabela, neke alatke za arhiviranje datoteka kopirajte sadraj direktorijuma u kojem se nalaze datoteke tabela. Na Unixu, zadajte neto nalik na da biste napravili kopiju stanja baze podataka logs: tar -cvf /tmp/snapshot.tar /path/mysql/data/logs Na Windowsu, upotrebite WinZip ili neku alatku da biste napravili kopiju sadraja direktorij uma C: \mysql\data \lo gs. Kada zavrite kopiranje, moete ponovo dozvoliti upisivanje u bazu podataka ako izdate komandu: unlock tables; 214 Poglavlje 16 Replikovanje baze podataka Tabela employee koju koristimo u celoj knjizi (kao i tabela koje autori kori- ste u svojim projektima) tipa je InnoDB.Ako imate (komercijalni) softver za kopiranje InnoDB tabela dok se koriste, onje savren za ovu namenu. Moe se nabaviti od firme Innobase Oy na adresi www.innodb.com/hotbackup.html Ako nemate takvu alatku, najbolje reenje je da ispraznite bafere baze podataka i da ispraznite njene tabele narednih komandi. Prvo zadajte komandu flush tables with read lock; a zatim prikaite i zapiite podatke o datoteci dnevnika izmena i pomaku u njoj (na isti kao za MyiSAM tabele): show master status; Bazu podataka iz upotrebe a da je ne oslobodite, a sadraj direktorij uma u kojem se nalaze tabele te podataka kopirajte u MySQL-ov direktorijum data. Ako imate InnoDB tabele, morate kopirati datoteke s podacima i datoteke dnevnika. Kada zavrite kopiranje, moete ponovo pokrenuti bazu podataka i osloboditi njene tabele. Podesite zavisne servere Svakom serveru treba jedinstven identifikator. U datoteci opcija (my . cnf/my. ini) dodajte red nalik na server-id=2 Identifikator mora biti celobrojna pozitivna vrednost, ali dok ne zadate dva jednaka, potpuno je nevano koje vrednosti izabrati. Ako imati broj servera, niz vrednosti je najverovatnije najbolji da identifikatori imaju jedinstvene vrednosti. Ukoliko koristite kopije koje ste napravili u sistemu datoteka, morate kopi- rati datoteke na mesta na zavisnom server u. Ako radite s vie operativnih sistema, vodite o razlikovanju malih i velikih slova. Nakon auriranja datoteke opcija ili kopiranja InnoDB datoteka na zavisni server, morate ga ponovo pokrenuti. Pokretanje zavisnih servera Da biste pokrenuli zavisni server podeen kako je opisano u prethodnim odeljcima, treba da izdate 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; Sloenije topologlj U ovom primeru, server je ime na kojem radi glavni server. replicationje ime naloga koji ste napravili za poslove replikovanja. Umesto password upite lozinku tog naloga. Zadajte i ime datoteke dnevnika izmena (parametar master_log_file) i pomak (parametar master_log_pos). Komanda START SLAVE na zavisnom serveru nit koja obavlja replikovanjc, usled zavisni server pokuava da uspostavi vezu sa glavnim serverom i preuzme 1zmene. Ako ste napravili kopiju stanja komandi operativnog sistema, tre- balo bi da pokrenete izvravanje upita koji ispituju razlike 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, moete ih napraviti i popuniti podacima komande nalik na 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 da se normalno odvija, vie biti zgodno da izdajete komande za podeavanje replikovanja, ako zbog toga retko ponovo server. Iste podatke koje biste zadali tih komandi moete uneti u datoteku opcija, uz malo sintaksu. Datoteka my. ini ili my. cnf na zavisnom serveru moe sadrati neto nalik na [mysqld] server-id = 2 master-host server master-user replication master-password password replicate-do-db = logs Sloenije topologije pr imena replikovanja jeste (engl. load balancing) u sistemu u kojem se obavlja veliki broj operacija 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 u kojima je opravdana upotreba sloenijih konfiguracija. Ako da imati broj zavisnih servera ili su vai razmeteni na broju geografskih lokacija, moe biti pogodno reenje u obliku hijerarhijskog sistema u kojem jedan server igra ulogu glavnog servera za broj zavisnih servera. Jedan ili vie tih zavisnih servera igraju ulogu glavnog servera za drugu grupu zavisnih servera. Na slici 16.1 prikazanje jedan glavni server broj l) koji je gl:wni ?: a od 2 do 6. Neki od tih zavisnih servera igraju ulogu glavnih servl't .1 :t.t grupe zavisnih servera. 216 Poglavlje 16 Replikovanje baze podataka Slika 16.1 Replikovanje s hijerarhijski organizovanim glavnim serverima. Raspored kao na slici smanjuje glavnog servera na najviem nivou i smanjuje obim na mrenim vezama koje vode ka tom U zavisno- sti od odnosa broja operacija i upisivanja podataka u vaoj aplikaciji, tako moete obezbediti dobru skalabilnost bez prevelike sloenosti sistema. jednostavno moete formirati sistem s proizvoljnim brojem zavisnih ser- vera i moda vie glavnih servera, pod uslovom da je svaki glavni server u jednoj vezi i zavisni server u drugoj vezi. Ako pri projektovanju aplikacija vodite da ponekad na serveru nedostajati najnovije izmene, ceo sistem moete tretirati otprilike kao da je u pitanju samo jedan server baze podataka. Stvari da se komplikuju kada imate cirkularne veze u kojima vie servera primaju komande za auriranje podataka a izmene se u vie smerova. Najjednostavnija cirkularna veza sastoji se od dva koji se ponaaju i kao glavni i kao zavisni server. Svaka izme na koju na jednom se dru- gom. Kada piete aplikacije za tu vrstu sistema, morate biti veoma oprezni. da se izmene unose asinhrono, moe do dupliranja vrednosti u poljima tipa auto increment ili jedinstvenih identifikatora i do podataka. U nekim aplikacijama to moe biti prihvatljivo. Na primer, u aplikaciji koja samo evidentira podatke i u kojoj imate manji broj jednostavnih veza tabela, a zahteva se veliki protok podataka i raspoloivost za upotrebu, moda prihvatiti da tome rtvujete podataka. replikovanja u vidu sve to je moramo napomenuti da su u pitanju relativno nove koje nisu do kraja "izbruene". Kao to ste videli, postupak inicijalizovanja novog zavisnog servera kopijom stanja glavnog servera nije ba Nije uskla- ni na koji se radi s MyiSAM tabelama i InnoDB tabelama. n:plikovanja u MySQL-u nisu ba najrobusnije. su u standardnu distribuciju (za razliku od komercijalnih baza podataka) i redovno se upotrebljavaju u okru- 1cnjima gde sc obraduju velike podataka.Verovatno da su 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 podeavanje moe biti zapetljane zbog razlika sistema. da koristite najsveije verzije MySQL-a koje moete nabaviti. Neki od tih problema reeni kada My ISAM dobije alatku za kopiranje podataka dok .se tabele te, kao .. to postoji za InnoDB tabele. koje su plamrane za buduce verZIJe MySQL-a nalazi se povezivanje zavisnog servera s vie glavmh Istovremeno (engl. multimastering) radi reavanja sukoba, i preklapanJa (engl.failover) i Zasad se o na vruce dva servera i morate starati sami u svojim aplikacijama, ili moete nabaviti 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 replikovanja ali zasad nemaJumkakvog UtiCaJa. To su opcije za podeavanje SSL veza glavnog servera I zav1smh Ukoliko podatke repliku jete putem javne mree, postupak tako biti Ako vam veze, zasad je jedino reenje da nabavite odgovaraJUCI proiZvod, kao sto je Stunnel. Saetak nije pogodno za. sve situacije, ali ako imate aplikaciju s vodnosom broja operacija j upisivanja podataka, to moe b1t1 odhcna mogucnost da obezbedite skalabilnost aplikacije. Imajte u vidu da se izmene ne izvravaju na zavisnim serverima u isto vreme. Svaka kopija tabele mora prelaziti iz jednog stanja u drugo, ali vanJe podataka sa servera moe dati zastarele rezultate dok se zavisni serveri ne auriraju. Najkorisnije komande koje se odnose na replikovanje su START SLAVE LOAD TABLE imetabele FROM MASTER,LOAD DATA FROM MASTER,SHOW STA- TUS, SHOW SLAVE STATUS i SHOW SLAVE HOSTS. Pitanja l. Na MySQL serveru replikovanje se moe upotrebiti za a) punjenje podacima razvojnog servera koji sluiti za bezbedno testiranje novih programa na stvarnim podacima b) poboljavanje performansi e) postupak izrade rezervnih kopija podataka koji manje ometa korisnike d) poboljavanje stepena raspoloivosti sistema e) sve prethodno navedeno 218 Poglavlje 16 Replikovanje baze podataka 2. Datoteka dnevnika 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 i upisivanja podataka se odvijaju a) na zavisnim serverima, upisivanje na zavisnim serverima b) na zavisnim serverima, upisivanje na glavnim serverima e) na glavnim serverima, upisivanje na zavisnim serverima d) na glavnim serverima, upisivanje na glavnim serverima e) nijedno od prethodnih 4. Replikovanje MySQL-ovih podataka da a) su podaci uvek aurni b) serveri moraju biti povezani preko pouzdane mree, a ako jedan od servera postane nedostupan, drugi moraju da dok se on ponovo 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 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
17 Optimizovanje MySQL servera u OVOM POGLAVLJU NEKOLIKO ubrzavanja MySQL servera. Podeavanje servera je opsena tema i ima izvesnih sa ezote- Naa namera je da vam u ovom poglavlju predstavim o osnove podeavanja servera. teme: i povezivanje koda radi brzine rada Podeavanje parametara servera Podeavanje drugih Najvanije je imati u vidu da za sve izmene koje uvodite na serveru u cilju njegovog optimizovanja morate primeniti empirijski pristup. Poku- ajte jednu po jednu izmenu i meri te performanse pre i posle nje. Jedino tako utvrditi da li izmena koju ste zaista poboljava performanse. Ako elite da pri ispitivanju dobijete zaista kvalitetne rezultate, najbolje je da due vreme U edan sat, jedan dan ili neki period) beleite upite koji se izvravaju na serveru i da zatim te iste upite ponovo izvrite na izmenjenoj konfiguraciji servera. i povezivanje koda radi brzine rada U poglavlju l, "Instaliranje MySQL-a", opisali smo instaliranje samo iz binarnih ver- zija instalacionih datoteka alatke RPM na Unixu). Ako tek upotrebu MySQL-a, to je svakako najjednostavniji ako nemate iskustva s pre- softvera koji imate na svom kao to je s korisnika Windowsa. Performanse svog servera moete poboljati ako preuzmete izvornu verziju koda i sami ga prevedete. Ukoliko imate s procesorom Pentium koji radi pod opera- tivnim sistemom Linux, primetno poboljanje performansi ako izvorni 1.22 Poglavlje 17 Optimizovanje MySQL servera kod MySQL-a prevedete prevodioca pgcc, koji optimizuje kod samo za procesor Pentium. (Tako dobijena izvrna datoteka nije kompatibilna sa AMD-ovim procesorima, zato je binarna verzija koju preuzimate s MySQL-ove Web lokacije prevedena prevodioca gcc.) Autor MySQL-a, firma AB, tvrdi da ser- ver moete ubrzati od 10% do 30% ako sami prevedete kod prevodioca i pravilno podeenih opcija- vie informacija o tome u MySQL- -ovoj dokumentaciji. Drugo poboljanje u s MySQL-ovom gotovom izvrnom datotekom jeste da prevedete MySQL s podrkom samo za skup (ili skupove) znakova koji name- ravate da koristite. U binarne datoteke koje preuzimate s Web lokacije je podrka za sve skupove znakova. (Vie informacija o skupovima znakova u poglavlju 12",Podeavanje MySQL-a" .) MySQL-ova dokumentacija sadri predloge o optimizovanju binarnih datoteka koje korisnici sami prevode za razne operativne sisteme. Osim toga, u diskusionim grupama na Internetu MySQL-u moete miljenja i savete u vezi s mnogim problemima za operativne sisteme i prevodioce koda. Arhive se nalaze na adresi http://lists.mysql.com Ukoliko elite da se pridruite diskusijama o prevodiocima, potraite forum na adresi www.lukelaura.com Podeavanje parametara servera Da biste optimizovali svoju konfiguraciju, pokuajte da podesite parametre MySQL servera. radi, vrednosti parametara servera na show variables; Uticaj vrednosti parametara na konfiguraciju servera sle- komande: show status; Druga korisna alatka koja da vidite ta se na serveru jeste Perl skript mytop, je autor Jeremy Zawodny. Ta alatka deluje kao ekvivalent Unixove komande top i prikazuje aktivne procese, procesa, trajanje itd. Osim toga, ta alatka da prikaete detalje MySQL-ovog procesa i vidite koji se upit izvrava. Skript moete preuzeti sa adrese http://jeremy.zawodny.com/mysql/mytop Sve navedene alatke da evidentirate izmene koje ste uneli i koj e one imaju na sistem. .. t'oaesavanJe parametar. 11 Datoteka opcija my.cnf sadri toliko veliki broj opcija da se moda pitati odakle da Uz verzija MySQL-a dobijate i prime re datoteka my. en t , koje se nalaze u direktorijumu support-files instalacije. U tom direktorijumu predloga za datoteku my. cnf: my-huge. cnf, my-large. cnf, my-medium. cnf i my- small. cnf. Izaberite jednu od njih kao datoteku op ci jn za svoj sistem. Najvaniji parametri koje treba da podesite jesu oni koji kako MySQL troi memoriju. Za svaki server baza podataka vai pravilo "to vie memorije, to bolje", ali je vano i da ta memorija bude na raspolaganju serveru baze podataka i da se pravilno raspodeljuje njegovih procesa. MySQL odrava grupu internih bafera i ostava. Moete podesiti memorije koja se odvaja za tu namenu. Dva najvanija parametra koja treba da podesite su key_buffer_size i table_cache. Poto te bafere dele sve niti koje rade na serveru, njihovo podeavanje ima veoma veliki uticaj na performanse servera. U baferu nazvanom bafer za (engl. key buffer) se blokovi MyiSAM indeksa. Kada aplikacija zatrai blok iz datoteke indeksa, on se u taj bafer. Kad god se izvrava neki upit, ako se blok indeksa nalazi u baferu, podaci se iz njega. U suprotnom, blok indeksa mora da se iz datoteke na disku u bafer za to je, razume se, sporije. Za bafer vai pravilo da to je to bolje slui svojoj svrsi . Kada razmatrate vrednost koju dodeliti parametru key_ bu ff er_ s i ze, treba da uzmete u obzir ukupnu memorije s kojom raspolaete, da li se koristi kao MySQL server ili slui i za druge poslove, a vana je i datoteka indeksa (tj. ukupna .MYI datoteka).Jeremy Zawodny, poznati koji odrava servere kompanije Yahoo!, da na koji radi kao MySQL server,parametru key_buffer_size dodelite vrednost u opsegu 20% i 50% ukupne memorije na je u pitanju deljen jasno je da vrednost tog parametra treba da bude manja. Ukoliko podaci vaih indeksa zauzimaju samo 20 MB, bilo bi besmisleno da bafera za podesite na 128 MB. Imajte u vidu i to da se bafer za koristi za MyiSAM tabele. Za druge tipove tabela postoje drugi parametri koje treba podesiti. Nema svrhe da znatno bafer za ako, na primer, radite sa InnoDB tabelama. U tom vaniji je parametar innodb_buffer_pool_size. U baferima za InnoDB se i podaci indeksa i podaci tabela. (Vie informacija o podeavanju za rad sa InnoDB tabelama u poglavlju 12 i u MySQL-ovoj dokumentaciji.) Drugi zaista vaan parametar je ostava za tabele (engl. table cache) kojom se upravlja opcije table_cache.Vrednost te opcije 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. da je otvaranje i zatvaranje dato tc b spora operacija, te datoteke ostaju otvorene dok ne budu zatvorene, server spu ten, ili dok ukupan broj otvorenih tabela ne premai vrednost parametra table_cache. Poglavlje 17 Optimizovanje MySQL servera vrednosti parametra table_cache korisno je kada na serveru imate veliki broj tabela. da va operativni sistem ukupan broj otvorenih datoteka u isto vreme, ili ukupan broj datoteka koje jedan proces ili korisnik moe drati 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 dodeljuju blokovi memorije- kao to su, na primer, bafer za sortiranje (engl. sort buffer) i br.ifer za (engl. read tih b afera je jednaka za svaku nit, ali svaka nit moe koristiti tu memorije za drugu namenu. U bafer za se parametrom read_buffer_size, sme- taju se podaci iz tabele kada se njen sadraj sekvencijalnim redosledom (engl. table sca11). to se vie podataka iz tabele moe smestiti u bafer, to biti manji broj opera- cija sa diska; ako je vrednost tog parametra previsoka, grupa bafera za koje niti koriste moe potroiti previe memorije. Moda se da se u ranijim verzijama ovaj parametar zvao bafer za zapise (engl. record buffer) a muje parametar record_buffer. Bafer za sortiranje, parametar sort_buffer, koristi se pri izvravanju upita koji sadre odredbu ORDER BY, tj. slui za sortiranje podataka. Ako sorti rate velike podataka, bafer za sortiranje, ali i za njega vai isto upozorenje kao i za bafer za zapise. Podeavanje drugih Na kraju, jo nekoliko saveta koji vam mogu pri podeavanju konfigu- racije sistema. to se operativnog sistema MySQL Solaris kada elite da maksimum od s vie procesora. Iako postoje verzije MySQL-a za razne ope- rativne sisteme, razvoj i testiranje obavljaju se na Solarisu, bi to po logici stvari trebalo da bude najbolje optimizovana platforma. Ukoliko moete da nabavite vie diskova, performanse ako baze poda- taka rasporedite na diskove. U tom moete koristiti i RAID konfiguracije - RAID O poboljava performanse pri i pisanju, a RAID l ili 5 poboljavaju performanse pri Osim toga, SCSI diskovi bolje per- foJillanse od IDE diskova. Moete razmotriti i upotrebu urnalskog sistema datoteka (engl.journalingjile 1ystc'111), kao to je Reiserfs ili XFS. Tako moete jo vie poboljati performanse. Rnume se, boljitak moe se povezivanjem klijenata i servera preko bt7C mree, to vai i za glavne i zavisne servere u replikovanju. Saetak da je tema optimizovanja MySQL-a toliko opsena da zasluuje zasebnu obavcwo nastavite s prikupljanjem informacija i istraivanjem te oblasti. .. Performanse poboljati ako sami prevedete izvorni kod MySQI ,, 11 11 1 illi datoteku, ako imate koji radi pod Linuxom ili ima JlllH l'''" Pentium. Podesite parametre servera za bolje performanse, one koje sc odnosa na potronju memorije. Velika memorije na uvek Jt' korisna, ali je vanije kako se ona raspodeljuje. Evo nekoliko posebno va n ih parametara: key _buffer_size: memorije koja biti odvojena za skladitenje MyiSAM indeksa. table_cache: Ukupan broj tabela koje mogu biti otvorene u isto vreme. read_buffer_size: memorije koja se koristi pri sekvencijalnom tabela. sort_buffer: memorije koja se koristi za skladitenje podataka iz tabela kada se odredbe ORDER BY zahteva sortiranje podataka. Poboljajte hardver ugradnjom dodatne memorije, RAID grupe diskova, upo- trebom urnalskog sistema datoteka i brze mree klijenata i servera, te glavnih i zavisnih servera. Pitanja l. Parametar koji koliko memorije biti odvojeno za skladitenje 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 koliko memorije biti odvojeno za keiranje 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 koliko memorije biti odvojeno za keiranje podataka My ISAM tabela je a) key_buffer_size b) table cache e) innodb_key_buffer_size d) read_buffer_size u Poglavlje 17 Optimizovanje MySOL servera 4. Parametar koji koliko memorije biti odvojeno za keiranje 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 broj niti sekvencijalno pretrauje tabele, problem b) uvek se moe dodati nov indeks, pa zato MySQL nikad morati da sekvencijalno pretrauje tabele e) time se rasipa prostor na disku d) nijedno od prethodnog Vebe Eksperimentiite programa za merenje performansi dok parametre navedene u ovom poglavlju podeavate na vrednosti . Moete li optimalnu vrednost svakog od tih parametara za svoj sistem? Odgovori Pitanja l. b 2. b 3. d 4. a S. a U poglavlju U sled poglavlju," Optimizovanje baze podataka", 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 podeava za optimalne performanse. U ovom poglavlju kako moete optimizovati tabele baze podataka. Standardna pravila i preporuke za strukture i normalizovanje tabela pobolj- avaju performanse. Postoje i drugi izbori koje moete napraviti kada projektujete bazu podataka, zbog kojih proizvod biti bri ili sporiji. U ovom poglavlju te izbore. teme: ta usporava MySQL-ove baze podataka Napravite pravilne izbore pri projektovanju Upotreba indeksa za optimizovanje performansi tabela Komanda OPTIMIZE TABLE ta usporava MySQL-ove baze podataka Poto ste prethodno poglavlje o optirnizovanju servera, moete na opti- mizovanje baze podataka. U narednom poglavlju se optirnizovanjem upita. Ako ste optirnizovali server (moda po cenu ugradnje dodatnog hardvera), sle- korak je da razmotrite da li se bilo koja od navedenih odnosi i na va Nemam dovoljno indeksa. Uzrok broj jedan loih performansi jeste upotreba tabela kojima nije pridruen nijedan indeks ili nema indeksa za kolone koje pretrau- jete.To ne da treba imati to broj indeksa jer preterivanje u suprotnom smeru moe biti uzrok problema na listi. Imam previe indeksa. Da bi se aurirao veliki broj indeksa, svaki put se u belu upie nov red ili aurira a to potraje. Kada podatke, indeksi '> ll veoma korisni. Kada upisujete nove redove, odnosno aurirate ili brit:lc pm111 redove, indeksi postaju problem. Kad god aurira te neki podatak, 11101 .q11 aurirati i indeksi, to produava obradu i si slCill ;l ll Poglavlje 1 B Optimizovanje baze podataka Dodeljujem prava za tabele i kolone tabela. Ako prava dodeljujete pojedi- za tabele ili kolone bilo kog resursa, kad god korisnik poalje upit na izvra- vanje, MySQL mora da koja su sve prava za tabele i kolone tabela zadata. Struktura baze podataka nije optimalna. Postoje da se struktura baze podataka projektuje tako da se upiti bre izvravaju. U naredna dva odeljka strukture baze podataka i indekse koji omo- ubrzavanje rada s bazom podataka. Pravilni izbori pri projektovanju baze podataka Postoji vie pravilnih izbora koji, ako ih napravite pri projektovanju baze podataka, doprinose poboljanju njenih performansi. To su Uvek upotrebite najmanji tip podataka koji je dovoljan za podatke s kojima raditi. Na primer, ako u koloni tabele samo brojeve od 1 do 10, nemojte zadati tip INT, tip TINYINT. to su redovi i manje tabele, to se one bre pretraivati. to su podaci manji, vie se redova moe keirati u memoriju. Koristite zapise fiksne duine gde god je Ako su svi redovi tabele jed- nake duine, MySQL bre pristupa redovima u sredini tabele. Da bi tabela imala redove fiksne duine, tipovi podataka u svim kolonama moraju biti fiksne duine. To da ne sme biti kolona tipa VARCHAR, TEXT, niti BLOB. Ako vam je neophodan tip TEXT i BLOB, moda biste mogli da denormalizujete emu tabele tako da polja tipa TEXT ili BLOB izdvojite u zasebnu tabelu. Ukoliko imate kolone tipa VARCHAR, razmislite o tome da ih zamenite kolonama tipa CHAR. To je kompromis,jer podaci tipa CHAR zauzimaju vie mesta na disku, to je u suprotnosti s prvom preporukom na ovoj listi. Gde god je deklariite kolone kao NOT NULL. Ako je priroda vaih podataka takva da su vrednosti NULL sasvim i prihvatljive, slobodno ih koristite. imajte u vidu da zbog toga gubite malo brzine i prostora, pa zato zadajte odredbu NOT NULL gde god je Birajte tip tabela za svaku tabel u Tabele koje ne podravaju transak- cije (na primer, My ISAM) manje sistem i zato su bre od tabela koje podravaju transakcije (InnoDB i BDB). MySQL podrava meanje vie tipova tabela u istoj bazi podataka. Izaberite najbri tip koji je pogodan za posao. (Vie informacija o pojedinim tipovima tabela u poglavlju 9, "Tipovi tabela u MySQL-u" .) Izaberite indekse. Ovu temu detaljno u narednom odeljku. U teim razmislite o denormalizovanju tabela da biste smanjili broj spojeva koji se uspostavljaju u upitima. da zbog toga vaa baza podataka postati mora za odravanje, to se ne .. u cilju optimizovanja .ste pratili gr:divo i vebe iz ove knjige, trebalo bi da imate bazu pod.lt.lka kn 1 ,1 pnmarne kljuceve. To da imate barem po jedan indeks za svaku tnbdll MySQL automatski pravi indekse za kolone koje deklariete kao PRIMARY KEY 1h UNIQUE. , pokuavat.e da optimizujete bazu podataka, korisno je ispitati da Ji ll' u nJ. OJ vdefimsan bilo kakav mdeks. Izostavljanje indeksa je greka pri projekta o vanJU. seme baze podataka. SQL-ova komanda DESCRIBE prikazuje koji sve indeksi postoje za tabelu. Dakle, ta je indeks i slui? Indeks je referentnoj tabeli po tome to da se brzo odrc- red tabel1. Ako napravite indeks za kolonu X, pronalaenje traene vrednosti u tOj .. zna.tno je bre indeksa. Indeks pokazuje gde se u tabeli nalazi red kOJI sadrz1 to da se direktno na taj red. . Ako tabeh mJe pndruzen nijedan indeks, MySQL mora da pretrauje jedan po Jedan red tabele dok ne redove koje ste zahtevali. Zamislite da morate da u ovoj knjizi tako to od prve stranice i svaku ree na stran1e1. tn o je bre da u indeksu knjige potraite temu koja vas zamma 1 da zat1m direktno na stranicu koja vam treba. U MySQL-u se po.daci indeksa u obliku b-stabala (binarna stabla); to su strukture podataka koje se vrlo brzo pretrauju. . mogu kolonu ili vie njih (isto kao tabela). Pri IzvrsavanJU up1ta, b1ce upotrebljen mdeks ukoliko se pretrauje jedno od Kolona kojoj _je jednokolonski indeks- na primer, ako je u tabeli mdekmana kolona departmentiD i treba izvriti upit slede- cem: SELECT .. . WHERE departmentiD=n. Grupa za koju postoji indeks - na primer, ako za tabelu postoji indeks za kolone (client ID, employeeiD work- date) 1 treba izvriti upit SELECT .. . WHERE client AND employeeiD=y AND workdate=z . ili grupa kolo.na koja je deo viekolonskog indeksa, pod uslovom da je to levz grupe. mdeks1ramh kolona - na primer, ako za pomenutu tabelu assign- ment Imamo mdeks za kolone (clientiD, employeeiD, workdate) on biti upotrebljen u upitima vrste: ' SELECT ... WHERE clientiD=x SELECT ... WHERE clientiD=x AND employeeiD=y Ali ne i u upitima nalik na SELECT ... WHERE employeeiD=y AND workdate=z Sutina cele je u ako da se izvravati veliki broj upita kolonama 1h grupama kolona koje ne ispunjavaju navedene uslove, trebalo bi da Izdate komandu CREATE INDEX da biste napravili indeks. Imajte u vidu - r .. ---.J- ---- da MySQL moe da koristi samo po jedan indeks po tabeli u upitu. Nije automatsko kombinovanje vie indeksa. Ovo pitanje detaljnije razmotriti u poglavlju 19",0ptimizovanje upita", kada budemo doli do komande EXPLAIN. Komanda ANALYZE TABLE Izdajte komandu ANALYZE TABLE da biste prikazali i snimili raspored u tabeli. MySQL te podatke i koristi ih pri donoenju odluke o tome kako spojiti tabele u upitu. Komanda se izdaje na analyze table imetabele; Komanda OPTIMIZE TABLE Na kraju, moramo pomenuti komandu OPTIMIZE TABLE. Njena vrlo jednostavna sintaksa izgleda ovako: OPTIMIZE TABLE imetabele; To je MySQL-ov ekvivalent komande za defragmentiranje diska. Tokom upotrebe baze podataka, u datotekama u kojima se podaci raste broj praznina blokova podataka na mestima gde su ranije bili izbrisani zapisi ili odakle su zapisi premeteni zato to su nakon auriranja postali Te praznine su uzrok slabije efikasnosti. Trebalo bi da povremeno upotrebite komandu OPTIMIZE TABLE ukoliko ste izbri- sali podataka, ili ako ste dodali, izbrisali ili aurirali broj redova pro- menljive duine. Tako preurediti podatke u datotekama, ponovo sortirati indekse i aurirati podatke o tabeli. U vreme pisanja knjige, ova komanda je delovala samo na MyiSAM i BDB tabele. Saetak Strukturu baze podataka moete optimizovati tako to odabrati tipove poda- taka manje i fiksne duine, definisati indekse i koristiti tipove tabela. Indeksi brzo pronalaenje zapisa traenih na osnovu vrednosti u indeksiranim kolonama. Indeks 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 defrag- mentiranju diska. Pitanja Pitanja 1. Koja je od tvrdnji o indeksima a) Indeksi zauzimaju previe prostora na disku i zato ih ne treba koristiti. b) Ako tabeli nije pridruen nijedan indeks, upit se moe izvravati sporije. e) Trebalo bi da indeksirate to broj kolona. d) Nijedna od prethodnih. 2. Kada birate tipove podataka za kolone tabele a) trebalo bi da koristite iste tipove u celoj bazi podataka jer tako ona postaje efikasnija b) trebalo bi da koristite tipove podataka promenljive duine gde god je jer se tako optimizuje upotreba prostora na disku e) trebalo bi da koristite tipove podataka fiksne duine gde god je da biste ubrzali pristup podacima d) nijedno od prethodnog 3. Kada birate tip tabela a) uvek birajte InnoDB ili BDB zato to podravaju transakcije b) uvek birajte MyiSAM zato to su najbre e) koristite meavinu tipova, u zavisnosti od svrhe tabele d) nijedno od prethodnog 4. Indeks biti upotrebljen ako se u upitu a) koristi levi kraj grupe indeksiranih kolona b) koriste sve kolone indeksa po redosledu 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) definiete tabelu, da biste poboljali njenu strukturu b) kada koristite InnoDB tabele, da biste smanjili sistema e) nakon izvravanja broja komandi SELECT nad tabelom d) nakon izvravanja broja komandi DELETE nad tabelom ... 1"" ___ ........... Vebe U kojem od upita u bazi podataka employee biti upotrebljeni indeksi? (Potraite u poglavlju 4, "Pravljenje baza podataka, tabela i indeksa", strukturu baze podataka. Ili, ako ste je instalirali na svoj pogledajte 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 izvravaju, koje biste dodatne indekse napravili? Odgovori Pitanja l. b 2. e 3. e 4. b S. d Vebe [ndeks se koristi samo u upitu pod b). Trebalo bi indeksirati kolone employee . department ID i employeeSkills. skill. U poglavlju U (i poslednjem) poglavlju, "Optimizovanje upita", kako moete utvrditi da li se upit izvrava brzo ili sporo, i zbog kao i to kako reiti problem. 19 .. Optimizovanje upita M YSQL DA ANALIZIRATE upit da biste saznali za koje se vreme izvri i kako se izvrava nad sadrajem baze podataka. Na osnovu tih podataka i poznavanja na koji MySQL pokuava da optimizuje upite, ponekad moete da poboljate performanse upita. U ovom poglavlju teme: Otkrivanje sporih upita Merenje performansi upita Upotreba dnevnika sporih upita Upotreba komande EXPLAIN za prikazivanje na koji se upiti izvravaju MySQL-ov mehanizam za optimizovanje upita Saveti o optimizovanju upita Otkrivanje sporih upita Da biste optimizovali aplikaciju, morate najpre utvrditi koji njeni delovi imaju udeo u ukupnom vremenu izvravanja. To moete obaviti na nekoliko Posmatranjem: daje neophodno optimizovanje zbog toga to se upit izvrava brzinom premorenog pua. Merenjem: Testirajte aplikaciju da biste saznali koji se njeni delovi sporije izvravaju. Uvidom u dnevnik sporih upita: U ovaj dnevnik belee se spori upiti, kao to biste i na osnovu njegovog imena. Poto identifikujete spori upit, komande EXPLAIN moete saznati kako ga MySQL izvrava da biste zatim pokuali da ga optimizujete. nije potrebno da ubrzate ba sve upite koji se koriste u aplikaciji . samo manji deo koda oduzima deo ukupnog vremena izvravanja. Ukoliko va sistem nije izuzetno besmisleno je da gubite vreme da ubrzate delove aplikacije je udeo u ukupnom vremenu relativno mali . Merenje performansi upita Merenje performansi (engl. benchmarking) korisno je za reavanje svih vrsta problen:a optimizovanja. Merenje performansi u ovom merenje vremena za koje se upit izvri. Najbolje je da upit izvrite vie puta i da zatim vreme njegovog izvravanja. da trajanje jednog izvravanja upita zavisi od ukupnog sistema, samo jedno merenje moe dati rezultate. i to da bi upit trebalo da se bre izvri kada ga pokrenete drugi put jer je smeten u ostavu (ke). Razume se, moete koristiti spoljne skriptove ili programe posebno napisane tako da isti upit izvravaju vie puta. Ako vas zanima primer takvog programa, preuzmite distribuciju MySQL-a sa izvornim kodom i potraite programe za merenje perfor- mansi u direktorijumu sql-bench. U MySQL-u moete meriti brzinu vrednosti bilo kojeg izraza i upita) funkcije BENCHMARK(). Na primer: select benchmark(lOOOOOO, 6*9); Ova komanda daje rezultate nalik na +-------------------------+ l benchmark (1000000, 6*9) l +-------- -----------------+ o l +-------------------------+ 1 row in set (0.25 sec) Funkcija prihvata dva parametra: koliko puta treba vrednost izraza (u ovom primeru, milion puta) i izraz koji se (u ovom primeru, est puta deve0. .. da nas pri merenju performansi ne zanima rezultat upita SELECT, funkclJa BENCHMARK () uvek rezultat nula. Pri merenju nas zaista zanima za koje vreme se upit izvrio. Iz navedenog primera rezultata vidi se daje proizvoda 6 x 9 milion puta na mom trajalo sekunde. Funkciji BENCHMARK () moete 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 dnevnika sporih upita moete utvrditi koji se upiti presporo IzvrsavaJU. ddiniete ta je "sporo", ali taj parametar morate izraziti u sekundama, kao celobroJnU vrednost. upotreoa komande EXPLAIN za prikazivanje na koji sc upili l1vr .!Valu Beleenje sporih upita u dnevnik moete opcije --log- slow -queries=imedatoteke, koju zadate kada MySQL, ili u datoteci opcija. Ako i opciju --log-long-format, evidentirani i svi upiti pri sc izvravanju ne koristi nijedan indeks. To vam moe da lake utvrdite treba da f>osvetite najvie panje pri optimizovanju. Zadavanjem vrednosti promenljivoj long_query_time ta je za vas spor upit. Moete je zadati u konfiguracionoj datoteci ili komande SET. Vrednost te promenljive izraava se u sekundama. Dnevnik sporih upita moete neposredno jer je to tekstualna datoteka. Moda smatrati korisnijim saet spisak upita koji se sporo izvravaju. Takav spisak moete prikazati skripta mysqldumpslow (u direktorijumu scripts instalacije MySQL-a). Poto je to skript napisan na jeziku Perl, ako koristite Windows, morate prethodno instalirati Perl ukoliko gaj o nemate. (Preuzmite ga sa adrese www. active- state. com.) Jedno od MySQL-ajeste to da ne belei spore upite izvravanje traje manje od sekunde. Na sistemima koji relativno veliki broj jednostavnih upita, jedna sekunda "traje" veoma, veoma dugo. Administrator moda eleti da zna kojim je upitima potrebno vie od desetinke ili nekog drugog dela sekunde. To biti u jednoj od verzija MySQL-a. Upotreba komande EXPLAIN za prikazivanje na koji se upiti izvravaju Komanda EXPLAIN nalae MySQL-u da "objasni" kako namerava da izvri upit. Kao jednostavan primer, moete zadati explain select e.name, d.name from employee e, department d where e.departmentiD = d .departmentiD; Kao to vidite, ispred jednog sasvim upita samo smo dodali re EXPLAIN. Zbog toga se upit izvriti,jedino se prikazati podaci o tome kako MySQL pla- nira da izvri upit. Trebalo bi da se prikau rezultati nalik na ... --- +------------ +-- ---- -+------- -+--------------- +-------- -+-------- -+--------------- -+------ +------ -+ 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 je da se u skupu rezultata pojavljuje po jedan red za svaku tabel u u upitu. Redosled redova je jednak redosledu kojim tabele biti s po jene u upitu. Tabela rezultata ima kolone: id Redni broj. Ako jedan upit sadri vie komand1 !.J EI . EC" I' - 11 ,1 JliiiiH:I, bd.1 je u upit podupit- svaka komanda SELECT dobtj.l rLdni broj . select type Vrsta komande SELECT koja se izvrava. U ova kolona SIMPLE, kao u prethodnom primeru, to daje u pitanju sasvim upit SELECT. Ako imate podupite, spoljni upit biti PRIMARY a unutranji upiti SUBSELECT ili DEPENDENT SUBSELECT u koreliranih upita. table Ime tabele na koju se red odnosi . type Ovo je najvanija kolona pri optimizovanju i prikazuje na koji 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 NULL. key Ova kolona pokazuje koji je indeks izabran za upit. Ako nije izabran nije- dan, u koloni se prikazuje NULL. key len Duina indeksa koji je MySQL da upotrebi. ref Vrednost s kojom se poredi sadraj kolone pri koji se redovi izdvajaju u skup rezultata upita. rows Pro cena broja redova koje MySQL morati da iz jedne tabele da bi se dobio rezultat upita. Mnoenjem vrednosti broja redova moete utvrditi koliko redova biti Time dobijate red brzine izvravanja upita. Extra Ova kolona moe sadrati dodatne podatke. Na primer, komentar using index da MySQL moe u potpunosti rezultate upita iz jednog od indeksa i nema potrebe da podatke iz tabele. Dakle, ta nam rezultati govore u ovom primeru? Tip spoja ALL za tabelu employee da biti pretraeni svi redovi te tabele. Razume se, to biti spora operacija ako tabela sadri veliku podataka. U stvari, spoj tipa ALL je najgori rezultat. Njega dobiti kad god tabela nema nijedan indeks koji bi se mogao upotrebiti u upitu. optimizac4ija u tom slu- jeste da dodate indeks. To je objanjeno u nastavku ovog poglavlja. U redu koji se odnosi na tabelu department stoji daje spoj tipa eq_ref, to da se iz tabele department 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 da u tabeli postoji samo jedan red koji odgovara uslov1ma up1ta l da sc zato ta tabela moe tretirati u upitu kao konstanta. tip spoja u upitu nam odgovara. y-'u'--uv uyraaen1 mehamzam optimizovanja upita Ovo su ostale vrednosti koje se mogu pojaviti u koloni type: ref Iz tabele biti svi redovi koji sadre vrednosti jednake vredno- stima u indeksu. To je prva slabija opcija od eq_ref i predstavlja situaciju u kojoj radite s vrednosti nisu jedinstvene . range Ovaj tip spoja je slabiji od tipa eq_ref , pa i od ref, a da iz tabele biti svi redovi iz odredenog opsega. index Ovo je bolje od tipa ALL, ali slabije od svih dosad navedenih tipova spo- jeva. Kada se prikae tip index, to da biti pretraen ceo indeks. To je bolje od pretraivanja cele tabele, ali daleko je od savrenog. Pogledajmo vrednosti u kolonama possible_keys i key. Za tabelu department prikazana je opcija PRI MARY i ime kolone primarnog to je kolona koja biti upotrebljena. Red tabele employee sadri vrednost NULL u obe navedene kolone, to da nema koji se moe upotrebiti i zato biti upotrebljen nijedan. To je jo jedna jasna naznaka da tabeli treba dodati nov indeks! Na osnovu tih podataka i pod pretpostavkom da taj upit biti relativno izvravan, pa bismo zbog toga eleli da bude bri, 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 U redu tabele employee sada stoji daje tip spoja index jer postoji indeks koji se moe upotrebiti . Novi indeks je naveden kao ali biti upotrebljen. U koloni Extra stoji da za tu tabelu biti upotrebljen indeks umesto same tabele, bi trebalo da upit bude neto bri. upotreba komande EXPLAIN jeste za da li biste bolje osmiljenih indeksa mogli da ubrzate upite, ali da se to moe i na druge MySOL-ov mehanizam optimizovanja upita MySQL prim.enjuje na upite vie pravila optimizovanja. Na osnovu procenjenog broja redova (koji prikazuje komanda EXPLAIN), MySQL koji bi bio najbolji redosled spajanja tabela. Ako smatrate da je njegova pro- cena pogrena, odredbom STRAIGHT JOIN zadajte redosled spajanja tabela. Merenjem performansi upita pre i posle te izmene, da li time stvari pobolj avate ili pogoravate. Kada bira indeks, MySQL trai indeks koji obuhvata manje od 30"/u redova tabele. Ako ne uspe da indeks koji ispunjava te uslove, sekvenCIJalno pretrauje tabelu. (To je vidljivo iz rezultata komande EXPLAIN za prethodni pttiiH"I upita, nakon dodavanja novog indeksa.) 18 Poglavlje 19 Optimizovanje upita Izrazi u odredbama WHERE optimizuju se na onome na koji mnogi pre- vodioci programskih jezika optimizuju izraze. Na primer, iz izraza se uklanjaju suvine zagrade. To je jedan od razloga zbog kojih moete slobodno dodavati zagrade u tekst upita da bi postao lake razumljiv. Ako se potpun rezultat upita moe dobiti iz podataka sadranih u indeksima, iz tabela se u nijedan red. Rezultat funkcije COUNT ( *} se dobija bez i prebroja vanja redova tabele jer su podaci potrebni za tu namenu smeteni odvojeno od tabele (u indeksu). da se u MySQL-ovoj dokumentaciji nalazi detaljan spisak svih optimizacija koje MySQL obavlja, ovde ga nismo ponovili. Ali i taj spisak nije potpun. Ako vas zanima kako radi optirnizator upita, moete njegov izvorni kod. Preporuke za optimizovanje upita Postoje tri najvanije stvari koje moete uraditi da biste optimizovali svoje upite: Dodajte indekse. Ako imate upit nad neindeksiranom kolo- nom koji se izvrava, dodajte indeks za tu kolonu. Vie informacija o tome kako MySQL koristi indekse u poglavlju 18, "Optimizovanje baze podataka". ne zaboravite iako indeks moe ubrzati postupak pronalaenja podataka u tabeli, odravanje indeksa u aurnom stanju produuje upisivanje podataka. Nemojte dodavati indekse koji se koristiti. Povremeno izdajte komandu ANALYZE TABLE. (Njena sintaksa je opisana u poglavlju 18.) Time aurirate podatke o raspodeli vrednosti koje MySQL Na osnovu tih podataka, MySQL redosled spajanja tabela u upitu. Ako vam se da MySQL spaja tabele redosledom, pokuajte s komandom ANALYZE TABLE. Povremeno izdajte komandu OPTIMIZE TABLE. (Njena sintaksa je opisana u poglavlju 18.) Time defragmentirate podatke u tabeli, sortirate indekse i auri- rate podatke o tabeli koje koristi optimizator upita. Saetak Otkrijte spore upite funkcije BENCHMARK (} ili dnevnika sporih upita. komande EXPLAIN utvrdite kako se upiti izvravaju Ubrzajte izvravanje upita dodavanjem indeksa a zatim ih ponovo ispitajte komande EXPLAIN. Komande ANALYZE TABLE i OPTIMIZE TABLE MySQL-ovom optimi- zatoru upita da dobro obavi svoj posao. Pitanja 1. funkcija BENCHMARK () a) rezultat izraza izvrav;liiJL' llll'JII b) vreme potrebno za izvravanJL' lllollol 1111 JilL e) nulu, bez obzira na ulazne JW .IIIH'IIl' d) nijedno od prethodnog 2. Izdali ste k?mandu EXPLAIN za odredeni up1t 1 11
11 1 0111 1 YI' 1 , ,j 11 , 111 1 1 d orl 1 dob1h ste t1p spoja ALL. To a) da iz tabele biti samo jedan IL'd b) tabele biti svi redovi koji sadre vredu osti JL'd. 111 kt VHdnn st1ma mdeksa e) da biti sekvencijalno pretraen ceo indeks d) da biti sekvencijalno pretraena cela tabela 3. ste EXPLAIN za upit i u koloni type jedne od tabela dob1h ste t1p spoja eq ref. To a) da iz tabele biti u samo jedan red b) tabele biti u svi redovi koji sadre vrednosti jedanke vredno- stlma mdeksa e) da biti sekvencijalno pretraen ceo indeks d) da biti sekvencijalno pretraena cela tabela 4. Izda.li ste k?mandu EXPLAIN za upit i u koloni type jedne od tabela dob1h ste t1p spoja index. To a) da iz tabele biti samo jedan red b) da tabele biti svi redovi koji sadre vrednosti jedanke vredno- Stlma mdeksa e) da biti sekvencijalno pretraen ceo indeks d) da biti sekvencijalno pretraena cela tabela S. 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) zadate redosled spajanja odredbe STRAIGHT JOIN e) ili a) ili b) d) ni a) ni b) 240 Poglavlje 19 Optimizovanje upita Vebe Pogledajte 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; funkcije BENCHMARK vie puta izmerite vreme izvravanja ovog upita i komande EXPLAIN utvrdite kako se on izvrava. Proverite da li moete brzinu izvravanja dodavanjem novog indeksa i ponovnim merenjem. Odgovori Pitanja 1. e 2. d 3. a 4. e 5. e Spisak termina u knjizi alijas alias nedelji vost atribut, obeleje attribrtle niti izvravanja b-stablo b-tree obeleje, atribut bafer za read bt!!Jer ostava za tabele bafer za key br"!!fer otpornost sistema bafer za sortiranje sort br!ffer na greke bafer za zapise record br!lfer podu pit blokiranje next key /ocking polje ponititi sadraja tabele table scan potvrditi sekvencijalnim preklapanje redosledom dva servera datoteka slike dumpfile "na Dekartov proizvod Cartesian product prenosni dnevnik dnevnik greaka error log 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 vie glavnih funkcionalna functional servera istovremeno zavisnost dependency glavni server master 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 candidate keys spoJ key spoljni koeficijent poveza- relevance value nosti s traenim ema baze podataka poJmOm tabela kolona column upit korelira n correlated unakrsni spoj, maina za skladitenje storage engine pun spoJ merenje performansi benchmarking zapis, slog n-torkc tup/es zavisni server nebitne stop words SVEUCIIlNAl<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 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 ; i zarez), 46 od), operator, 111 $(znak za dolar),116 * (zvezdica), 110, 116 Brojevi 1NF (prva normalna forma), 34-36 2NF (druga normalna forma), 36-37 3NF normalna forma), 37-38 A abs(), funkcija, 118 ACID transakcije, 149-150 activestate.com, Web lokacija, 235 adddate(),funkcija, 119 administriranje baze podataka datoteke dnevnika, 183 MySQL server, pokretanje i sputanje, 177-178 pranjenje ostava, 182-183 prikazivanje podataka o bazi, 178-180 prikazivanje podataka o dodeljenim pravima, 181 prikazivanje podataka o procesima, 181 prikazivanje podataka o tabelama, 181-182 prikazivanje statusa servera i vrednosti serverskih promenljivih, 180 skript mysqladmin,lista opcija, 184 unitavanje niti, 182 alijasi, komanda SELECT, 82-83 ALL, pravo, 160 ALL, rezervisana 102 ALTER TABLE, komanda, 56-57 ANALYZE TABLE, komanda, 230, 238 AND, operator, 112 anomalije pri auriranju podataka, 34 pri brisanju podataka, 34 pri dodavanju podataka, 33 anonimni nalozi, brisanje, 17, 202-203 ansi, opcija, podeavanje MySQL-a, 172 ANY, rezervisana re 102 aplikacije, provera ulaznih podataka, 204 operatori, 110 atributi, tabele baze podataka, 31 AUTO INCREMENT, rezervisana 49-51 autocornmit, reim rada transakcija, 147 AVG ROW LENGTH, opcija, optirnizovanje tabela, 51 avg(), funkcija, 122 auriranje redova tabela, 72-73 B BACKUP TABLE, komanda, 194 bafer za 224 bafer za definicija, 223 bafer za sortiranje, 224 baferi, 223 basedir, opcija, podeavanje MySQL-a, 172 baze podataka adtninistriranje datoteke duevuika, 183 MySQL server, pokretmlje i spuftmlje, 177-17 8 pra:bljetlje ostava, 182-183 prikazivmlje podataka o bazi, 178-180 prikazivmlje podataka o dodeljeuim pravima, 181 prikazivmlje podataka o procesima 181 ' prikazivanje podataka o tabelama, 181-182 prikazivatlje statusa servera i vreduosti serverskih promeuljivih, 180 serverske 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 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 OPTIMIZETABLE 230 preporuke, 227-228 principi projektovanja auomalije, 33-34 twrmalizovatlje, 3 4-3 8 NULL vreduosti, 34 reduudmlttwst i gubljetlje podataka, 33 vaua pitmya, 32 relacije 29 tipa ,Jeda tl prema jed au", 2 9 tipa .,jeda tl prema viJe", 2 9 tipa" vie prema vi! e 11 , 2 9 rep likovanje beziJedtlostle mere, 211 budt.tbwst, 216 d11evuik izmwa, 21 O dodeljivatlje prava za, 211 kopije teku{eg stmya, pravljerye, 212-214 otpomost Ila gre!ke, 209 preklapatlje servera 11a vm{e, 217 pri11cipi, 209-21 O p rovera glavtwg servera, 2 12 opterdetlja, 2 15 upotrebljive verz;;e MySQLtt, 210 vifestn1ki glav11i serveri, 2 17 zavistti serveri, i pokretmlje, 2 14 sistem za upravUanjc rci.Ki<lllllll bazama podat.1k.1 (RDBMS),11 ema, dcfinkJ-, 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 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 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 koma11de TRUNCATE, 72 redovi, drtpliralli, 84-86 redovi, 83-84 redovi, zameua, 70 redovi rezulltZta upittr,gmpismye, 86-87 spa)m!je, 95-99 stnrktura, metifmife, 56-57 zada""ife imena u kommrdi SELECT, 81-82 zapisi, 31 zadavanje apsolutnih in1ena., 81-82 BCNF (Boyce-Coddova normalna forma), 38 DDB (Berkeley), tip tabela, 50, 135 benchmark(), funkcija, 121, 234 llcrkeleyDB (BDB), tip tabela, 50, 135 IIIGINT, celobrojni tip podataka, 53 hin, dlrektorijum, 20 IIINARY, rezervisana 111 nje b.t7C podataka, komanda use, 43 podataka iz redova tnbela, 83-84 DLOB, tip podataka, 54 Doyce-Coddova normalna forma (DCNF),38
.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 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, podeavanje MySQL-a, 172 DATETIME, tip podataka, 55 datoteke dnevnika, 183 slike stanja, 188 datoteke opcija, podeavanje MySQL-a, 169-171 internacionalizovanje, 174 konfiguracione opcije za vie inst.:llacija na istom 173-174 mysqld, podeavanje 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 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 MyiSAM tabele, 129-130 DISTINCT, odredba, komanda SELECT, 84-86 DML (Data Manipulation Language), 42, 65 dnevnici aktiviranje, 183 dnevnik greaka, 183 log-bin, opcija, podeavanje MySQL-a, 172 log-error, opcija, podeavanje MySQL-a, 172 log-slow-queries, opcija, podeavanje MySQL-a, 172 opcije za dnevnike izmena, podeavanje MySQL-a, 173 prenosni, 21 O sporih upita, 183, 234-235 u Linuxu, 183 upita, 183 dnevnik izmena 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 korisnike, 159 tabele prava, 161 za baze podataka, 160 za 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 102 EXPLAIN, rezervisana podaci o izvravanju upita, 235-237 extra, vrednost, komanda EXPLAIN, 236 extract(), funkcija, 119 F fantomski podaci, nivo izolovanosti transakcija, 151 FIELDS, odredba, komanda LOAD DATA INFILE, 74 FILE, pravo, 160,203 filtriranje ulaznih podataka, bezbednosne preporuke, 204 FLOAT, tip podataka, 53 float, tip podataka, 48 floor(), funkcija, 118 FLUSH, komanda, pranjenje ostava, 182-183 FLUSH PRIVILEGES, komanda, 202-203 FLUSHTABLES, komanda, 137, 193 FOREIGN KEY, rezervisana 50 found rows(), funkcija, 121 fragmentacija, My ISAM tabele, 130 FROM, odredba podupiti, za izvedene tabele, 100 spojevi, 94 FULLTEXT rezervisana 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 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 109 upper(), 114 z.'l rad s datumima i vremen itna, 119-120 za rad sa znakovnim vrednostima obrada zuakovuih vreduosti, 114 poredenje ztrakovuih vred11osti, 115-117 za upravljanje tokom izvrlavanja, 113 funkcije za rad s datumima i vremenima, 119-120 funkcije za upravljanje tokom izvravanja, 113 funkcionalne zavisnosti, koncepti i terminologija, 32 G glavni serveri, replikovanje, podeavanje, 209-212, 215 globalna prava dodeljivanje, 160 zatita servera, 202 Google, Web lokacija, 135 GRANT, komanda odredba IDENTIFIED BY, 158 odredba ON,158 odredba REQUIRE, 159 odredba TO, 158 odredba WITH, 159 odredba WITH GRANT OPTION,159 grantor, kolona, tabela tables_priv, 164 GROUP BY, odredba, komanda SELECT, 86-87 grupisanje redova rezultata upita, 86-87 grupnt luni. t ll, l J l l grupno ttOHINtlt gubljenjo (llHiucul.,, l redunduutuwt.sunJ k tn 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 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 101 indeksi brisanje, 56 izrada, 55-56 jednokolonski, 229 levi kraj grupe, 229 optimizovanje baze podataka, 227, 229-230 optimizovanje upita, 238 viekolonski, 229 INDEX, rezervisana 50 INDEX, pravo, 159 index, vrednost, komanda EXPLAIN, 237 INDEX DIRECTORY, opcija, optimizovanje tabela, 51 InnoDB, konfiguracione opcije, podeavanje MySQL-a, 172-173 lnnoDB, tip tabela, 50 dosledno bez pod1caka, 134 transakcije, 143-146 ACID uskladeuost, 149-/50 izolo""11ost tmn<akcij11, 150- 152 reZi lli J 47- /49 uslovi licence, 135 Web lokacij.t, 135 11,1 IIIVnll rcd.t, 13-1 Indeks INSERT, komanda listing, 6S-66 odredbe, 68-69 opti oblik, 68 primer rezultata, 67 INSERT, pravo, 1S9 INSERT METHOD, opcija, optirnizovanje tabela, S1 instaliranje MySQL-a anonimni nalozi, brisanje, 17 lozinka korisnika root, zadavanje, 17 na Linux, 12 naOSX,14 naWindows,12-14 nalozi, pravljenje za poslove, 17-18 podeavanje sistema, 14-16 provera da li sistem radi, 16-17 instalirane datoteke, zatita filtriranje podataka, 204 zatita, 20S preporuke, 203 pristup i prava upotrebe, 204 provera ulaznih podataka u aplikaciji, 204 SSL (Secure Sockets Layer), 20S internacionalizovanje, podeavanje MySQL-a,174 ISAM tabele, SO 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 stanja, replikovanje, 212-214 naloga, za 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 187-188 dnevnika izmena, 194-19S razlozi, 1 87 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 195 program myisamchk, 196-198 program mysqlcheck, 197 tabela, 188 testiranje kopije, 19S izvrive datoteke, MySQL-ove, 20-21 J jednako (=), operator, 111 jednakovredni spojevi, 97 jednokolonski indeksi, 229 K kandidati za 31 karet (A), znak, 116 key, vrednost, komanda EXPLAIN, 236 key _len, vrednost, komanda EXPLAIN, 236 kandidati za i 31 kolone tabela datumski i vremenski tipovi podataka, S4 31 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 veze, 162 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 upotrebe resursa, tabela user, 162 kolone za uspostavljanje veze, tabela user, 162 komande. Videti i naredbe ALTER TABLE, S7 ANALYZE TABLE, 230,238 CHECKTABLE,196 COMMIT, transakcije, 147 drop database, 4S, S6 DROP INDEX, S6 DROPTABLE,S6,194 EXPLAIN, 23S-237 FLUSHTABLES,137, 193 FLUSH, pranjenje ostava, 182-183 LOCKTABLES,148-149,193 OPTIMIZE TABLE, 130, 230, 238 REPAIR TABLE, 130,196 R.ESET, pranjenje ostava, 182-183 SET aktiviranje datoteka dnev11ika, 183 reim autocommit, isklj'u{ivmije, 147 SHOW,23,180 START TRANSACTION, 147 UNLOCKTABLES, 148-149 komprimovanje concatQ, funkcija, 114 MyiSAM tabele, 131 kopije stanja, pravljenje, 212-214 interfejsi MySQL Control Center, 21 MySQL monitor, 21-23 phpMyAdmin, 21 nalozi. Videti i prava anonin1ni nalozi, brisanje, 202-203 anonimni, brisanje, 17 bezbednost auouinwi Halozi, brismije, 17 pravljenje za poslove, instaliranje MySQL-a, 17-18 zatita attmzinwi ualozi, brisanje, 202-203 lozi11kd z a tzalo_q root, 202 opmm1 20.1 .(i(toiW/JI' lo i11kl, ?OJ L last insert id(), funkcija, 121 length(), funkcija, 114 levi spoj, 98-99 LIKE, funkcija, 11S LIKE, odredba, 49 LIMIT, odredba komanda DELETE, 72 komanda SELECT, 88-89 komanda UPDATE, 72 LINES, odredba, komanda LOAD DATA INFILE, 74 Linux, instaliranje MySQL-a na, 12 listinzi baza podataka, formiranje tabela, 44-4S instaliranje MySQL-a, konfiguracione opcije, 14-16 izrada rezervnih kopija i restauriranje podataka, skript mysqldump, 188-191 MERCE tabele, 136-137 podeavanje MySQL-a, reenje s datotekom opcija, 169-171 primer komande INSERT, 6S-66 LOAD DATA INFILE, komanda, 73-7S load file(), funkcija, 114 locate(), funkcija, 114 LOCK TABLES, komanda, 148-149,191,193 LOCK TABLES, pravo, 1S9 operatori, 112 tekstualno pretraivanje, 133-134 long_query _time, promenljiva (dnevnik sporih upita), 23S LOW PRIORITY, odredba komanda DELETE, 72 komanda INSERT, 68 komanda LOAD DATA INFlLE, 74 komanda UPDATE, 72 lower(), funkcija, 114 lozinke ifrovanje, 203 za nalog root, 17, 202 M maksimalan broj znakova, identifikatori, 43 manje od (<),111 MATCH, funkcija, 11S max(), funkcija, 122 mdS(), funkcija, 121 MEDlUMINT, celobrojni tip podataka, S3 mcrenje performansi, upiti, 234 MERGE, tip tabela, 136-137 merge, tip tabela, SO MIN ROWS, opcija, optimizovanje tabela, S1 min(), funkcija, 122 mnoenje (*),operator, 110 mod(), funkcija, 118 My ISAM, tip tabela, SO 129-130 komprimovanje, 131 poboljanja u odnosu na ISAM tabele, 129 popravljanje, 130 pregled, 129 129-130 tekstualno pretraivanje, 131-134 myisamchk, ala tka za komandnu liniju, 130 myisamchk, program, 20, 196-197 MySQL instaliranje, 9, 11 auonimtzi tuzlozi, brisanje, 17 lozi11ka korimika root, zadava11je, 17 Ila U11ux, 12 na OS X, 14 11a Windows, 12-14 nalozi, pravlj"e11je za uobi{ajene poslove, 17-18 podefavo1zje sistema, 14-16 provera da li sistem radi, 16-17 izvrive datoteke, 20--21 interfejsi MySQL Control Ce11ter, 21 MySQL mo11itor, 21-23 phpMyAdmi11, 21 podeavanje I111zoDB, 172-173 itttemacioualizovanje 1 17 4 kot!figuraciol!e opcije za vife instalacija tUJ istom raluuant 1 173-174 mysqld, podefavo1zje opcija za, 171-172 refetzje s datotekom opcija, 169-171 server pokretarzje i spuftmzje, 177-17 8 prikazivanje podataka o procesima 1 181 server, optimizovanje parametri servera, 222-224 RAm diskovi,prepomka, 224 Solaris, preporuka, 224 struktura direktoriju ma, 19-20 MySQL Control Center, 21 MySQL monitor, 21-23 mysqladmin, program (skript), 20, 184 mysqlbinlog, program, 20 mysqlcheck, program, 197 mysqld, podeavanje opcija za, 171-172 mysqldump, skript, 20 nedostaci, 192 opcija --add-drop-table, 191 opcija --all-databases, 192 opcija --allow-keywords, 192 opcija --databases, 192 hill opcija --cxtcndd ""'"" l 'J l opcija --lock- tabl,.,, l 1 !2 opcija --no- dara, IIJ2 opcija --opt, 188 opcija --quick, 191 prednosti, 192 primer rezultata, '188 l 'J l mysqlhotcopy, skript, 192 l 9.1 mysqlshow, program, 20 N naredbe. Videti i komande ALTER TABLE, S6 DROP TABLE, 191 FL USH PRIVILEGES, 202 20.1 GRANT,1S8-1S9 LOAD DATA INF! LE, 73-7S LOCK TABLES, 191 ON, komanda GRANT, 1S8 R.EVOK.E, ukidanje prava pristupa, 161 SELECT, izraela tabela, S2 SET, podeavanje promenljivih, 182 show processlist, niti, 181 show variables, 180 SQL-ove CREATE DATABASE, 43 CREATETABLE, 44, 48-52 DELETE, 7{}-72 INSERT, 68-69 REPLACE, 70 SELECT, 8{}-89 TRUNCATE, 72 UPDATE, 72-73 UNLOCK,191 use, biranje baze podataka, 43 navodnici, identifikatori, 43 nebitne tekstualno pretraivanje, 132 niti, unitavanje, 182 normalizovanje Uoyce-Coddova normalna forma (BCNF),38 definicija, 34 druga normalna forma (2NF), 36-37 prva normalna forma (1 NF), 34-36 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 funkclJ, 117 liH tipovi putlut1'""' 1\ 1 '\ \ 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 11 O 112 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 meha11izam optimizovatifa upita, 237-238 OR, operator, 112 OS X, instaliranje MySQL-a na, 14 ostave, pranjenje, 182-183 otpornost na greke, replikovanje, 209 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, interfejs, 21 pid-file, opcija, podeavanje MySQL-a, 173 podaci, grupno unoenje, 73-75 podeavanje MySQL-a instaliranje, 14-16 internacionalizovanje, 17 4 konfiguracione opcije za vie instalacija na iston1 173-174 mysqld, podeavanje opcija za, 171-172 opcije za lnnoDB, 172-173 reenje s datotekom opctja, 169 171 pod upiti je rezultat jedna vrednost, 100-101 vrste, 99 za izraze 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 19S ' program myisamchk, 196-197 program mysqlcheck, 197 popravljanje My!SAM tabele, 130 s dokerskim znacima, funkcija UKE, 115 poredenje s regularnim izrazima, funkcija RLIKE, 115-117 sa opsegom vrednosti, operatori za 112 possible_keys, vrednost, komanda EXPLAIN, 236 power(), funkcija, 118 prava doddjivanje, IS7 global11a prava, 160 prava za admi11istmtore, 159 prava za obil'11e 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 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 replikovanje, 217 prenosivost, My ISAM tabele, 129 pre nosni dnevnik, 21 O pretraivanje MyiSAM tabele,131-134 tekstualno pretraivanje, 131-134 PRIMARY KEY, rezervisana 49 principi projektovanja, baze podataka anomalije NULL vred11osti, 34 pri auriraty'u podataka, 34 pri hrisanju podataka, J 4 fiti dm/m;wju p<>rlataka, JJ normalizovanje Boyce-Coddova twrmal11a forma (BCNF), 38 dn<ga llormalllajorma (2NF), 36-37 prva (1 NF), 34--36 11ormalllajorma (3NF}, 37-38 redundantnost i gubljenje podataka, 33 vana pitanja, 32 pristup datotekama, 204 prljavi podaci, nivo izolovanosti transakcija, 152 PROCESS, pravo, 160, 203 promenljive, podeavanje 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 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
replikovanje, 215 razlikovanje malih i velikih slova, identifikatori, 43 RDBMS (relational database management system), 31 read uncommitted, nivo izolovanosti transakcija, 152 redovi auriranje, 72-73 brisanje, 70-72 brisanje, komanda TRUN CATE 72 duplikati, 84-86 grupisanje, 86-87 tabela baze pod.u,tka, konnpu i 31 H3- H4 umetanje u t.tbdu, !.S ()\1 zamenjivanje, 70 redundantnost i gubljenje podataka, projektovanje baza podataka, 33 ref, vrednost, komanda EXPLAIN, 236 REFERENCES, pravo, 160 relacije definicija, 29 tipa ,j ceb n prema jedan", 29-30 tipa ,jedan prema vie", 29-30 ttpa "vie prema vie", 29-30 RELOAD, pravo, 160 RENAME, odredba, 57 REPAm TABLE, komanda, 130, 196 repeatable read, nivo izolovanosti transakcija, 150 replace(), funkcija, 114 REPLACE, komanda, 70 REPLICATION CLIENT, pravo, 160 REPLICATION SLAVE, pravo, 160 replikovanje baze podataka bezbednosne mere, 211 216 dnevnik izme na, 21 O dodeljivanje prava za, 211 hijerarhijski organizovani glavni serveri, 21S kopije stanja, pravljenje, 212-214 otpornost na greke, 209 podeavanje zavisnih servera, 214 servera na 21 7 principi, 209-210 provera glavnog servera, 212 sloenije topologije, 21S upotrebljive verzije MySQL-a, 210 viestruki glavni serveri, 217 zavisni serveri, pokretanje, 214 REQUIRE, odredba, komanda GRANT,159 RESET, komanda, pranjenje ostava, 182-183 RESTORE TABLE, komanda, 194 REVOKE, komanda, 161 rezervisane 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 rczervia11e kun lchntlllklltnrl 43 l RLIKE, lunkdjn, 11 117 ROLLBACK, rezt'rvhmrm l.ff1 root, nalog, lozinkn :ru, 17, lfP round(), funkcija, II H ROW FORMAT, opcija, optimizovanje ta be l rows, vrednost, kon1nndn EXPLAIN, 236 RPM datoteke, instaliranje MySQL-a iz, 12 izrada rezervnih kopija i obnavljanje podataka, 193-194 s sabiranje(+), operator, 110 sarnospojevi, 96 scripts, direktorijum, 20 Secure Sockets Layer (SSL), 205 SELECT, komanda alija.1i, 82-83 kolone, 80 izrada tabela, S2 odredba DISTINCT, 84-86 odredba GROUP BY, 86-87 odredba HAVING, 87 odredba LIMIT, 88-89 odredba ORDER BY 87 odredba WHERE, 83..:_84 opti oblik, 80 primer jednostavnog upita, 80 tabele, 81-82 zadavanje baze podataka, 81-82 SELECT, pravo, 159 select_type, opcija, komanda EXPLAIN, 236 serializable, nivo izolovanosti transakcija, 150 serveri glavni, u replikovanju, 209-212, 21S MySQL pokretarye i spt<ftatife, 177-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 reim autocommit, 147 serverske promenUivc, podeavanje, l !!2 SET, tip podataka, 54 shared-mcmory-ban-nnw, opcija, podcJnvnllJt MySQL-n, 173 SHOW, konmntln, ll, l Hil SHOW DAT/\111\SI , l"'"''' l \1 1\1 IIIUI:II.) show processlist, komanda, 181 show variables, komanda, 180 SHUTDOWN, pravo, 160 sistemi za upravljanje relacionim bazama podataka (RDBMS), 31 skupovi znakova, podeavanje MySQL-a, internacionalizovanje, 174 Slashdot, Web lokacija, 135 Sleepycat, Web lokacija, 135 slow _queries, serverska promenljiva, 180 SMALLINT, celobrojni tip podataka, 52 socket, opcija, podeavanje MySQL-a, 173 Solaris, preporuka, MySQL server, tehnike optirnizovanja, 224 SOME, rezervisana 102 soundex(), funkcija, 114 spojevi tabela desni spojevi, 98-99 dve tabele, spajanje, 93-95 jednakovredni, 97 levi spojevi, 98-99 puni spojevi, 97 samospojevi, 96 unakrsni spojevi, 97 vie tabela, spajanje, 95-96 sputanje MySQL servera, 177-178 sql-bench, direktorij um, 20 SQL-ove komande CREATE DATABASE 43 CREATE TABLE, 44,48-52 DELETE, 70-72 INSERT, 65---<i9 REPLACE, 70 SELECT, 80-89 TRUNCATE, 72 UPDATE, 72-73 sqrt(), funkcija, 118 SSL (Secure Sockets Layer), 205 START TRANSACTION, komanda, 147 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 31
lemn, definicija, 32 t.1bcla columns_priv, 164 tabela tables_priv, 164 tabele db, 163 tabele host, 163 tabele user, 162 Jifrovanje lozinki, 203 T tabele BerkeleyDB (BDB), 50,135 grupno unoenje podataka, 73-75 HEAP,50,138 indeksi jedrwkolonski, 229 levi kraj grupe, 229 229-230 vifekolomki, 229 lnnoDB,50 dosledno 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 tipovi podataka, 52-53 opcija unique, 50 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 129-130 komprimovane, 131 pobo(ifanja u odnosu rw ISAM tabele, 129 poprav(imije, 13 O pregled, 129 129-130 tekstualtw pretraivarije, 131-134 podrka za transakcije, 127-128 podupiti za izraze 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 auriranje, 72-7 3 brisatije: 70-72 brismije 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 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 podataka iz, 81-82 upiti je rezultat jedna vrednost, 100-101 188 tabele, podrka za transakcije BerkeleyDB (BDB), 135 lnnoDB dosled11o u{itavanje bez zakiju{avarija podataka, 13 4 uslovi licettce, 13 5 l#b lokacija, 13 5 zak(iu{avmije podataka 11a 11il.<lu reda, 134 tipovi tabela, 127-128 tabele prava, kolone tabela db, 163 tabela host, 163 tabele user, 162 table, vrednost, komanda EXPLAIN, 236 table_ cache, parametar, 223 tables_priY, tabela, prava pristupa, 164 i zarez (;),znak, 46 tekstualni i znakovni tipovi podataka za kolone BLOB,54 CHAR,53 ENUM,S4 SET,S4 TEXT,54 VARCIIAJ1..,54 tekstualno pretraivanje 133-134 MylSAM tabele, 131-134 TEMPORARY, rezervisana 49 TEXT, tip podataka, 54 threads_connected, serverska promenljiva, 180 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 158 trajnost podataka, transakcije, 150 transakcije definicija, 143-146 START TRANSACTION komanda, 147 ' u lnnoDB tabelama, 143-146 ACID uskladerwst, 149-150 izolova11ost tramakcija, 150-152 reim autocommit, 147-149 normalna forma (3NF), 37-38 trim(), funkcija, 114 TRUN CATE, komanda, 72 type, vrednost, komanda EXPLAIN, 236 u ubrzavanje MySQL servera, 221-222 mehanizam optirnizovanja upita, 237-238 funkcije/operatori, 109 ukidanje prava pristupa, 161 umetanje novih redova u tabelu 65-<i9 unakrsni spojevi, 97 UNION, opcija, optirnizovanje tabela, 51 UNIQUE, rezervisana SO UNLOCK TABLES komanda, 148-149 UNLOCK TABLES, komanda, 191 UNSIGNED, rezervisana 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 111eluwizam optimizovmija upita, 237-238 podupiti je rezultat jed t ta vredttost, 100-101 vrste, 99 za izraze tipa, 101-103 za izvedeue tabele, 1 OO spojevi tabela deSili spojevi, 98-99 97 levi spojevi, 98-99 ptmi spojevi, 97 samospojevi, 96 spajanje vife tabela, 95-96 unakrSIIi spojevi, 97 uppercase(), funkcija, 114 uptime, serverska promenljiva, 180 USAGE, pravo, 159 use, komanda, biranje baze podataka, 43 user, opcija, podeavanje MySQL-a, 172 user, tabela, prava pristupa kolone za upotrebe resursa, 162 kolone za opseg vidljivosti, 162 kolone za prava, 162 kolone za uspostavljanje veze, 162 podataka, transakcije, 150 uslovi licence, InnoDB tabele, 135 uspostavljanje veze s bazom podataka MySQL, testiranje, 16-17 SSL (Secure Sockets Layer), 205 zatita servera, 201 v tip podataka, 54 vece od(>), 111 viekolonski indeksi, 229 viestruki glavni serveri, replikovanje, 217 vremena, funkcije za rad s datumima i vremenima 119-120 vremenski tipovi podataka za kolone, 55 w Web lokacije activestate.com, 235 Google,135 lnnoDB,135 OpenSSL, 205 Slashdot, 135 Sleepycat, 135 Yahoo!, 135 WHERE, odredba komanda SELECT, 83--84 komanda UPDATE, 72 spojevi, 94-95 Windows 1\<loululoltll 1 prozor l IM Windows, lm! olhoonf 1\h 1 na,12-14 WITH, odredbu, kmmu11lt GRANT, 159 WITH GRANT 1'' 1' 11 IN, odredba, komandu l .ll i\ N 1 159 l WITH GRANT OP1'10N, l"" .,, 160,203 X XOR, operator, 112 y Yahoo!, Web lokacija, 135 YEAR, tip podataka, 55 z podataka na nivou reda, lnnoDB tabele, 134 podataka na nivou stranice, BerkeleyDB (BDB) tabele, 135 tabela, 188 zamena redova, 70 zapisi, tabele baze podataka, . koncepti i terminologija, 31 zastlta instalirane datoteke jiltrirmije podataka, 204 zaftita, 205 preporuke, 203 pristup i prava upotrebe, 204 provera ulaz11ih podataka u aplikaciji, 204 SSL (Secure Sockets Layer), 205 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, zatita, 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