Oradebug
EXEM Knowledge Base
목차 |
[편집] 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
- library cache dump. Level을 10으로 주면 library cache의 전체 내용을 내려받는다.
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 only | Brief Block | Full Block |
|---|---|---|---|
| Block | 1 | 2 | 3 |
| + lru | 4 | 5 | 6 |
| + users/waiters | 8 | 9 | 10 |
- enqueue dump
SQL> oradebug dump enqueues 10
- latch dump
SQL> oradebug dump latches 10
- Heap 영역을 dump한다.
SQL> oradebug dump heapdump 2
Level 값에 따라 다음과 같은 Heap 영역을 내려받을 수 있다.
| Heap | Level | Level 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내의 특정 메모리값이 어떻게 변경되는지 확인하기 위한 용도로 사용 가능하다.