Diplomski/Seminarski rad: Backup and Recovery Oracle & MySQL baze

May 6, 2008 – Dejan

Uvaženi kolega i student na bečkom Tehničkom univerzitetu - Đorđe “bags” Torbica - je za svoj diplomski rad odabrao temu “Backup und Recovery in Oracle 10g” pri čemu je morao navesti/usporediti i backup mogućnosti kod MySQL RDBMS-a u odnosu na Oracle XE. Ovih dana je Đorđe svoj rad uspješno odbranio i stekao Bachelor titulu.

Pošto sam ja savjetima pomagao Đorđu pri izradi tog rada, on je obećao nesebično dati taj svoj rad na uvid drugim zainteresovanim bazoljupcima, koji posjećuju blog baze-podataka.net .

Napomena: Seminarski rad je na njemačkom jeziku.

Download (PDF, 247 kB): Diplomski/Seminarski rad na temu “Backup und Recovery in Oracle 10g”


Gdje da nabavim Oracle software?

April 24, 2008 – Dejan

Nastavljamo sa pitanjima i odgovorima - Marko Bujas, student informatike, pita gdje se može nabaviti Oracle software, a posebno mu trebaju Forms i Reports Builder.

Ja sam student informatike i trenutno imam predmet baze podataka.
Bio bih vam zahvalan ako biste mi rekli gdje mogu skinuti Oracle nije bitno koja je verzija bitno mi je samo da sadrži form i report builder. samo mi nemojte reći da skinem sa službene stranice oracla.
ako imate neki link bio bih vam jako zahvalan.

sviđaju mi se baze podataka i želim to i jednog dana raditi, ali bez potrebnog softvera to i
nije baš moguće zato molim pomagajte.

Unaprijed vam se zahvaljujem

Oracle software se može nabaviti …
Pročitaj kompletan tekst »


Alternativa za EXECUTE IMMEDIATE i DBMS_SQL u MySQL-u ?

April 17, 2008 – Dejan

Vi pitate - mi odgovaramo!

Radovan B. iz Novog Sada je postavio pitanje:

Potreban mi je određeni mehanizam, koji bi mogao na serveru da odradi dinamičko izvršenje određene SQL komande na MYSQL bazi. Znači, ja da mogu da pozovem proceduru na serveru, koja će parsirati SQL komandu zavisno od uslova i koja će se po potrebi izvršiti… U MySQL-u mi nedostaje baš to na što sam navikao u ORACLE-u…

Da li postoji mehanizam u MYSQL bazi (na serveru) analogan komandama EXECUTE IMMEDIATE i DBMS_SQL, koji postoje u ORACLE bazi?

A odgovor je - Da! Dinamičko izvršavanje u MySQL-u postoji, a to se dobija korištenjem komandi PREPARE i EXECUTE statement. Postoje neka ograničenja za korištenje u triggerima i ne mogu se koristiti sve DDL komande, ali većina SQL izraza se ipak mogu koristiti.

Ukoliko i vi imate neko pitanje, pošaljite ga na adresu forwardNOSPAMbaze-podataka.net


Unique Indeksi i NULL vrednosti

March 25, 2008 – Zidar

Na sajtu elitesecurity.org povremeno se pojave mozgalice - nesvakidašnji zadaci koje treba rešiti primenom SQL jezika. Jedna od prvih mozgalica bila je “Kako obezbediti jedinstvenost ako su dozvoljene NULL vrednosti u koloni”. Drugim rečima, ako vrednost nije NULL onda mora biti jedinstvena, a višestruke NULL vrednosti su dozvoljene. U nekim sistemima rešenje je trivijalno, jer se indeksi ignorisu NULL vrednosti . MS SQL to ne dozvoljava (iako recimo Access, takodje MS proizvod, to naprimer dozvoljava).

U verzijama MS SQL zaključno sa 2005 morali smo da pribegavamo trikovima. Triggeri, inedksirani view ili korisničke funkcija su korišćeni da se problem reši. MS SQL 2008 uvodi novinu - “filtered indexing”.

U Microsoft SQL Server 2008 problem se rešava elegantno i efikasno definsanjem objekta koji se zove  “unique filtered index” koji  moze da isključi  NULL vrednosti. Neka je data tabela:

CREATE TABLE dbo.T1(col1 INT NULL, col2 VARCHAR(10) NOT NULL);

Pretpostavimo da želimo da obezbedimo jedinstvenost za podatke u koloni col1, a da dozvolimo visetruke NULL vrednosti. Dovoljno je da ovako definišete indeks:

CREATE UNIQUE NONCLUSTERED INDEX idx_col1_notnull
ON dbo.T1(col1)
WHERE col1 IS NOT NULL;

Da testiramo index, pokušajmo da unesemo sledeće:

