Oracle Public Yum Server

Tuesday, 19.05.2009 – msutic

Neki dan se stroj na kojem često testiram razne stvari tako raspao da mu je jedini spas bio formatiranje diska i ponovna instalacija operativnog sustava.

Za operativni sustav sam se odlučio instalirati Oracle Enterprise Linux 5.

Znao sam da me nakon relativno jednostavne instalacije čeka zamorna potraga za paketima potrebnih za Oracle. No ovoga puta sam odlučio da neću pakete tražiti na cd-ovima nego ću se probati poslužiti Oracle Public Yum Serverom (http://public-yum.oracle.com/).

Yum konfiguracija je bila vrlo jednostavna.
Na web stranici možete naći konfiguracije za OEL4, OEL5 i Oracle VM 2.

OEL5
# cd /etc/yum.repos.d
# wget http://public-yum.oracle.com/public-yum-el5.repo

# vi /etc/yum.repos.d/public-yum-el5.repo

– te izmjeniti enabled=0 na enabled=1
Potom se mogu pokrenuti naredbe:
yum update
yum install
itd…
Ovo je jedna sitnica koja mi je ipak malo ubrzala konfiguraciju Linux stroja za potrebe Oracle-a s obzirom da sam inače najviše vremena gubio na pronalasku odgovarajućih paketa.

Super stvar! 🙂


Move to Oracle Database 11g – The whole Story

Thursday, 30.04.2009 – Dejan

Naletih danas na zanimljiv i prilično opširan PDF dokument o prelasku (upgrade) sa starijih Oracle verzija na najnoviju verziju 11g. Dokument pod nazivom “Move to Oracle Database 11g – The whole Story” možete naći ovdje, a password je upgrade11g.

Upgrade path to 11g


How to disable normal & scheduler jobs (DBMS_JOB & DBMS_SCHEDULER)

Tuesday, 21.04.2009 – Dejan

(Ako ima neka dobra duša da mi prevede naslov na srpski/hrvatski/crnski/gorski/balkancima-razumljiv-jezik, neka ostavi komentar)

Problem:

Periodično je potrebno napraviti kopiju produktivne baze za potrebe razvoja ili testiranja. Za tu svrhu možemo koristiti proces kloniranja baze (database cloning) ili restore-recover. Svejedno je koju metodu koristite.

Nakon što proces kopiranja bude gotov, po pokretanju kopirane baze automatski se pokreću definisani procesi (jobs)
Međutim, automatsko izvršavanje određenih procesa NIJE poželjno iz nekog razloga, kao npr.:
– proces kreira neki izvještaj i šalje ga putem emaila, pa primalac misli da je izvještaj iz produktivne baze
– proces vrši export podataka i pomoću UTL_FILE paketa kreira datoteku sa zastarjelim podacima na shared file serveru i to na destinaciji namijenjenoj samo za produktivne svrhe, usljed čega može doći do prepisivanja postojeće ispravne datoteke sa novijim podacima (file overwrited)

tj. iz bilo kojeg razloga, zbog kojeg bi došlo do mogućeg nesporazuma uzrokovanog pogrešnim podacima.

Cilj:

Dakle, trebalo bi nekako spriječiti automatsko izvršavanje definisanih procesa (poslova, tj. jobs) nakon pokretanja kopirane baze.

Rješenje:

Postoje dva načina kako da kreiramo neki posao (job) u bazi:
1. pomoću paketa DBMS_JOB
2. pomoću paketa DBMS_SCHEDULER (tek od verzije 10g)

Prvu vrstu poslova (DBMS_JOB) možemo deaktivirati tako što u init-datoteci vrijednost parametra job_queue_processes postavimo na nulu:

*.job_queue_processes=0

Tada će pozadinski procesi (J001, …, J00n), koji izvršavaju definisane poslove u bazi (jobs), biti deaktivirani i nijedan job neće biti pokrenut sve dok se parametar ne postavi na neku vrijednost veću od 0.

Drugu vrstu procesa (DBMS_SCHEDULER scheduled jobs) možemo deaktivirati uz pomoć AFTER STARTUP ON DATABASE okidača:

CREATE OR REPLACE TRIGGER tr_disable_scheduler 
AFTER STARTUP ON DATABASE 
DECLARE
  lvDBname   VARCHAR2(9);
  lvHostName VARCHAR(255);
BEGIN 
     
     SELECT LOWER(name) 
       INTO lvDBname 
       FROM v$database;

     SELECT LOWER(host_name) 
       INTO lvHostName 
       FROM v$instance;
      
     IF lvDBname <> 'proddb' AND
        lvHostName <> 'prodb.yourdomain.com'
     THEN 
       dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'TRUE');
     END IF;
