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