INSERT INTO dbo.T1(col1, col2) VALUES(1, 'a');
INSERT INTO dbo.T1(col1, col2) VALUES(1, 'a');

Drugi INSERT naravno ne prolazi. Međutim,  nećete imati problema da unesete više redova sa  NULL u col1:

INSERT INTO dbo.T1(col1, col2) VALUES(NULL, 'a');
INSERT INTO dbo.T1(col1, col2) VALUES(NULL, 'a');

Negde sam pročitao i da su uvedeni i novi tipovi (podtipovi?) podataka - DateOnly i TimeOnly koji rade upravo to - čuvaj samo vreme i samo datumski deo.  Cool, eh ….

:-) 


Korišćenje UDF funkcija u CHECK uslovima - rezervacija soba

March 5, 2008 – Zidar

Pošto mi se mnogo dopalo korišćenje UDF funkcija u CHECK uslovima, pokušao sam da odgovorim na pitanje, koje se često sreće na forumima: rezervacija soba bez prebukiranja. Evo kako može da se reši:
Kreiramo tabelu u koju se upisuju rezervacije soba u jednom hotelu.
Tabela ima 3 kolone (Sobe, ZauzetoOD, ZauzetoDo)

- Soba ne sme da se prebukira. Drugim rečima, interval zauzeća (ZauzetoOd, ZauzetoDo) ne sme da se preklopi ni sa jednim drugim intervalom zauzeca za posmatranu sobu.
- Na dan odlaska jednog gosta iz sobe, drugi gost može ući u sobu.
- Sobe se napuštaju do 11AM, a preuzimaju u 1PM.
- Vreme između 11 i 1 se koristi za pripremu sobe za novog gosta. Znači, preklapanje na krajevima intervala se dopušta.

Pročitaj kompletan tekst »


Upotreba korisničkih funkcija u CHECK CONSTRAINTS

March 5, 2008 – Zidar

MS SQL  2000 doneo je jednu lepu novinu - mogućnost pisanja korisničkih funkcija. Uz to je tiho došla još jedna novina, slabo dokumentovana,  iako se može naći u Boks On Line. Korisničke funkcije mogu se pozvati iz CHECK constraints. Funkcije ko funkcije, mogu da pozivaju redove iz posmatrane tabele, ali i drugih tabela. Ovo nam omogućava da izbegnemo proceduralno programiranje (trigere) i da neka ograničenja za koje smo morali koristiti Stored Procedures ili čak front-end funkcije, sada možemo da postavimo na nivo tabele, tamo gde i treba.

Na jednostavnom primeru pokazaćemo kako to radi.

Dobrotvorna organizacija daje pomoc gradjanima. Svaki gradjanin ima svoj ‘racun’. Novac se isplacuje višekratno, u manjim iznosima. Nikome se ne sme isplatiti više od 100 dinara ukupno.

Krairana je tabela ‘Zaduzenja’ sa tri kolone - Transakcija, Racun, IznosZaduzenja.
IznosZaduzenja je ono sto se isplaćuje u jednoj transakciji. Ukupan zbir IznosZaduzenja po računu ne sme da predje 100.

Ovo su ograničenja koja želimo da postavimo:
Pretpostavljamo IznosZaduzenja mora biti pozitivan, ne mozž biti nula ili manji.
Ukupan zbir svih IznosZaduzenja po Racunu ne sme preći 100.

CREATE TABLE Zaduzenja – DROP TABLE Accounnt
(Transakcija int PRIMARY KEY
, Racun int NOT NULL
, IznosZaduzenja money NOT NULL CHECK (IznosZaduzenja > 0)
)

Ovako nasa tabela postuje  prvo ograničenje. Kako da sprečimo da se nekome isplati više od 100 dinara?

MS SQL, od verzije 2000 pa naovamo ima jednu malo poznatu osobinu - u CHECK constraints mogu se koristiti user defined functions.
Iskoristimo to. Napišimo prvo funkciju koja izračunava ukupno zaduženje po računu. Funkcija bi mogla ovako da izgleda:

CREATE FUNCTION dbo.UkupnoZaduzenje (@Racun int)
RETURNS money
AS
BEGIN
 DECLARE @Retval money
 SET @Retval = (SELECT SUM(IznosZaduzenja)
     FROM Zaduzenja WHERE Racun = @Racun
     )
 RETURN COALESCE(@Retval,0) – inace vraca NULL kad ne postoji ni jedan red u in line kveriju
END

Funkciju pozivamo ovako:
SELECT dbo.UkupnoZaduzenje(100)

Ovako pravimo CHECK constraint koji koristi nasu funkciju:


ALTER TABLE Zaduzenja
–DROP CONSTRAINT ck_UkupnoZaduzenjeManjeod100
ADD CONSTRAINT ck_UkupnoZaduzenjeManjeod100
 CHECK
  (
   100 >= dbo.UkupnoZaduzenje (Racun)
  )

