Как определить текущую сессию?
Иногда бывает нужно узнать SID текущей сессии для Oracle. Это можно сделать так:
SELECT sys_context('USERENV','SESSIONID') FROM DUAL;
или в самом скрипте:
DECLARE
SID VARCHAR(255);
BEGIN
SID := SYS_CONTEXT('USERENV','SESSIONID');
END;
Как определить зависшую сессию?
Определите «нашкодившую» сессию, используя представления [G]V$SESSION и [G]V$PROCESS следующим образом:
SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45
SELECT s.inst_id,
s.sid,
s.serial#,
--s.sql_id,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
INST_ID SID SERIAL# SPID USERNAME PROGRAM
---------- ---------- ---------- ---------- ---------- ---------------------------------------------
1 30 15 3859 TEST sqlplus@oel5-11gr2.localdomaidocument.getElementById('cloakef87a81be71ca3987e5e7cdbb1c94aa5').innerHTML='';var prefix='ma'+'il'+'to';var path='hr'+'ef'+'=';var addyef87a81be71ca3987e5e7cdbb1c94aa5='sqlplus'+'@';addyef87a81be71ca3987e5e7cdbb1c94aa5=addyef87a81be71ca3987e5e7cdbb1c94aa5+'oel5-11gr2'+'.'+'localdomai';var addy_textef87a81be71ca3987e5e7cdbb1c94aa5='sqlplus'+'@'+'oel5-11gr2'+'.'+'localdomai';document.getElementById('cloakef87a81be71ca3987e5e7cdbb1c94aa5').innerHTML+='<a '+path+'\''+prefix+':'+addyef87a81be71ca3987e5e7cdbb1c94aa5+'\'>'+addy_textef87a81be71ca3987e5e7cdbb1c94aa5+'<\/a>';n (TNS V1-V3)
1 23 287 3834 SYS sqlplus@oel5-11gr2.localdomaidocument.getElementById('cloaka602c2d7a7d345d1b2e6b7b399863276').innerHTML='';var prefix='ma'+'il'+'to';var path='hr'+'ef'+'=';var addya602c2d7a7d345d1b2e6b7b399863276='sqlplus'+'@';addya602c2d7a7d345d1b2e6b7b399863276=addya602c2d7a7d345d1b2e6b7b399863276+'oel5-11gr2'+'.'+'localdomai';var addy_texta602c2d7a7d345d1b2e6b7b399863276='sqlplus'+'@'+'oel5-11gr2'+'.'+'localdomai';document.getElementById('cloaka602c2d7a7d345d1b2e6b7b399863276').innerHTML+='<a '+path+'\''+prefix+':'+addya602c2d7a7d345d1b2e6b7b399863276+'\'>'+addy_texta602c2d7a7d345d1b2e6b7b399863276+'<\/a>';n (TNS V1-V3)
1 40 387 4663 oracle@oel5-11gr2.localdomaidocument.getElementById('cloak0125507a321c2078b60d710eefaa2a63').innerHTML='';var prefix='ma'+'il'+'to';var path='hr'+'ef'+'=';var addy0125507a321c2078b60d710eefaa2a63='oracle'+'@';addy0125507a321c2078b60d710eefaa2a63=addy0125507a321c2078b60d710eefaa2a63+'oel5-11gr2'+'.'+'localdomai';var addy_text0125507a321c2078b60d710eefaa2a63='oracle'+'@'+'oel5-11gr2'+'.'+'localdomai';document.getElementById('cloak0125507a321c2078b60d710eefaa2a63').innerHTML+='<a '+path+'\''+prefix+':'+addy0125507a321c2078b60d710eefaa2a63+'\'>'+addy_text0125507a321c2078b60d710eefaa2a63+'<\/a>';n (J000)
1 38 125 4665 oracle@oel5-11gr2.localdomaidocument.getElementById('cloak1428d57316d0881f1d997e5f3de05dca').innerHTML='';var prefix='ma'+'il'+'to';var path='hr'+'ef'+'=';var addy1428d57316d0881f1d997e5f3de05dca='oracle'+'@';addy1428d57316d0881f1d997e5f3de05dca=addy1428d57316d0881f1d997e5f3de05dca+'oel5-11gr2'+'.'+'localdomai';var addy_text1428d57316d0881f1d997e5f3de05dca='oracle'+'@'+'oel5-11gr2'+'.'+'localdomai';document.getElementById('cloak1428d57316d0881f1d997e5f3de05dca').innerHTML+='<a '+path+'\''+prefix+':'+addy1428d57316d0881f1d997e5f3de05dca+'\'>'+addy_text1428d57316d0881f1d997e5f3de05dca+'<\/a>';n (J001)
SQL>
Ещё магические команды для нахождения заблокировавшихся/зависших/взаимно заблокировавшихся запросов/сессий/транзакций в Oracle:
SELECT machine, l.name, s.SQL_ID, a.sql_text, s.*, l.*, a.*
FROM v$session s, dba_dml_locks l, v$sqlarea a
WHERE s.sid = l.session_id
AND s.SQL_ID = a.SQL_ID;
А с помощью этого запроса можно узнать фактические параметры зависшего параметризованного запроса:
SELECT sql_id,
t.sql_text sql_text,
b.name bind_name,
b.value_string bind_value
FROM v$sql t
JOIN v$sql_bind_capture b
USING (sql_id)
WHERE b.value_string is not null
AND sql_id = '4jav9xagtavb2';
sql_id — Можно взять в запросе выше, расскоментировав строку `—s.sql_id,`.
46800login-checkНемного про сессии в Oracle