END;
/

Ovaj okidač (trigger) uspoređuje naziv aktuelne baze i servera na kojem se ta baza nalazi, sa unaprijed definisanim nazivima produktivne baze i servera. Ukoliko su vrijednosti različite, to znači da aktuelna baza nije produktivna i da scheduler treba deaktivirati, a to obavljamo pomoću procedure
DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE(‘SCHEDULED_DISABLED’,’TRUE’).

Informacije o poslovima (jobs) možete dobiti iz pogleda (views) DBA_JOBS, DBA_SCHEDULER_JOBS i DBA_SCHEDULER_RUNNING_JOBS, na osnovu kojih možete provjeriti kad je posao zadnji put izvršen, koliko puta i kad je idući termin izvršavanja.


Oracle kupio Sun!

Monday, 20.04.2009 – Dejan

Dakle, klupko se polako odmotava.

Oracle je kupio Sun za 7.4 milijardi USD, a samim time je postao i vlasnik MySQL-a.

Biće zanimljivo pratiti budućnost Jave i MySQL-a pod Oracleovom palicom, a pogotovo razvoj Sunovih servera, jer je nedavno Oracle započeo stratešku saradnju sa HP-om. Oracle obećava nastavak razvoja svih postojećih Sunovih projekata, ali će vrijeme pokazati šta će se desiti sa dotičnima.


Recenzija knjige: Advanced Oracle SQL Programming

Monday, 06.04.2009 – Dejan

Niste se baš pretrgli u davanju glasova, koju knjigu prvu da pročitam i napišem recenziju o njoj, pa sam odlučio prednost dati knjizi “Advanced Oracle SQL Programming“, čiji je autor Laurent Schneider, Oracle Certified Master.

Moram odmah na početku reći da me knjiga prilično razočarala… Očekivao sam kvalitetne tekstove sa jasnim i konkretno argumentovanim primjerima, zatim “best practice” savjete i trikove, a naišao sam na zbrda-zdola nabacan popis postojećih SQL funkcija sa šturim primjerima i još šturijim objašnjenjima. Tu i tamo se pojavi neka endemična funkcija, koju skoro niko živ ne koristi (npr. LNNVL), čisto da prekine monotoniju…

Za oko mi je zapelo i korištenje zastarjele testne šeme SCOTT (sample schema), umjesto da je korištena HR šema, koja je odlična za učenje i testiranje, te koja osim toga JEDINA standardno dolazi pri instalaciji Oracle XE baze, a koju mnogi početnici koriste pri početku rada sa Oracleom ili oni napredniji za testiranje…

Znači, ako želite da isprobate neke primjere iz ove knjige, uvjerite se prvo da u bazi imate instaliranu šemu SCOTT.

Sadržaj je podijeljen na 7 poglavlja, a zaista naprednim Oracle SQL programiranjem se mogu označiti samo poglavlje o analitičkim funkcijama (4. Oracle SQL Analytics) i poglavlje o SQL za modelovanje (7. SQL For Modeling), te eventualno par stvarčica o hijerarhijskim upitima (6. Oracle Hierarchies) i o radu sa XML funkcijama (5. XML).

Dobro – da ne budem totalno negativan, priznaću da sam našao par zanimljivih i KORISNIH stvari, npr. MAX() KEEP(DENSE_RANK FIRST ORDER BY) i veoma upotrebljive putokaze o korištenju opcije MODEL za kreiranje dinamičkih tabličnih izvještaja (npr. Excel-like tablice).

