v$session 다이내믹 퍼포먼스 뷰를 조회하다보면,
ORA-29275 : 부분 다중바이트 문자 오류가 발생하는 경우가 있는데
이는 sys.v$session 뷰의 action varchar2(32 또는 64 byte) 컬럼이 문제이다.
이 action 컬럼은 DBMS_APPLICATION_INFO.SET_ACTION 프로시저로
애플리케이션이 하는 일을 사용자가 이름 붙여주는 것으로서,
어떤 SQL 로직의 실행 단계를 태그하고자 할 때 사용할 수 있는 컬럼이다.
최초 프로그램이 접속하면 다음과 같이 모듈명과 실행 작업을 지정해주고
BEGIN
DBMS_APPLICATION_INFO.set_module(module_name => '1. 주문',
action_name => '1.1 주문 접수');
-- 수행할 SQL
END;
/
일련의 실행 단계마다, action 에 대해서
BEGIN
DBMS_APPLICATION_INFO.set_action(action_name => '1.2 재고 조회');
-- 수행할 SQL
END;
/
와 같이 이름지어주어, 모니터링 시 확인할 수 있도록 하는 컬럼이다.
어쨌든 이 컬럼으로 인해 Toad 등의 애플리케이션에서
세션 조회가 불가능한 경우에는 action 컬럼에 대해
TO_SINGLE_BYTE('ACTION') 과 같이 함수를 씌워서 직접 조회해볼 수는 있다.
SELECT /*+ RULE */ s.inst_id AS node
, s.username
, CASE
WHEN SUBSTR( s.action, 1, 4 ) = 'FRM:' THEN s.module || '(Form)'
WHEN SUBSTR( s.action, 1, 4 ) = 'Onli' THEN s.module || '(Form)'
WHEN SUBSTR( s.action, 1, 4 ) = 'Conc' THEN s.module || '(Conc)'
ELSE s.module
END AS module
, SUBSTR( CASE WHEN SIGN( LENGTHB( s.program ) - 16 ) = 1 THEN SUBSTR( s.program, 1, 16 ) || '..' ELSE s.program END, 1, 16 ) AS program
, s.osuser||'@'||s.machine AS who
--, s.port
, last_call_et
, TO_CHAR( logon_time, 'mm-dd HH24:MI:SS' ) AS logon_time
, s.sql_id
, 'kill -9 ' || p.spid AS OSKILLCMD
, 'alter system kill session ' || '''' || s.sid || ',' || s.serial# || ',@' || s.inst_id || '''' || '; --'||p.spid||'' AS ORACLEKILLCMD
, s.terminal AS USER_INFO
, SUBSTR( LPAD( TRIM( TO_CHAR( ROUND( p.pga_alloc_mem / 1024 / 1024 ), '999,999' ) ) || 'M', 5, ' ' ), 1, 6 ) AS pga
--, TRIM( ( SELECT SUBSTR( sql_text, 1, 120 ) FROM v$sql sq WHERE sq.sql_id = s.sql_id AND s.sql_hash_value = sq.hash_value AND ROWNUM = 1 ) ) AS sql_text
, CASE
WHEN s.blocking_session IS NULL THEN ''
ELSE SUBSTR( s.blocking_session_status, 1, 3 ) || '(' || s.blocking_instance || ')' || ( s.blocking_session - 1 )
END AS BLOCKING_SID
, s.seconds_in_wait
, SUBSTR( s.event, 1, 32 ) AS wait_event
, TO_SINGLE_BYTE( s.action ) AS action
, ( SELECT sql_text
FROM v$sql sq
WHERE sq.sql_id = s.sql_id AND s.sql_hash_value = sq.hash_value AND ROWNUM = 1 )
AS sql_text
FROM gv$session s, gv$process p
WHERE s.paddr = p.addr
AND s.inst_id = p.inst_id
AND s.status = 'ACTIVE'
AND s.event NOT IN ( 'queue messages'
, 'pipe get'
, 'jobq slave wait'
, 'Streams AQ: waiting for messages in the queue'
, 'class slave wait')
AND s.username IS NOT NULL
AND s.audsid <> USERENV( 'SESSIONID' ) -- which is not my session
--order by s.inst_id,status1 desc,username1 desc , substr(s.action,1,3) desc, module1,last_call_et
ORDER BY s.inst_id, s.status DESC, last_call_et DESC
/