태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[티팩] oradebug

오라클 2010.06.24 15:06
Oradebug의 사용법 전체를 설명하려는 것은 아니고 티팩에서 사용하는 oradebug 명령을 간단하게 소개합니다. 아주 간단한 명령들이라 이미 다들 알고 계신 내용일 것입니다.

1. 특정 Process에 바인드 하기

티팩이 oradebug 명령을 사용하는 이유는 특정 Process에 자유롭게 바인딩할 수 있기 때문입니다.

-- SYSDBA 유저로 로그인
sqlplus "/as sysdba"

-- 현재 Process로 바인딩
SQL> oradebug setmypid

-- 특정 Session의 OS Process ID를 얻어서 바인딩
SQL> select sid, serial#,
  	(select spid from v$process where addr = paddr) as ospid
from v$session 
where sid = (select sid from v$mystat where rownum = 1);

       SID    SERIAL# OSPID
---------- ---------- ------------
       144       2446 4872

SQL> oradebug setospid 4872
Oracle pid: 16, Windows thread id: 4872, image: ORACLE.EXE (SHAD)
특정 Process로 Binding하는 방법에는 아래 네가지가 있습니다.
SQL> oradebug help
SETMYPID                                 Debug current process
SETOSPID       {ospid}                   Set OS pid of process to debug
SETORAPID      {orapid} ['force']        Set Oracle pid of process to debug
SETORAPNAME    {orapname}                Set Oracle process name to debug  -- 11g에서 추가
...
SETOSPID 명령을 주로 사용하는 이유는 Unix/Linux 환경에서는 Process ID(PID) 값을 얻기 쉽기 때문입니다. 하지만 티팩에서는 특정 세션을 지정하기 위해 Session ID(SID)를 인자로 사용합니다. 오라클 입장에서는 SID가 가장 인식하기 쉬운 값이기 때문입니다.

2. 트레이스 파일 이름 얻기

티팩에서는 특정 프로세스에 대해 이벤트나 덤프를 수행하고 그 내용을 읽는 작업이 몇몇 있습니다. 따라서 트레이스 파일을 정확하게 얻을 수 있어야 합니다. oradebug tracefile_name 명령으로 얻을 수 있습니다.

SQL> oradebug tracefile_name
c:\oracle\admin\ukja1021\udump\ukja1021_ora_4872.trc
위의 작업은 티팩에서는 다음과 같이 수행됩니다.
-- 143번 세션의 트레이스 파일 이름 얻기
SQL> select tpack.get_tracefile_name(143) from dual;
c:\oracle\admin\ukja1021\udump\ukja1021_ora_4872.trc

-- 트레이스 파일의 내용도 읽을 수 있습니다.
SQL> select * from table(tpack.get_tracefile_contents('c:\oracle\admin\ukja1021\udump\ukja1021_ora_4872.trc'))
또는 다음과 같은 Query를 통해서도 얻을 수도 있습니다. 하지만 정확한 포맷은 Version이나 OS에 따라 바뀔 수 있습니다. 이 방법은 또 하나의 단점은 해당 프로세스가 Server Process인지, Background Process인지를 알아야 하며 Process 종류에 따라 정확하게 어떤 디렉토리에 파일이 남는지도 판단해야한다는 것입니다. 이런 복잡성때문에 티팩에서는 oradebug tracefile_name 명령을 이용합니다.
select
  d.value||'\'||p.value||'_ora_'||s.spid||'.trc'   as trace_file_name
from 
  (
  select value 
  from v$parameter
  where name = 'instance_name'
  ) p, 
  (
  select value
  from v$parameter
  where name = 'user_dump_dest'
  ) d,
  (
  select spid
  from v$process
  where addr = (
    select paddr 
    from v$session
    where sid = {sid here}
    )
  ) s
3. 진단 이벤트 수행

특정 Process에 바인딩한 후 해당 Process에 대해 진단 이벤트를 수행할 수 있습니다.

