Blog

Boşta Kalan oturumları öldürmek

Sessions  = Belâ  eşitliğine inanıyorum. Session problemini iki yaklaşımla çözebiliriz.

1. Sessionların  oluşmasını engellemek, ya da otomatik temizlenmesini sağlamak.
Oracle Profilindeki  idle_time   =10 gibi Ayarlarnarak o profili kullanan kullanıcıların 10 dakidan daha fazla süre boşta kalması engellenir(otomatik düşürülerek).  tabi bunu default kullanıcıya yaparsanız size kızacak birileri varsa 🙂 başka bir profil oluşturup istediğimiz kullanıcıları o profile alabiliriz.

Create Profile BOS_KULLANICI limit idle_time 180;
Alter User <kullanıcıadı> profile BOS_KULLANICI;

tabi bu ayarın etkin olması için   resource_limit parametresinin true değerini taşıması gerekiyor.
alter system set resource_limit=TRUE scope=both;
ikincil olarak denenebilecek bir yöntem sqlnet.ora dosyasında küçük bir değişikliğe gitmektir. eğer sqlnet.ora dosyası yoksa yaratıp içerisine şu satırı ekleyebilirsiniz.  bilakis dosyanız var ve bir şeyler için kullanıyorsanız da dosyanın sonuna yazın gitsin.

SQLNET.EXPIRE_TIME = 10

2. Session beklemede kaldıysa artık iş başa düştü temizleyelim.

önce hangi oturumların gereksiz olabileceğini bulalım. aşağıda 80 dakikadır işlem yapmayan  ve server tarafından açılmamış process ve session bilgileirni görüyoruz.

select spid as thread, osuser, s.program,s.LOGON_TIME,s.STATUS,p.PROGram, s.SID
from v$process p, v$session s
where p.addr=s.paddr and(s.LAST_CALL_ET / 60) > 80 and s.status in (”INACTIVE”,”KILLED”) and osuser<> ”NT AUTHORITYSYSTEM”
order by 2 desc

ardından

c: orakill <instanceadı> <thread>

şeklinde yazıp çalıştırıyoruz. Orakill komutunu çalıştırma fırsatınız yoksa o zaman

ALTER SYSTEM DISCONNECT SESSION ”sid,serial#” IMMEDIATE;

ALTER SYSTEM DISCONNECT SESSION ”sid,serial#” POST_TRANSACTION
bu komutlardan faydalanabilirsiniz.

tabî ki her seferinde böyle uzun uzadıya yazmak olmaz. O zaman istediğimiz session”ı daha kolay kill edebilmek için şöyle bir procedüre yazalım.

create or replace procedure DC_session( p_sid in number, p_serial# in number)
is
cursor_name     pls_integer default dbms_sql.open_cursor;
ignore          pls_integer;
BEGIN

dbms_sql.parse(cursor_name, ”ALTER SYSTEM DISCONNECT SESSION  ”””
||p_sid||”,”||p_serial#||””” IMMEDIATE”,

dbms_sql.native);
ignore := dbms_sql.execute(cursor_name);
END;

Yukarıdaki procedure sadece istediğimizde el ile id leri girerek oturumlardan kurtulmamızı sağlayacak. Şahsen ben her oturum bilgisini tek tek girerek birikmiş session”lardan kurtulmak işini pek sevmedim. bu yüzden oturup bir procedure daha yazdım bu de benim kurtulmak istediğim oturumları bularak yukardaki procedure yolluyor. ben kendime göre birkaç özel koşul koydum.  s.program NOT LIKE ”%KIOSK%” alanını sizin tamamen kaldırmanız faydalı  olacaktır 🙂
(s.LAST_CALL_ET / 60) > 1440 koşulu ise 24 saat içinde işlem yapmamışları bulur. bu süre sizin zevkinze kalmış 🙂

Create or replace procedure DC_Idle_Sessions
is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
for c in( select s.SID,s.SERIAL#
from   v$session s
where (s.LAST_CALL_ET / 60) > 1440 and s.status not in (”ACTIVE”) and s.osuser<> ”NT AUTHORITYSYSTEM” and s.program NOT LIKE ”%KIOSK%”
)
loop
kill_session(c.sid,c.serial#);
end loop;
commit;
end;
‘, ‘