Oradebug

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] oradebug란

oradebug는 DBA를 위한 가장 강력한 툴이다. oradebug는 원래 오라클을 디버깅하기 위한 목적으로 사용되지만 적절히 사용하면 오라클을 관리하거나 내부 메커니즘을 테스트하는데 큰 도움이 된다. oradebug는 반드시 sysdba 권한으로 실행해야 한다.
SQL> connect /as sysdba
SQL> oradebug help
HELP           [command]                 Describe one or all commands
SETMYPID                                 Debug current process
SETOSPID       <ospid>                   Set OS pid of process to debug
SETORAPID      <orapid> ['force']        Set Oracle pid of process to debug
SHORT_STACK                              Dump abridged OS stack
DUMP           <dump_name> <lvl> [addr]  Invoke named dump
DUMPSGA        [bytes]                   Dump fixed SGA
DUMPLIST                                 Print a list of available dumps
EVENT          <text>                    Set trace event in process
SESSION_EVENT  <text>                    Set trace event in session
...

[편집] 진단 이벤트 수행

oradebug를 이용해 다음과 같이 특정 세션에 SQL Trace를 걸 수 있다.

SQL> -- 먼저 원하는 세션의 SPID나 PID를 구한다.
세션의 SPID나 PID를 이용해서 특정 세션에 "Attach"한다.
SQL> oradebug setospid <SPID> 
==> Oracle pid: 17, Unix process pid: 18639, image: oracle@hpl2000
혹은
SQL> select pid, sid, s.username, s.program
SQL> from v$session s, v$process p
SQL> where s.paddr = p.addr;
PID    SID USERNAME    PROGRAM          
--- ------ ----------- -----------------
  2    170             ORACLE.EXE (PMON)
  3    169             ORACLE.EXE (PSP0)
  4    168             ORACLE.EXE (MMAN)
  5    167             ORACLE.EXE (DBW0)
  6    166             ORACLE.EXE (LGWR)
  7    165             ORACLE.EXE (CKPT)
  8    164             ORACLE.EXE (SMON)
  9    163             ORACLE.EXE (RECO)
 10    162             ORACLE.EXE (CJQ0)
 11    161             ORACLE.EXE (MMON)
 12    160             ORACLE.EXE (MMNL)
 16    159 SYS         sqlplus.exe      
 18    154             ORACLE.EXE (QMNC)
 19    153             ORACLE.EXE (q001)
 20    148 OWI         LitePlus.exe     
 21    150             ORACLE.EXE (q000)
SQL> oradebug setorapid <PID>    -- Windows 계열에서는 setospid는 작동하지 않을 수도 있다. 이 경우에는   setorapid를 사용한다.

SQL> oradebug unlimit	-- Trace파일에 대한 크기제한을 없앤다.

-- Attach한 프로세스에 대해 Event를 설정한다.
SQL> oradebug event 10046 trace name context forever, level 8
...
SQL> oradebug event 10046 trace name context off

-- Trace 파일명을 알아낸다. 이 파일을 편집기로 열어서 Trace 파일을 분석할 수 있다. 
SQL> oradebug tracefile_name
==> /home/oracle/admin/ORA102/udump/ora102_ora_18639.trc

[편집] 덤프(Dump) 수행

SGA, PGA, library cache, row cache, buffers, enqueue, latch, heap, hanganalyze 등의 덤프 작업을 수행할 수 있다. 이러한 덤프 파일들은 오라클의 내부 구조를 이해하는데 큰 도움을 주며, 오라클 기술지원팀에서 장애를 진단하는데 널리 사용된다.

  • setmypid 명령을 이용하면 현재 세션으로 Attach한다.
SQL> oradebug setmypid
SQL> oradebug dump library_cache 10
  • row cache dump
SQL> oradebug dump row_cache 10
  • Buffer cache dump. Level을 10으로 주면 버퍼 캐시의 전체 내용을 내려받는다.
SQL> oradebug dump buffers 1

Level 값에 따라 buffer cache의 다음과 같은 내용을 내려받을 수 있다.

내용Header onlyBrief BlockFull Block
Block 1 2 3
+ lru 4 5 6
+ users/waiters 8 9 10
SQL> oradebug dump enqueues 10
SQL> oradebug dump latches 10
  • Heap 영역을 dump한다.
SQL> oradebug dump heapdump 2

Level 값에 따라 다음과 같은 Heap 영역을 내려받을 수 있다.

HeapLevelLevel with Contents
Top PGA 1 1025(=1024+1)
Top SGA 2 2050(=2048+2)
Top UGA 4 4100
Current Call 8 8200
User Call 16 16400
Large Pool 32 32800
  • System State를 dump한다. 오라클의 파라미터/통계/SGA/세션/프로세스 등의 정보를 내려받을 수 있다. 시스템 전체적인 분석을 하는데 유용하다.
SQL> oradebug dump systemstate 10
  • Process State를 dump한다. 특정 프로세스의 세션/PGA 등의 정보를 내려받을 수 있다. PGA에 대한 분석을 하는데 유용하다.
SQL> oradebug setospid <PID>
SQL> oradebug dump processstate 10
  • 특정 프로세스의 Call Strack Trace를 추출할 수 있다.
SQL> oradebug short_stack
_ksdxfstk+14<-_ksdxcb+1481<-_ssthreadsrgruncallback+428<-_OracleOradebugThreadSt
art@4+795<-7C80B710<-00000000<-_apafjo+161<-_apafdr+402<-_kkorrio+195<-_kkooqb+8
292<-_kkoqbc+1689<-_apakkoqb+151<-_apaqbd+383<-_apadrv+459<-_opitca+1445<-__PGOS
F359__kksFullTypeCheck+15<-_rpiswu2+426<-_kksLoadChild+5883<-_kkslod+98<-_kglobl
d+837<-_kglobpn+1224<-_kglpim+264<-_kglpin+1078<-_kxsGetRuntimeLock+1936<-_kksfb
c+7232<-_kkspsc0+2094<-_kksParseCursor+143<-_opiosq0+1965<-_kpooprx+232<-_kpoal8 
+775<-_opiodr+1099<-_ttcpip+1273<-_opitsk+1017<-_opiino+1087<-_opiodr+1099<-_opi
drv+819<-_sou2o+45<-_opimai_real+112<-_opimai+92<-_OracleThreadStart@4+708<-7C80 
B710
  • Dump 파일과 Trace 파일은 User Dump Directory에 기록되며 USER_DUMP_DEST 파라미터값에 지정되어 있다. 아래 명령을 통해 방금 기록된 Dump 파일명을 얻을 수 있다.
SQL> oradebug tracefile_name
  • 파일의 크기가 매우 큰 경우에는 결과가 잘릴 수도 있으므로 아래 명령을 이용해서 크기를 무한대로 지정하면 된다.
SQL> oradebug unlimit

[편집] 프로세스 제어

oradebug를 이용해 특정 프로세스를 일시정지/재시작 시킬 수 있다. 문제가 되는 프로세스를 제어하거나, 현재 상태를 분석하는 용도로 사용된다.

SQL> oradebug setospid <SPID>
  • 프로세스 일시 정지
SQL> oradebug suspend
...
  • 프로세스 재개
SQL> oradebug resume

위의 명령은 현재 대기현상을 겪는 세션을 일시 정지시키고 추가분석을 하거나, 특정 작업에 의해 SGA내의 특정 메모리값이 어떻게 변경되는지 확인하기 위한 용도로 사용 가능하다.

[편집] 참조

http://www.evdbt.com/Oradebug_Modrakovic.pdf