Debugging in RAC Database

Wednesday, 26.11.2008 – Dejan

Dolaze mi kolege jedan za drugim i kukaju:”Buraz pomagaj, ne radi mi PL/SQL debugging u novoj RAC bazi!!

Uspani─Źili se ljudi, a nemaju potrebe za dizanjem frke. ­čÖé

Ukoliko morate debugovati neki PL/SQL k├┤d u RAC bazi, morate pravilno konfigurisati TNS konektore (net service names), ina─Źe ─çe vam debug session biti “blokiran” (debug session hangs).

Pogledajmo kako to izgleda na prakti─Źnom primjeru…

U tnsnames.ora datoteci imamo ovakvu konfiguraciju:

RACDB =
  (DESCRIPTION =
    (SDU = 16384)
    (TDU = 16384)
    (ADDRESS = (PROTOCOL = TCP) (HOST = racnode1-vip) (PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP) (HOST = racnode2-vip) (PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = racdb)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 30)
        (DELAY = 5)
      )
    )
  )

Debug session hangs
Kada se spojimo preko konektora RACDB, naš razvojni alat (npt. TOAD ili PL/SQL Developer) će otvoriti session na jednom DB serveru (npr. na racnode1-vip), tj. na jednoj DB instanci (SID racdb1). 
Ako u tom alatu┬ápokrenemo debugging, zapo─Źinje nova transakcija i tada debugger pokre─çe jo┼í jedan session. Zbog load balancinga, taj novi session ─çe u ve─çini slu─Źajeva biti otvoren na drugom DB serveru (na racnode2-vip), tj. na drugoj DB instanci (SID racdb2).

Po┼íto se u ve─çini PL/SQL programa mijenja “database object state” (podaci se unose u neku tabelu┬áili se mijenjaju) ili “session state” (mijenja se neki session parametar, npr. NLS_DATE_FORMAT ili NLS_NUMERIC_CHARACTERS), onda ta dva session-a nisu me─Ĺusobno konzistentni i dolazi do blokiranja – jedan session blokira drugi. U tom slu─Źaju se oba session-a moraju “ubiti”. Nekad je dovoljno samo stisnuti “Cancel“, a nekad se moraju “ubiti” hardcore metodom (orakill na Windowsu ili kill -9 na Linuxu).

Da bi PL/SQL debugging mogli koristiti bez problema, MORATE se spojiti samo na jedan DB server, odnosno na jednu DB instancu. U tom slu─Źaju se ne─çe koristiti load balancing i novi session ne─çe biti otvoren na drugoj instanci.┬áZa tu svrhu moramo dodati posebne konektore za svaku instancu na kojoj ┼żelimo koristiti debugging.

RACNODE1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP) (HOST = racnode1-vip) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = racdb1)
    )
  )

RACNODE2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP) (HOST = racnode2-vip) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = racdb2)
    )
  )

Nakon što ste kreirali potrebne konektore, isprobajte da li debugging radi. Prilikom spajanja na bazu, odaberite jedan od novih konektora, npr. RACNODE1.

Trebalo bi da radi, a ako ne radi, mo┼żete mi se javiti sa detaljnim opisom problema, da vidimo i taj slu─Źaj. ­čÖé

  1. 2 Responses to “Debugging in RAC Database”

  2. Evo moj primjer. Oracle 10.2.0.4. baza. Toad prilikom pokretanja debug sessiona dobivam poruku “Unable to find RAC connection information”. Isjecak iz tnsnamesa:

    CTEST.WORLD=
    (DESCRIPTION=
    (ADDRESS_LIST=
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=codbtest1_vip)
    (PORT=1521)
    )
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=codbtest2_vip)
    (PORT=1521)
    )
    )
    (LOAD_BALANCE=off)
    (CONNECT_DATA=
    (SERVICE_NAME=COTEST)
    (SERVER = DEDICATED)
    (FAILOVER_MODE=
    (TYPE=select)
    (METHOD=basic)
    (RETRIES=180)
    (DELAY=5)
    )
    )
    )

    CTEST1.WORLD=
    (DESCRIPTION=
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=codbtest1_vip)
    (PORT=1521)
    )
    (CONNECT_DATA=
    (SERVER = DEDICATED)
    (SID=COTEST1)
    )
    )

    CTEST2.WORLD=
    (DESCRIPTION=
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=codbtest2_vip)
    (PORT=1521)
    )
    (CONNECT_DATA=
    (SERVER = DEDICATED)
    (SID=COTEST2)
    )
    )

    Greska se javlja bilo da se spajam na CTEST1 ili CTEST2 pa ako imate ideju zasto molio bih vas da mi javite. Hvala!

    Pozdrav, Miro.

    By Miro on Apr 9, 2009

  3. Da nisi mozda rucno mijenjao nesto u tnsnames.ora?
    Ili mozda imas TOAD 9.5, koji ima neki bug (pogresno parsiranje tnsnames.ora datoteke) ?
    Ovako na prvi pogled, ne vidim nista “problematicno”…

    By Dejan on Apr 10, 2009

Post a Comment