Bu sorunla karşılaşılınca çeşitli çözüm aksiyonları alınabilinir.
- Sorgu bir süre sonra tekrar çalıştırılabilinir.
- Bütün kullanıcılar çıktığında tekrar çalıştırılabilinir.
- Lock yaratan sessionlar kill edilir. (Background veya System prosedürü olmadıkları sürece)
Bu konu için benim tercih ettiğim çözümde önce birbirini kilitleyen sessionlar bulunur. Kilitli sessionları bulmadan önce hangi kaynaklar üzerinde kilitlerin bulunduğunu görmek için belirli tablolar kullanılabilinir.
- DBA_BLOCKERS - Diğer sessionları bekleten sessionları gösterir.
- DBA_DDL_LOCKS - DDL locklarına yol açan ya da bütün DDL lockları request eden sessionlar gösterilir.
- DBA_DML_LOCKS - DML locklarına yol açan ya da bütün DML lockları request eden sessionlar gösterilir.
- DBA_LOCK_INTERNAL - Bir kullanıcı tarafından yol açılan tüm locklar
- DBA_LOCKS - Bütün lock ve latch'ler gösterilir.
- DBA_WAITERS - Diğer sessionları bekleyen ama diğerlerini bekletmeyen sessionlar gösterilir.
DBA_LOCK_INTERNAL örneği:
SELECT
NVL(b.username,'SYS') username,
session_id,lock_type,mode_held,
mode_requested,lock_id1,lock_id2
FROM
sys.dba_lock_internal a,
sys.v_$session b
where b.username='BERKE';
Öldürülecek Session nasıl bulunur?
SELECT s.inst_id,
s.sid,
s.serial#,
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';
Yukarıda bulduğumuz sorguda SID'de ekleyerek daha spesifik bir sonuç bulabiliriz.
Session'lar nasıl kill edilir?
alter system kill session 'sid,serial#';
ya da
alter system kill session 'sid,serial#' immediate;
Kendi Session'ımız nasıl kill edilir?
Buradan kendi session'ımız ile ilgili gerekli bilgileri bulup yukarıdaki sorgulara uygun bir şekilde yerleştirebiliriz.
select sys_context('USERENV','SESSION_USERID') from dual;
select sys_context('USERENV','SID') from dual;
Hiç yorum yok:
Yorum Gönder