Da vidimo da li radi:

INSERT INTO Zaduzenja VALUES (1,100,50)
(1 row(s) affected)


SELECT * FROM Zaduzenja
Transakcija Racun       IznosZaduzenja       
———– ———– ———————
          1         100               50.0000

(1 row(s) affected)

Dodajmo jos 25 dinara na isti racun:
INSERT INTO Zaduzenja VALUES (2,100,25)
(1 row(s) affected)

Sada imamo u tabeli Zaduzenja:
Transakcija Racun       IznosZaduzenja       
———– ———– ———————
          1         100               50.0000
          2         100               25.0000

Ukupno azduzenje za Racun=100 jeste 75.
Pokušajmo da dodamo 30 dinara, što bi podiglo ukupno zaduženje na 105.

INSERT INTO Zaduzenja VALUES (3,100,30)

Rezultat:
Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with COLUMN CHECK constraint ‘ck_UkupnoZaduzenjeManjeod100′.
The conflict occurred in database ‘master’, table ‘Zaduzenja’, column ‘Racun’.
The statement has been terminated.

Još 25 moze da prodje:
INSERT INTO Zaduzenja VALUES (3,100,25)

(1 row(s) affected)

i ništa vise:

INSERT INTO Zaduzenja VALUES (4,100,0.001)

Ponovo dobijamo
Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with COLUMN CHECK constraint ‘ck_UkupnoZaduzenjeManjeod100′.
The conflict occurred in database ‘Zadaci’, table ‘Zaduzenja’, column ‘Racun’.
The statement has been terminated.

SELECT * FROM Zaduzenja

Transakcija Racun       IznosZaduzenja       
———– ———– ———————
          1         100               50.0000
          2         100               25.0000
          3         100               25.0000

(3 row(s) affected)

Ne moramo više da poštovanje ograničenja obezbeđujemo na front endu, nit SQL programiranjem (trigeri i stored procedure). Kod u funkciji nije proceduralni, ne maskiramo funkcijom nikakav kursor.  Onako kako i treba da bude.

:-)


Nastavak sage o Sun-ovoj akviziciji MySQL-a

February 29, 2008 – Dejan

Sun je već uvrstio sve MySQL proizvode u svoj portfolio, a akcenat je stavljen na MySQL Enterprise verziju.

Ukratko - prema službenim objavama, cilj će biti uska povezanost svih komponenti potrebnih za funkcionisanje jednog informacionog sistema, odnosno integrisana ponuda hardwarea (Sunovi serveri), softwarea (Solaris OS i OpenSolaris, Java, MySQL i td.) i servisnih usluga (consulting, implementation, support …), tako da je ova integrisana end-to-end kombinacija prvenstveno namijenjena srednjim i velikim firmama. A šta sa malim firmama?

Male će se vjerovatno morati osloniti na MySQL community verziju, te PHP i Apache na nekom shared serveru. Support i konsultacije će im pružati Google, a implementaciju jedan od samoukih srednjoš… pardon studenata… :)

Agencija Gartner piše da će fokus biti i na OpenSource tržištu, odnosno na jačanju SAMP platforme (umjesto L u LAMP, stavljeno je S za Solaris), ali ja bih tu platformu prije nazvao SAJM (Solaris Apache Java MySQL) ili eventualno SAMJP, a prihod bi se trebao ostvarivati uglavnom preko licenci za support i consulting.

Jonathan Schwartz, Sun CEO, je pored klasičnih menadžerskih/marketinških izjava poput ove:
Our enterprise customers worldwide can now take advantage of MySQL’s market-leading open source database on your choice of platform, OS and language with less risk — for up to a 90% lower total cost of ownership over many traditional database solutions.”

napisao i da će Sun nastaviti uspješnu saradnju sa kompletnom OpenSource zajednicom, te da će M u LAMP platformi i dalje biti njen sastavni dio.

Za one koji se pitaju “I šta sad?“, Mårten Mickos, bivši MySQL CEO, a sadašnji Senior Vice President - Database Group, Sun - daje konkretan odgovor:”Simply put, it’s business as usual, only better.

But now you can leverage MySQL’s and Sun’s joint ability to provide you a complete suite of support options that enable you to rapidly build and deploy efficient, effective and secure applications and services. You can enjoy your total cost of ownership saving and benefit from our expanding roadmap and rates of innovation.

Čitav proces spajanja ove dvije firme će trajati još nekoliko mjeseci, tako da ćemo konkretne rezultate ove akvizicije vidjeti tek krajem ove godine. Do tada - hvala na pažnji - slijedi vremenska prognoza.


TOAD for MySQL - Freeware v3.1.1

