SELECT s.username,
sl.sid,
sq.executions,
sl.last_update_time,
sl.sql_id,
sl.sql_hash_value,
opname,
target,
elapsed_seconds,
time_remaining,
sq.sql_fulltext
FROM v$session_longops sl
INNER JOIN v$sql sq ON sq.sql_id = sl.sql_id
INNER JOIN v$session s ON sl.SID = s.SID AND sl.serial# = s.serial#
WHERE time_remaining > 0
Uzun Süren İşlemler:
Uzun süren işlemler sadece sql`ler olmayabilir. Backup`larin alınması, import export işlemleri gibi database`i ilgilendiren işlemler de aşağidaki sorgumuzda bulunabilinir. Sadece geçen zamani değil aynı zamanda kalan işlem süresini de görebiliriz.
SELECT osuser,
sl.sql_id,
sl.sql_hash_value,
opname,
target,
elapsed_seconds,
time_remaining
FROM v$session_longops sl
inner join v$session s ON sl.SID = s.SID AND sl.SERIAL# = s.SERIAL#
WHERE time_remaining > 0
Uzun Süren Sessionlar ve Onların Kill Edilmesi:
Yukarıdaki gibi uzun süren işlemleri bulduktan sonra aşağıdaki gibi herbirini kill edecek sorgularımızı da çıkartacak bir sorgu yazabiliriz. Aşağıdaki sorgumuz bu işi görmektedir. Çıkan sonucu alıp hepsini bir kere de execute edebiliriz.
10 Saniyeden Uzun Süre Çalışan Session'lar:
Aşağıdaki sorgumuzla da gerektiğinde 10 saniyeden uzun süre çalışan bütün sesssionları kill edebiliriz.
Uzun Süren İşlemlerin Sql'llerinin Bulunması:
Uzun süren işlemler sorgumuzundan gelen SID ve SERIAL# bilgilerini DBA_HIST_ACTIVE_SESS_HISTORY tablosunda sorgulayarak ilgili SQL_ID'yi bulabiliriz. Bu SQL_ID bulunduktan sonra da v$sql'den SQL_ID ile sorgulayabiliriz.
Aşamalarımızı özetlersek yukarıdaki long session ops'taki sid ve serial# bilgilerini aşağıdaki sorgumuzda kullanıp ilgili sql_id'yi buluruz.
Aldığımız SQL_ID bilgisini v$sql tablosunda sorgulatırız.
Referans:
http://www.mydbanotes.com/2010/06/identify-oracle-long-running-sessions.html
http://www.gplivna.eu/papers/v$session_longops.htm
Yukarıdaki gibi uzun süren işlemleri bulduktan sonra aşağıdaki gibi herbirini kill edecek sorgularımızı da çıkartacak bir sorgu yazabiliriz. Aşağıdaki sorgumuz bu işi görmektedir. Çıkan sonucu alıp hepsini bir kere de execute edebiliriz.
select
s.username,
s.sid,
s.serial#,
s.last_call_et seconds_running,
q.sql_text,
'Alter system kill session '''||s.sid||','||serial#||''' immediate;' as SQL_to_kill_long_running_sqls
from
v$session s join v$sqltext_with_newlines q on s.sql_address = q.address
where
status='ACTIVE'
and
type<>'BACKGROUND'
and
last_call> 10 --saniye
order by
sid,
serial#,
q.piece;
10 Saniyeden Uzun Süre Çalışan Session'lar:
Aşağıdaki sorgumuzla da gerektiğinde 10 saniyeden uzun süre çalışan bütün sesssionları kill edebiliriz.
select
s.username,
s.sid,
s.serial#,
s.last_call_et seconds_running,
q.sql_text
from
v$session s join v$sqltext_with_newlines q on s.sql_address = q.address
where
status='ACTIVE'
and
type <>'BACKGROUND'
and
last_call > 10 --saniye
order by
sid,
serial#,
q.piece
Uzun Süren İşlemlerin Sql'llerinin Bulunması:
Uzun süren işlemler sorgumuzundan gelen SID ve SERIAL# bilgilerini DBA_HIST_ACTIVE_SESS_HISTORY tablosunda sorgulayarak ilgili SQL_ID'yi bulabiliriz. Bu SQL_ID bulunduktan sonra da v$sql'den SQL_ID ile sorgulayabiliriz.
Aşamalarımızı özetlersek yukarıdaki long session ops'taki sid ve serial# bilgilerini aşağıdaki sorgumuzda kullanıp ilgili sql_id'yi buluruz.
select
*
from DBA_HIST_ACTIVE_SESS_HISTORY
where
sample_time>sysdate-1
and instance_number in (1,12)
and session_id='2857'
and session_serial#='9617'
order by sample_time,instance_number,SESSION_ID;
Aldığımız SQL_ID bilgisini v$sql tablosunda sorgulatırız.
select * from v$sql where sql_id='0p1cypdyjuf2y';
Referans:
http://www.mydbanotes.com/2010/06/identify-oracle-long-running-sessions.html
http://www.gplivna.eu/papers/v$session_longops.htm
Hiç yorum yok:
Yorum Gönder