태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

다른 세션의 파라미터 값을 제어하기

오라클 2010.01.08 13:57
세션 모니터링을 하다 보면 다음과 같은 두 가지 요구 사항이 생기기 마련입니다.
  1. 특정 세션이 특정 파라미터 값을 변경한 경우(즉, 시스템 기본 값과 다른 값을 설정한 경우) 이를 확인할 수 있는가?
  2. 특성 세션에 대해서 특정 파라미터의 값을 바꿀 수 있는가?
우선 특정 세션의 파라미터 값을 확인할 수 있는 가장 확실한 방법은 oradebug dump errorstack 명령을 이용하는 것입니다.
-- Session #1
UKJA@ukja1021> @me

SADDR           SID    SERIAL# PID        PADDR
-------- ---------- ---------- ---------- --------
34328D4C        140       5489 5924       3424C60C

UKJA@ukja1021> alter session set "_hash_join_enabled" = false;

Session altered.

-- Session #2
SYS@ukja1021> oradebug setospid 5924
Oracle pid: 15, Windows thread id: 5924, image: ORACLE.EXE (SHAD)
SYS@ukja1021> oradebug dump errorstack 3;
Statement processed.
SYS@ukja1021> oradebug tracefile_name
c:\oracle\admin\ukja1021\udump\ukja1021_ora_5924.trc

SYS@ukja1021> ed c:\oracle\admin\ukja1021\udump\ukja1021_ora_5924.trc

....
Dump event group for SESSION
Dump event group for SYSTEM
DYNAMICALLY MODIFIED PARAMETERS:
  _hash_join_enabled       = FALSE   <--- 주목!
Oracle 10g부터는 V$SES_OPTIMIZER_ENV 뷰를 통해 일부 파라미터 값을 확인할 수 있지만 옵티마이저와 관련된 파라미터 값에 국한된다는 제약이 있습니다.

다른 세션의 파라미터 값을 변경하는 것은 DBMS_SYSTEM 패키지를 통해 가능합니다.

-- Session #2
SYS@ukja1021> exec dbms_system.set_bool_param_in_session(140,5489,'_hash_join_enabled', true);

PL/SQL procedure successfully completed.

-- Session #1
UKJA@ukja1021> @para hash_join_enabled
UKJA@ukja1021> set echo off
old   9: and i.ksppinm like '%&1%'
new   9: and i.ksppinm like '%hash_join_enabled%'

NAME                           VALUE                IS_DEFAUL SES_MODIFI
------------------------------ -------------------- --------- ----------
SYS_MODIFI
----------
DESCRIPTION
------------------------------------------------------------------------

_hash_join_enabled             TRUE                 TRUE      true
false
enable/disable hash join
DBMS_SYTEM.SET_BOOL_PARAM_IN_SESSION 프로시저는 Boolean(True/False) 타입의 파라미터 값을, DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION 프로시저는 Integer 타입의 파라미터 값을 변경하는 기능을 제공합니다. 하지만, 문자열 타입의 파라미터 값을 변경하는 기능은 제공되지 않습니다. 아마, 과거 버전에서 어떤 이유때문에 제공하지 않았는데 그 후 기능 추가나 변경이 없었던 것으로 추측됩니다.

oradebug나 dbms_system 같은 문서화가 잘 되어 있지 않은 기능을 사용해야 한다는 것이 부담스러울 수 있겠습니다. 이런 기능을 사용해서 오라클에 문제가 생기면 기술지원의 영역을 벗어난다는 것또한 큰 부담입니다. 하지만 트러블슈팅을 조금만 깊게 들어가도 곧 이런 히든 기능이 필요해지는 것이 현실이기도 합니다.

저작자 표시
신고
Trackback 0 : Comments 5
  1. DONi 2010.01.08 22:27 신고 Modify/Delete Reply

    저두 DBLINK로 마이그레이션 할 때 자주 쓰는 Built-In Package입니다.
    리모트의 세션 파라미터를 쉽게 변경 할 수 있어서 편리하죠

    리모트디비 접속시 SID, SERIAL# 값을 가져올 경우에
    DBMS_DEBUG_JDWP.CURRENT_SESSION_ID, DBMS_DEBUG_JDWP.CURRENT_SESSION_SERIAL 를 이용하면
    간편합니다.

    다음은 sample입니다.
    /*================================================================================================*/
    EXEC SYS.DBMS_APPLICATION_INFO.SET_MODULE@dblink('Remote Session RUN', TO_CHAR(SYSDATE, 'YYYYMMDD HH24:MI:SS'));
    EXEC SYS.DBMS_LOCK.SLEEP(1);
    -----------------------------------
    VARIABLE v_SID NUMBER;
    VARIABLE v_SERIAL NUMBER;
    -----------------------------------
    EXEC :v_SID := SYS.DBMS_DEBUG_JDWP.CURRENT_SESSION_ID@dblink;
    EXEC :v_SERIAL := SYS.DBMS_DEBUG_JDWP.CURRENT_SESSION_SERIAL@dblink;
    -----------------------------------
    EXEC DBMS_OUTPUT.PUT_LINE('SID is ' || TO_CHAR(:v_SID));
    EXEC DBMS_OUTPUT.PUT_LINE('SERIAL is ' || TO_CHAR(:v_SERIAL));
    -----------------------------------
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'DB_FILE_MULTIBLOCK_READ_COUNT', 128);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, '_SORT_MULTIBLOCK_READ_COUNT', 128);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'SORT_AREA_SIZE', 536870912);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'HASH_AREA_SIZE', 536870912);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'OPTIMIZER_DYNAMIC_SAMPLING', 0);
    EXEC SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'PARALLEL_QUERY_MODE', TRUE);
    EXEC SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'PARALLEL_EXECUTION_ENABLED', TRUE);
    EXEC SYS.DBMS_LOCK.SLEEP(1);
    /* 경우에 따라 한 번 더 실행해야 할 경우도 있었음...
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'DB_FILE_MULTIBLOCK_READ_COUNT', 128);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, '_SORT_MULTIBLOCK_READ_COUNT', 128);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'SORT_AREA_SIZE', 536870912);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'HASH_AREA_SIZE', 536870912);
    EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'OPTIMIZER_DYNAMIC_SAMPLING', 0);
    EXEC SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'PARALLEL_QUERY_MODE', TRUE);
    EXEC SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION@dblink(:v_SID, :v_SERIAL, 'PARALLEL_EXECUTION_ENABLED', TRUE);
    */
    /*================================================================================================*/

    • 욱짜 2010.01.08 22:59 신고 Modify/Delete

      오라클 특정 버전에서 세션 레벨의 파라미터값을 두번 바꾸어주어야 실제로 값이 바뀌는 버그가 있습니다. 아마 그 경우에 해당하지 싶습니다.

  2. 익명 2010.01.09 16:17 신고 Modify/Delete Reply

    특정 session의 parameter값을 변경하는 경우가 어떤 경우가 있는지 궁금하군요..

  3. Eddy 2010.01.11 09:57 신고 Modify/Delete Reply

    이것 참! 맨날 거저 먹는거 같아서 미안하고 감사하고 그렇습니다.

Write a comment

티스토리 툴바