Navedeno je i nekoliko SQL naredbi, koje dolaze tek u verziji 11g, a možda najzanimljivije su PIVOT i UNPIVOT.

Kompletan dojam popravljaju zadaci za vježbanje na kraju svakog poglavlja, jer vas tjeraju na razmišljanje i detaljnije čitanje tekstova, a nerijetko morate pogledati i službenu dokumentaciju o pojedinim funkcijama, nakon čega imate barem okvirnu sliku o spomenutoj tematici.

Knjiga ima oko 300 stranica, ali da je korištena manja veličina fonta, mogla bi se suziti na 200-250 stranica, tako da se može pročitati veoma brzo. Ja sam ju pročitao za svega nekoliko dana (par sati uveče i preko vikenda). Osim toga, ovo je već druga ili treća knjiga od izdavačke kuće Rampant, sa kojom nisam baš zadovoljan. Font je preveliki, tekstovi nisu perfektno složeni i korice se počnu raspadati nakon učestalog prelistavanja.

Sve u svemu, ako niste velika picajzla kao ja i ako nemate prevelika očekivanja, onda ćete vjerovatno biti zadovoljni ovom knjigom.

Ocjena: 6/10


Kako se to NE radi i kako se to radi

Saturday, 04.04.2009 – msutic

Prije nekih tjedan dana sam imao za zadatak migrirati Oracle 9.2.0.6.0 (Solaris 64-bit) bazu na verziju Oracle 10.2.0.4.0 (Linux 32-bit) i za način migracije sam odabrao export/import. Baza koju sam trebao migrirati nije bila prevelika, te bi sama migracija trajala oko sat vremena.

Kako bi ta akcija trajala što kraće odlučio sam malo po Oracle forumima i blogovima potražiti savjete/trikove kojima bi se export/import mogao malo ubrzati.

Bilo je tu svakakvih savjeta, ali ja bi se osvrnuo na savjet, koji se odnosio na promjenu nedokumentiranog parametra _disable_logging iz FALSE u TRUE.

Ukoliko se _disable_logging uključi „log switchevi“ će se i dalje događati, a jedina promjena je ta da LGWR neće logove zapisivati na disk. Tada bi dobio na ubrzanju s obzirom da bi reducirao I/O što je inače najveći potrošač vremena. Jedini rizik kojeg sam se “morao paziti” je da mi se instanca abnormalno ne sruši, da ne nestane struje, pokvari se disk i sl. Tada bi mi baza bila nepovratno uništena.

Kako se ovdje radilo o importu na posve praznu bazu odlučio sam se upotrijebiti taj parametar, pa makar se i dogodilo nešto strašno uvijek se mogu vratiti na staro, rekreirati bazu i ponoviti import. I zaista, primijetilo se ubrzanje importa, ali ipak na kraju mi se dogodila korupcija redo logova, akcija je propala, te sam idući dan sve morao ponovit iz početka bez igranja sa nedokumentiranim parametrima.

Ovaj post ima nekoliko bitnih poanti:
Nemojte dirati nedokumentirane parametre osim ukoliko od vas to ne traži Oracle podrška, ili ukoliko ste prilično sigurni da se ništa loše neće dogoditi.
– Kad god želite isprobati nešto novo, nemojte to isprobavati na produkciji, nego prethodno sve testirajte na što sličnijem (testnom) sustavu kako biste bili prilično sigurni da ništa neće poći po zlu.
Ne vjerujte na slijepo savjetima/trikovima sa Oracle foruma/blogova. Sve testirajte i tražite dokaze.

Osobno se uglavnom držim svega što sam naveo, te se usudim eksperimentirat samo ako se radi o testnom sustavu, ili ako sam prilično siguran da se veća šteta ne može dogoditi.

Iako najčešće volim sve i svašta testirati, moram priznati da postoje neki autori čije rečenice i savjete primam gotovo kao dokumentaciju, te se zna dogodit da iskoristim njihove savjete bez prethodnog testiranja.