-- 진단이벤트 켜기
SQL> oradebug event 10046 trace name context forever, level 12

-- 진단이벤트 끄기
SQL> oradebug event 10046 context off

-- 트레이스 파일 열기
SQL> oradebug tracefile_name
SQL> ed {tracefile_name}
위의 작업을 티팩에서는 다음과 같이 수행할 수 있습니다.
-- 진단 이벤트 켜기
SQL> exec tpack.begin_diag_trace(143, 10046, 12);

-- 진단 이벤트 끄기
SQL> exec tpack.end_diag_trace(143, 10046);

-- 트레이스 파일 열기
SQL> select * from table(tpack.get_diag_trace(143));
티팩을 이용하면 oradebug를 이용하기 위해 텔넷으로 접속할 필요가 없고, 클라이언트에서 SQL*Plus로 모든 작업을 할 수 있습니다. 티팩의 또 하나의 장점은 진단 이벤트을 활성한 이후에 생성된 내용만을 읽는다는 것입니다. 즉 진단 이벤트를 활성화하기 전에 이미 다른 작업들에 의해 많은 양의 데이터들이 트레이스 파일에 기록되어 있다고 하더라도 티팩은 최근에 새롭게 기록된 데이터만을 읽어들입니다.

4. Dump 수행

특정 Process에 바인딩한 후 해당 Process에 대해 다양한 덤프 파일을 생성할 수 있습니다. 아래에 간단한 예가 있습니다.

-- Level 1로 Callstack 덤프 수행
SQL> oradebug dump callstack 1

-- PGA Heap Dump. Level 0x20000001은 최상위 Heap 뿐만 아니라 크기가 가장 큰 5개의 Subheap에 대해 Recursive하게 Dump를 수행하라는 의미입니다. 대단히 유용한 기능입니다.
SQL> oradebug dump heapdump 0x20000001
티팩에서는 위에서 읽은 데이터를 가공해서 분석용 리포트를 제공합니다.
-- 143번 세션에 대해 Callstack 덤프를 1초동안 10회 수행하고 그 결과를 요약해서 리포트할 것
SQL> select * from table(tpack.callstack_prof_report(143));

-- 143번 세션에 대해 PGA Heap Dump를 0x20000001 레벨로 수행하고 그 결과를 해석해서 리포트할 것
SQL> select * from table(tpack.pga_heap_report(143, 2));
티팩은 성능 트러블슈팅에 필요한 기본적인 데이터들 중 일부를 Process에 대한 진단 이벤트나 덤프를 통해 얻습니다. PGA Heap Dump나 Callstack Dump가 대표적인 예입니다. 이런 데이터를 얻기 위한 가장 쉬운(어쩌면 유일한?) 방법으로 oradebug를 사용하고 있습니다.

한가지 기술적인 난관(?)은 SQL 명령내에서 oradebug를 어떻게 호출하느냐입니다. 티팩에서는 Java Stored Procedure를 이용합니다. 여기에 대한 자세한 이야기도 다음에 진행할 예정입니다.

성능 트러블슈팅의 단계가 깊어질수록 oradebug의 매력에 깊이 빠지게 될 것입니다. 특히 Oracle 11g에서는 완전히 새롭게 설계된 Oracle Debugging Framework이 등장했고, 더불어서 oradebug의 기능도 더욱 막강해졌습니다. 자세한 내용은 아래 Tanel Poder의 문서를 참조하세요.

PS) 이 글을 적다보니 oradebug의 사용법(11g의 새로운 Framework까지 포함한)을 상세하게 다룬 실용적인 oradebug 매뉴얼이 있으면 좋겠다는 생각이 드네요. 나중게 기회가 되면 한번 도전해보면 재미있겠습니다.

이전 글 보기

  1. [티팩] 성능 문제를 트러블슈팅하는 두가지 틀(Frame)
저작자 표시
신고
tags : ,
Trackback 0 : Comment 0

Write a comment

티스토리 툴바