February 27, 2008 – Dejan

TOAD je po meni najbolji alat za rad sa bazama podataka, a koristim ga za rad sa Oracle i MySQL bazama.

Pored komercijalnih verzija, možete skinuti i Freeware verzije, koje važe 60 dana. Nakon isteka probnog roka, samo deinstalirate taj Freeware i ponovo instalirate.

Freeware verzije možete naći na ovoj adresi: http://www.toadworld.com/Downloads/Freeware/tabid/80/Default.aspx


ORA-02019: connection description for remote database not found

February 27, 2008 – Dejan

Aaaaaargh… $§&%/*#

Koliko jedna “sitnica” može koštati vremena i živaca…

Kolega je instalirao jednu Oracle bazu za testiranje, u koju smo kasnije importovali našu production bazu. Međutim, ne lezi vraže… Nakon nekoliko sati rada, određene aplikacije su počele da javljaju grešku, a pojedini PL/SQL paketi se nisu mogli kompilirati.

Problem je pojavio prilikom korištenja objekata (tabele i views) iz druge baze preko database linka. Ukoliko u svom kôdu imate nešto slično kao npr.:

SELECT id, value
INTO lvID, lvValue
FROM remote_table@mssqlDB;

onda taj upit može javiti grešku:
ORA-00942 Table or View does not exist

ali pravi uzrok greške leži u nedostupnosti database linka, odnosno u grešci:
ORA-02019: connection description for remote database not found

E sad je trebalo pronaći uzrok te greške - kolega je odustao nakon nekoliko sati, pa sam ja preuzeo i takođe izgubio skoro 3 sata dok nisam pronašao u čemu je bio problem.

Provjerio sam 10-ak puta tnsnames.ora, dotične PL/SQL pakete nekoliko puta liniju po liniju, ali bez uspjeha…
Googleao sam, tražio na MetaLinku, ali bez uspjeha…
Rješenje sam otkrio sasvim slučajno - usporedio sam init-parametre u toj novoj testnoj bazi i u production bazi, pa mi je za oko zapao parametar “open_links“. U testnoj bazi je vrijednost iznosila 4, a u production bazi 8.

U dokumentaciji piše:
OPEN_LINKS specifies the maximum number of concurrent open connections to remote databases in one session.”

Standardno je vrijednost podešena na 4, a mi smo u nekoliko PL/SQL paketa koristili i po 7-8 database linkova, pa sam ja samo povećao tu vrijednost na 8, restartovao bazu i sve je funkcionisalo kako treba.

alter system set open_links=8 scope=spfile sid='*';

Nadam se da će ovo nekom pomoći i uštediti vrijeme i živce…


Recenzija: Expert Oracle Database Architecture

February 12, 2008 – Dejan

Napokon sam ugrabio vremena da napišem neku novu recenziju, a ovaj put sam odabrao još jednu odličnu knjigu o Oracle bazi - “Expert Oracle Database Architecture“, čiji autor je fenomenalni i svima poznat - Tom Kyte.

Knjiga je namijenjena svima - kako programerima, tako i administratorima, bez obzira da li se radi o početnicima ili iskusnim znalcima. Tom je u svom već poznatom stilu “proof-by-example” detaljno objasnio mnoge stvari potrebne za shvatanje funkcionalnosti i unutrašnje strukture Oracle baze, a mnogi savjeti spadaju u “best practice” primjere.

Početnici će moći upoznati internu strukturu i komponente Oracle baze, zatim koji procesi rade u pozadini i za šta je koji proces zadužen. Osim toga, mogu saznati kako funkcionišu transakcije, konkurentni višekorisnički pristup podacima, particionisanje i paralelizam. Pored poglavlja o tabelama i indeksima, tu je i poglavlje o svim tipovima podataka u Oracle bazi (npr. jeste li znali da je PLS_INTEGER efikasniji od BINARY_INTEGER?), pa koga zanima čemu služi npr. TIMESTAMP WITH TIMEZONE nek se lati knjige. :D

Oni iskusniji će možda pronaći neku korisnu informaciju o poboljšavanju sistema (performance tuning) mijenjanjem određenih init-parametara, zatim informacije o razvijanju aplikacija u RAC okruženju i vjerovatno još mnogo korisnih stvari.

Za mene su veoma korisna bila poglavlja o tabelama i indeksima, u kojima sam saznao kako mogu koristiti IOT  (Index Organized Table) i Cluster/Hash-Cluster/Hash-Cluster-Sorted tabele, a potom koji indeksi bi bili najefikasniji u određenim situacijama (npr. REVERSE index za datume ili BITMAP index za polja sa malim brojem različitih vrijednosti, npr. muško/žensko).

Knjigu najsrdačnije preporučujem i dajem joj zasluženu ocjenu 10.