이펙티브 오라클 (2009년)
시스템에 코드를 삽입하라 0 0 63,417

by 구루비스터디 DBMS_APPLICATION_INFO [2018.05.26]


  • "시스템에 코드를 삽입하라"는 얘기는 애플리케이션 여기저기에 상당한 양의 디버그 코드를 포함해야 함을 의미한다.
  • 필요에 따라 풍부한 양의 추적 정보르 생성할 수 있는 능력을 시스템에 내장하는 것을 의미한다.


시스템에 디버그 코드를 삽입할 경우의 이점
  • (1)디버거(debugger) 없이도 코드를 디버깅할 수 있다.
  • (2)성능 저하를 유발하는 시스템 내의 위치를 알 수 있다.


9.1 asktom.oracle.com에 나타난 추적


9.2 원격 디버깅을 위한 코드 삽입

  • mod_plsql : URL이 PL/SQL 저장 프로시저를 실행 할 수 있도록 해 주는 아파치 모듈
  • OWA(Oracle Web Agent) 카트리지 -> OWAREPL
  • OIS(Oracle Internet Server)/OWS(Oracle Web Server)에 탑재된 CGI-BIN 프로그램 -> 원격 디버깅을 사용한 사례


9.3 아무 곳에나 DBMS_APPLICATION_INFO를 사용하라

  • 100만 개의 행을 대상으로 하는 CREATE INDEX 혹은 UPDATE와 같이 장시간(3~5초 이상) 소요되는 명령을 수행하면 동적 성능 뷰인 V$SESSION_LONGOPS에 다음과 같은 정보가 포함된다.
    • (1)명령의 시작 시간
    • (2)진행 정도
    • (3)남은 시간


DBMS_APPLICATION_INFO의 용도
  • (1)V$SESSION_LONGOPS 뷰에 값을 설정할 수 있다.
  • (2)세션이 무엇을 수행하고 있는가, 어떤 폼이 수행되고 있는가, 어떤 코드 모듈이 수행되고 있는가?
  • (3)저장 프로시저가 어느 정도 진행되었는가?
  • (4)일괄 처리 작업이 어느 정도 진행되었는가?
  • (5)쿼리에 무슨 바인드 변수 값이 사용되고 있는가?
  • (6)V$SESSION 테이블의 세 개의 열의 값을 설정/반환할 수 있다.
  • 1)CLIENT_INFO : select userenv ('CLIENT_INFO') from dual where some_column = sys_context ('userenv', 'CLIENT_INFO');
  • 2)ACTION : 패키지 내에서 수행되고 있는 프로시저의 이름을 저장하는데 적합
  • 3)MODULE : 패키지 이름과 같은 주요 프로세스의 이름이어야 한다.
  • 오라클 제공 패키지 가이드(Oracle Supplied Packages Guide) 참조


9.4 PL/SQL에 DEBUG.F를 사용하라

  • 고객에 의해 개발된 패키지로 printf를 본떠 C로 구현되었다.
  • 이 패키지는 로그를 남기는 추적 문을 간단하게 PL/SQL 애플리케이션에 추가할 수 있도록 하기 위해 디자인되었다.
  • 예를 들면, 다음과 같은 코드를 작성할 수 있다.



Create procedure p( p_owner in varchar2, p_object_name in varchar2)
As 
    L_status number := 0;
Begin
   Debug.f( 'Entering procedure, inputs "%s", "%s",
             p_owner, p_object_name );

   ... 일부 코드 ...
   debug.f( 'Normal exit, status = %d', l_status );
end;


  • 이 코드는 DEBUG.INT의 호출을 통해 이 모듈의 디버그 추적 파일을 생성하도록 디버그 패키지에 요청한 경우 운영체제에 다음과 같은 추적 파일 메시지를 생성할 것이다.



12062002 213953(P.PROCEDURE 5) Enter procedure inputs "A", "B"
12062002 213955(P.PROCEDURE 56) Normal exit, status = 0


이 메시지에는 아래의 세 가지 정보가 포함된다.
  • (1)프로시저 P가 호출된 시점(12062002는 MMDDYYYY 포맷의 날짜이고, 123953은 HH24MISS 포맷의 시간이다.)
  • (2)메시지를 인쇄한 경우 전송된 입력(기타 모든 DEBUG.F 호출은 이 추적 파일에 자신들의 출력을 남긴다.)
  • (3)이 루틴은 2초 후에 상태 정보 0을 남기고 정상적으로 종료되었다.
  • 오류 발생시 해당 사용자만을 위해 DEBUG.INT를 호출하여 프로시저 P를 추적해서 오류를 재현하면 디버깅이 쉬워지고, 타임스탬프 정보를 통해 프로세스 내에서의 속도 저하 부분을 쉽게 파악할 수 있다.


9.5 애플리케이션에 SQL_TRACE를 사용하라

  • 애플리케이션이 수행하는 모든 SQL 문과 PL/SQL 블록을 추적할 수 있도록 해 주는 SQL_TRACE는데이터베이스의 가장 강력한 튜닝 툴 중의 하나이다.
  • SQL_TRACE는 I/O 작업의 수, 쿼리의 경과 시간, SQL의 수행 횟수 등에 관한 정보를 가지고 있다.
  • 데이터베이스에서 SQL을 실행하는 모든 코드에 부분적으로 디버그 코드가 삽입된 것처럼 동작된다.


MS_DTC를 이용하여 트랜잭션을 관리하는 웹 기반의 애플리케션에서의 SQL_TRACE 사용 방안
  • (1)구성 파일에 플래그르 설정할 수 있는 기능을 추가해서 추적 기능을 ON/OFF
  • (2)필요한 경우 alter session se sql_trace = true를 수행
  • (3)추적 기능이 활성화된 경우 연결을 풀에 반환하기 직전에 set sql_trace = false를 수행해야 한다.


9.6 산업 표준 API를 사용하라



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPEE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2002-12-06 23:21:05</date>
  <millis>967083665789</millis>
  <sequence>1234</sequence>
  <logger>demo.test.foo</logger>
  <level>INFO</level>
  <class>demo.test.LogTest</class>
  <method>writeLog</method>
  <thread>10</thread>
  <message>Entered routine, inputs = 5 and 'Hello'</mesage>
</record>
</log>


  • 이 메시지에는 DEBUG.F 루틴이 생성하는 것과 유사한 정보가 나타난다.
  • 이 패키지는 주요 성능 이슈를 진단하는 데 필요한 모든 정보를 출력하며, 디버깅용으로도 사용할 수 있다.


9.7 자신만의 루틴을 작성하라

  • PL/SQL 혹은 자바 J2EE를 사용하고 있지 않다면 자신만의 독자적인 DEBUG.F 루틴을 작성할 수도 있다.


9.8 감사는 욕이 아니다

  • 감사 추적은 성능 이슈, 사용 패턴, 흔히 발생하는 문제를 지적해 낼 수 있도록 도와 주는 유용한 정보를 제공해 준다.
  • 실제로 사용자들이 애플리케이션을 어떻게 사용하는지 또는 어떻게 애플리케이션을 오용하는지를 알 수 있도록 해 준다.
  • 데이터베이스에 내장된 기능을 사용한 기본적인 감사, 또는 BEFORE CREATE, BEFORE DROP 등과 같은 시스템 이벤트 트리거를 이용한 사용자 정의 감사를 사용하면 많은 정보를 알 수 있다.
"구루비 데이터베이스 스터디모임" 에서 2009년에 "이펙티브 오라클" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3454

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입