Home / MAKALELER / Veri Tabanı / Kilitlenmiş oturumları sonlandırmak

Kilitlenmiş oturumları sonlandırmak

Kill Oracle Session

 

Veritabanı kullanıcıları DML ( insert update delete …) sql’i çalıştırdığında  commit yada rollback edene kadar işlem yapılan tablo kilitlenir. Başka birisi o kayıtlarla ulaşamaz. Oracle birden fazla kullanıcıya hizmet sağlarken verinin tutarlılığı ve  güvenliğini sağlamak için table_lock (tabloları kilitleme ) yöntemini kullanır.
Milyonlarca kaydı update yada insert yada delete ederken  yazdığımız sql’de index yada parallel gibi performans artırıcı oracle hintleri kullanmadıysak transaction’ın tamamlanması çok uzun sürebilir .Bu da transaction sonlanana kadar bizim o tabloya erişmemize engel olur.Boyle bir durumda ilgili tabloya hemen erişmemiz gerekiyorsa veritabanı yönetiicisi oalrak  kilitlenmeye sebep olan oturumu sonlandırmamız (kill etmemiz) gerekebilir.
Kilitlenmeye sebep olan kullanıcıyı bulmak  , o kilidi ve kitleyen kişiyi öğrenmek için aşağıdaki sorguyu kullanabiliriz.
 SELECT DISTINCT (vs.sid),
                vs.serial#,
                vs.osuser,
                vs.machine,
                vs.program,
                vs.schemaname schema,
                dmll.name table_name,
                dmll.mode_held,
                vs.blocking_session_status blocking,
                vsql.sql_text
  FROM v$SESSION vs,
       v$locked_object vlo,
       dba_objects dbao,
       dba_dml_locks dmll,
       dba_ddl_locks ddll,
       dba_lock dbal,
       v$sqlarea vsql
 WHERE     vs.sid = vlo.session_id
       AND dbao.object_id = vlo.object_id
       AND vs.sid = dmll.session_id
       AND vs.sid = ddll.session_id
       AND vs.sid = dmll.session_id
       AND vs.sid = dbal.session_id
       AND vs.sql_address = vsql.address;

 

 Böylelikle hangi kullanıcının hangi tabloyu ne zaman kitlediğini öğrendik  ve gerekirse  oturumu kill ederek tablonun LOCK durumunu ortadan kaldırabiliriz.
ALTER SYSTEM KILL SESSION
Kilitlenmeye sebep olan oturumu öldürmek için kullandığımız  temel sözdizimi aşağıdaki gibidir.
Yukardaki Sql sorgumuz sonucu gelen ‘SID’  ve ‘SERIAL’ değerleri  aşağıdaki sorgumuza yazarız.
SQL> ALTER SYSTEM KILL SESSION ‘sid,serial’;
Cluster’daki nodelar üzerindeki  bir session ‘ı kill etmek istediğimizde node üzerinden sonlandırmak için ilgili instance  ‘ın ismini girerek, aşağıdaki gibi session ‘ı sonlandırabiliriz
SQL> ALTER SYSTEM KILL SESSION ‘sid,serial#,@inst_id’;
KILL SESSION komutu oturumu hemen öldürmez. Otumu öldürülmek üzere işaretler ve kilite sebep olan  transaction’ın tamamlanmasını bekler ve işlem bittikten sonra oturumu kill eder.Oturumu kilite sebep olan  transaction’ın tamamlanmasını beklemeden anında sonlandırmak için aşağıdaki sql çalıştırmamız yeterlidir.
SQL>ALTER SYSTEM KILL SESSION ‘sid,serial#’ IMMEDIATE;
Unix otamında oturumları öldürmek
UNIX  yada Linux işletim sistemlerinde sessionları öldürmek için aşağıdaki komut dizini ile sonlandırmak istediğimiz işlemin process_id sini buluruz.
root@TEST #   ps -ef | grep check
    UID     PID         PPID   C    STIME     TTY          TIME     CMD
oracle  3365       3364   0  10:30:00   ?              0:00     /bin/ksh /u01/app/scripts/check_db_lock_state.s
    root  3370      1223   0  10:30:01   pts/5       0:00      grep check
  Alan adı
  acıklama
  UID
  İşlemi yapan kullanıcı
  PID
  İşlem numarası ( process id), her işlem için atanmış uniq bir değerdir
  PPID
  parent process id, gecerli işlemi başlatan process
  C
  Bu lan kullanılmıyor
  STIME
  Gecerli işlemin başlangıç zamanı
  TTY
  Gecerli işlemin kontrol terminali
  TIME
  Gecerli işlemin cpu kullanım süresi
  CMD
  İşlemi çağırmak için kullanılan komut
Kill komutundan sonra yukarda bulmuş olduğumuz PID değerini yazarak entere bastığımızda proocess sonlanır.
Burada doğru PID değerini vermemiz  dikkat etmemiz gereken en önemli şeydir.Yoksa farkında olmadan yanlış bir processi sonlandırabilirz.
root@TEST #    kill  pid
Eğer bir kaç dakika içinde process durmazsa , sessionı aşağıdaki şekilde öldürebilirz.
root@TEST #    kill -9 pid
İyi çalışmalar…

About Yunus Emre Kilinc

Mersin Üniversitesi Bilgisayar Mühendisliği bölümünü bitirdikten sonra Ankara'da yaşamaya başladım. Şu anda Fatih Üniversitesinde İşletme yüksek Lisansı(MBA) na devam etmekteyim. 2010 yılında Oracle DBA eğitimi aldım. OCA 11gR2 sertifikasına sahibim. 2009 yılından beri Türk Telekom A.Ş de xDSL teknolojileri alanında çalışmaktayım. Oracle veritabanı yönetimi konularında kendimi geliştirmeye çalışmaktayım. İlgilendiğim ve kullandığım teknolojiler : Oracle SQL , PL/SQL Oracle 11g , Oracle 10g , UNIX (Sun Solaris), UNIX (HP-UX) ,OSI Model , IP ,DSL ,Unix Shell Scripting

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın