Oracle: Kako brzo unijeti podatke pomocu INSERT /*+ APPEND */

Friday, 09.02.2007 – Dejan

Kaze kolega:”Cuo sam da je unos podataka sa INSERT /*+ APPEND */ veoma brz, ali kod mene se vuuuceeee kao penzioner na kraju mjeseca…

Pa evo zgodne prilike da na primjeru pojasnimo ispravno koristenje INSERT /*+ APPEND */ procesa.

U ovom primjeru imamo dvije tabele:
– source tabelu (source_table) iz koje uzimamo podatke, sa vise polja, od kojih su nama zanimljivi: id i iznos.
– target tabelu (target_table) u koju unosimo podatke iz source tabele, sa poljima: idsuma_iznosa (suma svih iznosa za pojedini id) i max_iznos (maksimalni iznos za pojedini id).

Da bi unos bio sto brzi, potrebno je deaktivirati sve indekse i triggere na target tabeli.

Ako imamo samo jedan ili par indeksa, onda ih mozemo i rucno deaktivirati:

ALTER INDEX target_table_index1 UNUSABLE;

Ako imate particionisani index, onda ga mozete ovako deaktivirati:

ALTER INDEX target_table_index1 MODIFY PARTITION part1 UNUSABLE;

U suprotnom, za vise indeksa mozemo generisati kod:

sqlplus> spool c:\set_indexes_unusable.sql
sqlplus> SELECT 'ALTER INDEX '|| index_name ||' UNUSABLE;'
  FROM user_indexes
  WHERE table_name = 'TARGET_TABLE';
sqlplus> @C:\set_indexes_unusable.sql

Medjutim, Oracle ne dopusta unos podataka, ukoliko na tabeli postoje deaktivirani indexi (unusable indexes). Stoga moramo implicitno reci Oracleu, da preskoci deaktivirane indexe:

ALTER SESSION SET skip_unusable_indexes = TRUE;

Potom deaktiviramo triggere:

ALTER TABLE target_table DISABLE ALL TRIGGERS;

I mozemo poceti sa unosom:

INSERT /*+ APPEND */
INTO target_table(id, suma_iznosa, max_iznos)
SELECT id, sum(iznos), max(iznos)
FROM source_table
GROUP BY id;

Potvrdimo unos:

COMMIT;

I aktiviramo ponovo indexe i triggere:

ALTER TABLE target_table ENABLE ALL TRIGGERS;

sqlplus> spool C:\rebuild_indexes.sql
sqlplus> SELECT 'ALTER INDEX ' || index_name || ' REBUILD;'
  FROM user_indexes
  WHERE table_name = 'TARGET_TABLE'
  AND status = 'UNUSABLE';
sqlplus> @C:\rebuild_indexes.sql

To je to.



Oracle: CKPT terminating instance due to error 221 (ORA-00221)

Friday, 09.02.2007 – Dejan

Ako vam se instanca Oracle baze skrsi sa greskom iz naslova i ukoliko u alert logu pronadjete ovo:

(Na njemackom)
Wed Feb 07 22:44:32 2007
Errors in file c:ora10gadmindb10gbdumpdb10g_ckpt_55.trc:
ORA-00221: Fehler beim Schreiben in Kontrolldatei
ORA-00206: Fehler beim Schreiben (Block 3, Anzahl Blöcke 1) der Kontrolldatei
ORA-00202: Kontrolldatei: 'C:ORA10GORADATADB10GCONTROL03.CTL'
ORA-27072: Datei-I/O-Fehler
OSD-04008: WriteFile()-Fehler, in Datei kann nicht geschrieben werden
O/S-Error: (OS 33) The process cannot access the file because another process has locked a portion of the file.
Wed Feb 07 22:44:32 2007
CKPT: terminating instance due to error 221

(ili na engleskom)

