sql >> Database >  >> RDS >> Oracle

Hoe de waitevent Geschiedenis van de Oracle-sessie te vinden

In dit bericht zullen we kijken naar de verschillende vragen om de wachtgebeurtenisgeschiedenis van de Oracle-sessie op te halen.

De geschiedenis van wachtgebeurtenissen in een specifieke sessie vanaf het begin kan worden gevonden met behulp van onderstaande zoekopdracht

stel lijnen 120 in trimspool aan
col gebeurteniskop "Wacht op" formaat a30
col total_waits kop "Totaal|Wacht" formaat 999.999
col tw_ms kop "Wachtte|for (ms)" formaat 999.999,99
col aw_ms head "Gemiddelde|Wacht (ms)" formaat 999.999,99
col mw_ms head "Max|Wacht (ms)" formaat 999.999,99
select event, total_waits, time_waited10 tw_ms,
gemiddelde_wacht
10 aw_ms, max_wait*10 mw_ms
van v$session_event
waar sid =&1
/

Stel dat we de wachtgebeurtenisgeschiedenis van de sessie in een bepaalde periode willen zien om alleen de wachtgebeurtenis in die periode te krijgen

Dan kunnen we de onderstaande ASH-query gebruiken om de gegevens te extraheren

SQL> SELECT event,count()
FROM dba_hist_active_sess_history a
WHERE a.sample_time TUSSEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
to_date('12-OCT-2016 15:04:00′,'DD-MON-YYYY HH24:MI:SS') en session_id=1853 en SESSION_SERIAL#=19 groeperen op gebeurtenis;
GEBEURTENIS AANTAL(
)

logbestand synchroniseren 88

SQL> SELECT module,count()
2 FROM dba_hist_active_sess_history a
3 WHERE a.sample_time TUSSEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
4 to_date('12-OCT-2016 15:04:00′,'DD-MON-YYYY HH24:MI:SS') en session_id=1853 en SESSION_SERIAL#=19 en event ='logbestand sync' groep per module;
MODULE COUNT(
)

e:FND:cp:FNDICM 88

Stel dat we de geschiedenis van de wachtgebeurtenis van het laatste uur willen weten, dan kan onderstaande zoekopdracht worden gebruikt

kolom sample_time formaat a30
selecteer sample_time, session_state, event, sql_id
van v$active_session_history
waar session_id =&1 en sample_time> SYSDATE – 30/(24*60)
bestel op 1;

Belangrijke use case voor de techniek.

Stel dat we willen weten waar een bepaalde sessie op wachtte gedurende een bepaalde periode en wat de sessie blokkeerde

We kunnen onderstaande zoekopdracht gebruiken om een ​​wachtgebeurtenis en andere belangrijke dingen te krijgen

col event format a30
col sample_time format a25
select session_id, sample_time, session_state, event, wait_time, time_waited, sql_id, sql_child_number CH#
van v$active_session_history
waar session_id =19
en sample_time tussen
to_date('9-DEC-16 01.25.00 PM','dd-MON-yy hh:mi:ss PM')
en
to_date( '9-DEC-16 02.25.00 PM','dd-MON-yy uu:mi:ss PM')
bestel op sample_time;

Als de gebeurtenis nu nlq:TX - rijvergrendelingsconflict is, weten we dat een bepaalde sessie deze blokkeert.

selecteer sample_time, session_state, blocking_session, current_obj#, current_file#, current_block#, current_row#
van v$active_session_history
waar sample_time between
to_date('9-DEC-16 01.25 uur' ,'dd-MON-yy uu:mi:ss PM')
en
to_date('9-DEC-16 02.25.00 PM','dd-MON-yy uu:mi:ss PM ')
and session_id =19
and event ='enq:TX – row lock-conflict'
bestellen op sample_time;

Blocking_session toont de sessie-ID waarmee de sessie werd geblokkeerd. We kunnen de sql-instructie ook extraheren met behulp van de hierboven verkregen sql_id voor de geblokkeerde sessie.

Vergelijkbare zoekopdrachten kunnen worden gebruikt om de informatie voor de blokkeringssessie te identificeren en vervolgens passende corrigerende maatregelen te nemen

Belangrijke informatie

Je moet hebben gezien dat we vaak actieve sessiegeschiedenis en actief sessiegeschiedenisarchief hebben gebruikt voor deze vragen

Wat is actieve sessiegeschiedenis

Actieve sessiegeschiedenis peilt de database om de actieve sessies te identificeren en dumpt relevante informatie over elk van hen - zoals de gebruikers-ID, status, de machine waarmee het is verbonden en de SQL die het uitvoert - in een speciaal gebied in het globale systeem gebied (SGA) van de database-instantie genaamd de ASH-buffer

Archief actieve sessiegeschiedenis

Actieve sessiegeschiedenis verzamelt elke seconde informatie over actieve sessies uit de database-instantie. Afhankelijk van de database-activiteit zal dat leiden tot veel gegevens die in de ASH-buffer worden verzameld, maar omdat de ASH-buffer een geheugenresidente structuur is, heeft deze slechts een eindige hoeveelheid ruimte. Bovendien, wanneer de instantie uitvalt, verdwijnt het geheugen van de instantie mee. Daarom archiveert Oracle Database de informatie uit de ASH-buffer naar een databasetabel om deze persistent te maken. Deze gearchiveerde tabelgegevens zijn zichtbaar in een weergave met de naam DBA_HIST_ACTIVE_SESS_HISTORY

Gerelateerde artikelen

Oracle ASH (Active Session History) Nuttige vragen

Hoe te vinden welke sid de volledige tafel scant

Sessiedetails vinden in de Oracle-database

Wat is DB-tijd en gemiddelde actieve sessies, actieve sessie in orakel

hoe een sessie te vinden die veel herhalingen genereert


  1. Krijg een ouder + kinderen boom met pg-promise

  2. Een model verplaatsen tussen twee Django-apps (Django 1.7)

  3. TODATETIMEOFFSET() Voorbeelden in SQL Server

  4. Een GDI-bronlek behandelen