Pa eto za kraj ću navesti pet blogova/web stranica (iako ih ima još) nekih Oracle gurua od kojih se može stvarno puno naučit i čije savjete uzimam sa vrlo velikom dozom sigurnošću da se ništa loše neće dogoditi:

1. Tom Kyte
2. Tanel Poder
3. Jonathan Lewis
4. Tim Hall
5. Richard Foote


Kako napraviti read only tabelu u Oracle bazi

Wednesday, 01.04.2009 – Dejan

Da, dobro ste pročitali! Ne read only tablespace, nego read only tabela!

Ukoliko ikad poželite neku tabelu prebaciti u read only režim (dozvoljen samo SELECT, a zabranjeni su INSERT, DELETE i UPDATE), onda postoji jednostavno rješenje – CHECK CONSTRAINT DISABLE VALIDATE.

Kako to izgleda u praksi, evo jedan primjer:

drop table read_only_tabela;

create table read_only_tabela (id number);

insert into read_only_tabela
select column_value
  from table(sys.odcinumberlist(1,2,3,4));

commit;

select * from read_only_tabela;

alter table read_only_tabela add constraint read_only_ck check(1=1) disable validate;

insert into read_only_tabela values(5);

ORA-25128: No insert/update/delete on table with constraint
(DEJAN.READ_ONLY_TABELA) disabled and validated

Čisto sumnjam da će vam ovo trebati u životu, ali nikad se ne zna. 😉


Virtualni indexi (NOSEGMENT index)

Tuesday, 31.03.2009 – Dejan

Kada radite na optimizaciji nekog SQL upita (performance tuning), često možete uočiti da se radi full table scan nad tabelom ili da se postojeći indexi ne koriste (ignorisani su). U tom slučaju odmah razmišljate o dodavanju još jednog indexa na dodatnim kolonama ili izmjeni postojećeg, jer vam se ne da prepravljati SQL upit.

Jedna od interesantnih stvarčica u Oracle bazi je i mogućnost kreiranja virtualnih indexa, koji ne zauzimaju fizički prostor u bazi. Virtualni indexi (NOSEGMENT indexes) su korisni u slučajevima, kada želite analizirati izvršavanje nekog SQL upita i vidjeti razliku u izvršavanju koristeći taj novi virtualni index u odnosu na tenutno (ne)postojeće indexe. Kada se uvjerite da bi korištenje indexa nad zadanim kolonama poboljšalo performanse, onda možete kreirati stvarni fizički index.

Naredba za kreiranje virtualnog indexa je:

CREATE INDEX virt_indx_blabla ON tabela(neka_kolona) NOSEGMENT;

a da bi Cost Based Optimizer uzeo u obzir te virtualne indexe, morate definisati jedan dodatni parametar na nivou trenutnog sessiona ili na nivou sistema:

ALTER SESSION SET "_use_nosegment_indexes"=true;

ili

ALTER SYSTEM SET "_use_nosegment_indexes"=true SCOPE=BOTH SID='*';

Detaljnije informacije o virtualnim indexima možete pronaći u dokumentaciji, a ja ću vam dati i jedan link ka odličnom objašnjenju na engleskom jeziku: Introduction to Fake / Virtual / NOSEGMENT Indexes


Imena luda, nalaze se svuda

Monday, 30.03.2009 – Dejan

drop table students; --


Logički model baze podataka za ankete

Wednesday, 25.03.2009 – Zidar

 

Ankete koje imaju ‘multiple choice’ pitanja su danas veome česte. Na svako pitanje nudi se N opcija od kojih učesnik ankete bira jednu. Broj opcija može biti različit od pitanja do pitanja. Neka pitanja zahtevaju jednostavni Da/Ne odgovor, a neka mogu imati i desetak opcija.

 

Najjednostavniji način da se dođe do valjanog modela je ER analiza. Počnimo opisom problema.

Kroz anketu želimo da postavimo odeđen skup pitanja učesnicima ankete. Ovo može da se kaže i drugačije (isto to samo malo drukčije, kako bi rekao Vuk Karadžić 😉 )

A)     Anketa se sastoji od pitanja.

B)      Učesnici u anketi odgovaraju na pitanja.