Wed Feb 07 22:44:32 2007
Errors in file c:ora10gadmindb10gbdumpdb10g_ckpt_55.trc:
ORA-00221: error on write to controlfile
ORA-00206: error in writing (block 3, # blocks 1) of controlfile
ORA-00202: controlfile: 'C:ORA10GORADATADB10GCONTROL03.CTL'
ORA-27072: File I/O error
OSD-04008: WriteFile() failure, unable to write to file
O/S-Error: (OS 33) The process cannot access the file because another process has locked a portion of the file.
Wed Feb 07 22:44:32 2007
CKPT: terminating instance due to error 221

onda je moguci uzrok tome anti-virusni software ili neki third-party software, koji vrsi odrzavanje sistemske particije (u ovom slucaju C: particija).
U mom slucaju je bilo oboje. Svako vece se vrsi skeniranje sistema anti-virusnim softwareom, a potom se vrsi automatski backup sistemske particije (neki alat za HP SAN storage), koji lockuje controlfile, nakon cega CKPT (Checkpoint process) terminira DB instancu.

Ako ne mozete izbjeci pokretanje tog anti-virusnog i backup softwarea, onda je rjesenje da controlfileove smjestite na neku nesistemsku particiju i necete imati ovakvih situacija. 🙂



Oracle: Zapisivanje direktno u alert log ili u trace file

Thursday, 08.02.2007 – Dejan

Naletih na jednu zanimljivu proceduru, kojom mozete direktno zapisivati u alert log ili u trace file.

Radi se o proceduri KSDWRT u paketu DBMS_SYSTEM, a mozete ju koristiti na 3 nacina:

DBMS_SYSTEM.KSDWRT(1, ‘zapisivanje u trace file’);
DBMS_SYSTEM.KSDWRT(2, ‘zapisivanje direktno u alert log’);
DBMS_SYSTEM.KSDWRT(3, ‘zapisivanje i u alert log i u trace file’);

Evo jedan primjer:

– spojite se sa SQL*Plusom na bazu i otkucajte:

sqlplus> exec DBMS_SYSTEM.ksdwrt(2, ‘Sta bi rekli ovi iz Oracle Supporta, kad bi vidjeli ovo u alert logu? ;)’);

Potom otvorite alert log i pronadjite vas zapis na kraju, kao npr.:
Thu Feb 08 15:28:50 2007
Sta bi rekli ovi iz Oracle Supporta, kad bi vidjeli ovo u alert logu? 😉




Rekordna godina za MySQL + MySQL ide na burzu

Wednesday, 31.01.2007 – Dejan

Juče je Marten Mickos, CEO MySQL AB, objavio poslovne rezultate za 2006. godinu, pri čemu je naveo da je ostvaren novi rekord i da je MySQL u prošloj godini imao 2.500 novih klijenata – što velikih, što manjih firmi.

Osim toga, MySQL ove godine planira izaći na berzu, a njegov IPO se očekuje sa nestrpljenjem, jer bi pokazao i dokazao istinsku vrijednost Open Source tehnologije i filozofije.



Sortiranje na ћирилици

Tuesday, 30.01.2007 – Dejan

Временом zaboravim шта sam написао po разним forumima. Данас naletih на jednu од “zaboravljenih” тема, a пошто ju сматрам korisnom, одлучих da ју linkujem овдје, kako не bi пала u заборав.

(naporno je čitati ovu kombinaciju ćirilice i latinice, a? 😉 ).

 Naime, radi se o sortiranju na ćirilici u MySQL bazi, u vezi čega se na DevProTalk forumima povela tema o tome, pa sam tom prilikom praktičnim primjerom pokazao kako radi sortiranje na ćirilici.

Detaljnije možete pročitati ovdje: Sortiranje na ćirilici



Nove Oracle knjige

Thursday, 25.01.2007 – Dejan

Oracle Real Application Clusters HandbookRMAN Backup & RecoveryPosto smo KONACNO presli na verziju 10g (procitati u jednoj od prethodnih poruka, zasto je tek nedavno bilo moguce uraditi upgrade na verziju 10g), dobio sam zadatak da osmislim novi koncept osiguravanja podataka (backup & recovery concept), a radi se o bazi velikoj oko 400 GB (raste oko 40% godisnje). Odabrao sam RMAN (Recovery MANager) kao primarni alat za tu namjenu, a pri osmisljavanju, kreiranju i finalnoj realizaciji tog koncepta, mnogo ce mi pomoci i knjiga “Oracle Database 10g: RMAN Backup & Recovery“, koja mi je upravo danas stigla.

