如何查找由于最近两个月的非活动会话而导致的锁定锁定的详细信息?请提供PL -sql代码帮助
答案 0 :(得分:0)
您可以在下面的此类查询中跟踪阻止会话
select ora_database_name dbname,
v.inst_id,
v.sid,
v.serial#,
v.status,
v.username,
v.blocking_session_status,
v.final_blocking_session,
v.blocking_session,
v.blocking_instance,
v.logon_time,
floor(v.last_call_et / 60) "Duration (Min.)",
nvl(v.module, v.program) Module_Info,
nvl(v.client_info, v.osuser) Client_Info,
v.machine,
v.action
from gv$session v --> gv$session is used for RAC systems
where (v.username not like 'SYS%' and v.username != 'DBSNMP')
and v.status = 'ACTIVE'
and v.blocking_session is not null
--and sid = &sid
--and username = upper('&schema_name')
--and v.osuser like '%'||'&os_user'||'%'
--and lower(nvl(v.client_info,v.osuser)) like lower('%'||'&cli_info'||'%')
--and lower(module) like lower('%'||'&modul_name'||'%')
--and v.inst_id = '&inst_id'
order by "Duration (Min.)", v.username, v.logon_time desc
-- ordering prominently by being hanged duration
您可以根据需要激活已注释掉的选项。
答案 1 :(得分:0)
select * from dba_dml_locks where session_id = :p_sid;
select * from dba_ddl_locks where session_id = :p_sid;
答案 2 :(得分:0)
您可能能够在活动工作负载存储库(AWR)中找到历史阻止信息。该查询可能会有所帮助:
--Blocked sessions for the past two months.
select *
from dba_hist_active_sess_history
where blocking_session is not null
and sample_time > sysdate - interval '2' month
order by sample_time desc;
但是,AWR仅在获得许可的企业版中可用。默认情况下,它仅配置为提供8天的信息。
您可以使用以下代码调查并增加AWR保留期限。但是请记住,存储额外的数据将占用SYSAUX表空间中的额外空间:
--Find how long AWR retains this information.
select dbid, retention from dba_hist_wr_control;
--If necessary, change the retention period to 62 days (62*24*60).
begin
dbms_workload_repository.modify_snapshot_settings(retention => 89280);
end;
/
此外,此信息仅有助于解决某些类型的锁。 AWR使用采样,并且只会捕获(平均)等待锁超过10秒的事物。如果禁用参数RESUMABLE_TIMEOUT
,则某些锁定(例如空格锁定)可能会立即失败。
此外,视图DBA_HIST_ACTIVE_SESS_HISTORY
不会告诉您阻止会话是否处于活动状态。但是,这种观点可能是进行调查的良好起点。