Блокировка блокировок, созданная из-за неактивного сеанса в последние 2 месяца - PullRequest
0 голосов
/ 27 мая 2019

Как узнать подробности блокировки блокировок из-за неактивного сеанса за последние 2 месяца? Пожалуйста, помогите с PL-SQL код

Ответы [ 3 ]

0 голосов
/ 27 мая 2019
select * from dba_dml_locks where session_id = :p_sid;

select * from dba_ddl_locks where session_id = :p_sid;
0 голосов
/ 28 мая 2019

Вы могли бы быть в состоянии найти информацию о хронологической блокировке в репозитории активной рабочей нагрузки (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 доступен только в Enterprise Edition, если он лицензирован. И по умолчанию он настроен на предоставление информации только в течение 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 не сообщает вам, был ли сеанс блокировки активным или нет. Но эта точка зрения может стать хорошей отправной точкой для расследования.

0 голосов
/ 27 мая 2019

Вы можете отследить сеанс блокировки с помощью такого запроса ниже

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

Вы можете активировать закомментированные параметры так, как вам нужно.

...