Porucena je i knjiga “Oracle Database 10g Real Application Clusters Handbook“, jer ce zatrebati pri buducoj ekspanziji korisnika i podataka.



TOADworld – tutorijali, tekstovi, savjeti…

Wednesday, 24.01.2007 – Dejan

ToadWorldNa adresi ToadWorld mozete pronaci odlicne tutorijale, tekstove i savjete o radu sa TOAD-om i prvenstveno sa Oracle bazom.

Napomenucu da tekstove tamo pisu i Mike Ault (jedan od najboljih Oracle DBA na svijetu), Steven Feuerstein (jedan od najboljih PL/SQL programera na svijetu) i mnogi drugi.

Ima dosta zanimljivih tekstova, a meni su pogotovo zanimljivi bili “Debugging in Toad for Oracle 9.0” i “Documenting the Database — Reporting in Toad 9.0“.

ToadWorld je skoro zapoceo sa radom, tako da jos nema veliki broj tekstova, ali vjerujem da ce se u skorije vrijeme to promijeniti. Draze mi je da bude manje tekstova, ali veoma kvalitetnih, nego stotine suhoparnih tesktova u stilu “ajd-da-napisem-bilo-sta“.



Upgrade Oracle baze sa verzije 9i na 10g (Oracle upgrade: 9i to 10g)

Tuesday, 16.01.2007 – Dejan

Evo zavrsili smo i ovaj upgrade konacno!

Prebacivanje na verziju 10g nije bilo moguce zbog ranije spomenutog bug-a ( http://www.outsourcing-it.com/?p=13 ), pa smo jedva docekali najnoviji patchset (10.2.0.3) i instalirali ga. Nakon nekoliko dana uzurbanog testiranja odlucili smo se na upgrade, koji je odradjen prethodnog vikenda.

Naravno, kao i kod svakog upgradea, i ovdje je doslo do odredjenih poteskoca.

Prvo smo imali problema sa defaultnim National Character Setom (AL16UTF16), zatim smo imali problema sa ORA-07445 u “shared” modu, zbog cega smo morali zadrzati “dedicated” mod (istovremeno sam otvorio Service Request na MetaLinku, da vidimo u cemu je problem), dok vecih poteskoca nije bilo.

Zatrpan sam zahtjevima za optimizacijom SQL upita, jer se pojedini programeri jos nisu navikli na Cost Based Optimizer.

Osim toga, ceka me osposobljavanje novog DB Acceptance servera i novog DB Testing servera.

Dakle, na posao!



PHP != MySQL

Wednesday, 10.01.2007 – Dejan

Ne mogu da vjerujem u kojoj kolicini ljudi poistovjecuju MySQL sa PHP-om!!

 Na raznim forumima i news grupama postavljaju MySQL related pitanja u PHP tematske podforume ili PHP news grupe. Razumijem ja da je PHP usko povezan sa MySQL-om i da je mnogima MySQL asocijacija na “tamo nesto u PHP-u”, ali dolazi do pretjerivanja. Npr. u PHP podforumu se postavlja pitanje “sumiranje nekih brojeva u mysql bazi” ili “kako uraditi UPDATE” i td.

Ja kad vidim takva pitanja u pogresnim podforumima, ne trudim se ni odgovoriti na njih, iako znam odgovor.


AskTom redesigned

Wednesday, 27.12.2006 – Dejan

Upravo danas primijetih da je AskTom website redizajniran. Pregledniji je, dodane su neke nove opcije, a i ljepsi mi je od starog sajta. 🙂

New Features include:

  • Where is Tom? Calendar on Home Page
  • New tags for formatting posts:
    <b>, <i>, <u>, <ul>, <ol>, <li>, and the <code> tag
    for displaying preformatted, escaped  text like this
  • User Interface enhancements (look and feel, column heading sorting, variable size result sets)