Iz ove dve rečenice počinjemo da crtamo ER dijagram.

 Za rečenicu (A) imamo

ankete_s1

 

Za rečenicu (B) imamo:

ankete_s2

 

Ako spojimo rečenice (A) i (B) dobijamo ovakvu sliku:
ankete_s12

 

Poslednja slika se lako prevodi u ovakav model:

 

anket_s12_rele

 

Ovakav model omogućuje nam da:

1)      Čuvamo više anketa u bazi podataka. Svaka anketa jeste jedan red u tabeli Ankete

2)      Za svaku anketu definišemo proizvoljan broj pitanja, sa proizvoljno dugačkim tekstom. Pitanja koja se postavljaju u specifičnoj anketi čuvaju se u tabeli PitanjaAnkete.

 

U nenormalizovanim rešenjima, svako pitanje je jedna kolona u tabeli, koja se zove MojaVelikaAnketa. Dve ili više anketa sa različitim brojem pitanja u istoj tabeli nisu moguće. Tekst pitanja ne postoji u nenormalizovanom modelu. Tekst pitanja je u nazivu kolone. Ovo znači da ako radite web aplikaciju, tekst pitanja mora da bude hard kodiran na web stranici. Hard kodiranje nije dobra ideja, ni na kraći ni na duži rok.

 Normalizovan model omogućuje nam da:

3)       za svako pitanje čuvamo ponuđene opcije kao vrednosti, tako i tekst koji ide uz opcije.

 Tako nešto u nenormalizovanom modelu ne postoji. Ponovo se opcije moraju hard-kodirati.

Dobar programer će lako napisati kod, koji čita iz normalizovanih tabela i generiše HTML  za web stranicu. Vreme utrošeno za pisanje takvog koda je dobro utrošeno. Vreme utrošeno za ukucavanje pitanja i opcija u HTML editor ili neki XML fajl je bačeno vreme, jer je to fizički posao. Kad spomenusmo XML, mnogi će reći da se tekst pitanja i tekst opcija za ponuđene odgovore može čuvati u XML fajlovima. Tačno – može! Ali onda imate deo podataka u bazi, i deo u XML fajlovima, dve razdvojene celine koje treba održavati u vezi. To ne uspeva ni u Americi.

Normalizovani model omogućuje i druge stvari, koje se teško izvode u nenormalizovanom modelu. Na primer, svrha svake ankete jeste da se prebroje odgovori na pitanja, da se vidi koliko učesnika je izabralo opciju a, b ili c na pitanje 17. Normalizovani model to radi u jednom kveriju. Nenormalizovani model traži da se izvrši po jedan kveri za svaku kolonu. Naravno da dobri programeri mogu da očas posla naprave kod, koji trči kroz sve kolone u nenormalizovanoj tabeli i za svaku se onda dinamički sagradi SQL string, pa se to prosledi kroz ADO da server to izvrši. A rezultati se onda pakuju u višedimenzionalne nizove, pa se onda iz tih nizova nešto ispisuje na ekran. Ponovo glupo utrošeno skupoceno vreme. Rešenje koje sam opisao mogu da odrade samo veoma dobri programeri (nije šala, najozbiljnije je). Meni bi bilo strašno žao da izvršnom programeru plaćam skupu satnicu da bi mi on pisao potpuno nepotreban kod zato što dizajn baze podataka ni ne postoji.

 

Prelaz sa Ankete na na Testove

 

Ponudjeni model baze podataka za ankete lako postaje model za čuvanje podataka o školskim testovima. Test se od obične ankete razlikuje po tome što za svako pitanje postoji tačan odgovor . Samo jedna od opcija je tačna.

Ako dodate u tabeli PitanjaAnkete kolonu TacanOdgovor, int NOT NULL rešili ste problem čuvanja tačnog odgovora za pitanja. Onda je lako prebrojati koliko tačnih odgovora ima svaki učesnik ankete/testa. Pokušajte to da uradite u nenormalizovanom modelu. Nivo programerskog znanja je još viši nego za statističko prebrojavanje odgovora po opcijama.