Hurriyet

6 Ağustos 2013 Salı

Oracle Veritabanı: Oracle Error ORA-00054 Resource Busy and Acquire with NOWAIT Specified

Bu hata genelde kaynak çakışması nedeniyle ortaya çıkar. Kaynakların birbirlerini lock etmesi sonucunda ortaya çıkar. 

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