7 Ekim 2010 Perşembe

"session marked for kill", ORA-00031

Selamlar,

ORA-00031 hatası ile karşılaşmamış veya bu zamana kadar sadece "ALTER SYSTEM KILL SESSION" komutunu göndermiş olabilirsiniz. Bu komutu göndermenizle birlikte, ölmesini istediğiniz bağlantının anında ölemeyeceğinden bahsetmek istiyorum.

Bu hatanın açıklaması olarak "öldürülecek bağlantı için hiçbir aksiyon almanıza gerek yok" şeklinde bir bilgi girişi yapılmış. Bununla birlikte, arka arkaya giriş yapılan "ALTER SYSTEM KILL SESSION" komutları sayesinde bağlatının öldürülme zamanı yakınlaştırılabilir ifadesi de eklenmiş.

ALTER SYSTEM KILL SESSION 'sid, serial#' komutunu gönderdiğiniz zaman ölmesini istediğiniz bağlantının ölmesi gerektiği bilgisini yaratıyorsunuz. Ancak bu, o bağlantının komutu gönderdiğiniz an öleceği anlamına gelmiyor. Eğer böyle birşey istiyorsanız unix'e gidip "kill -9 sid" komutunu göndermeniz gerekiyor. Sadece bu komut ile bir bağlantıyı anında sonlandırabilirsiniz, ALTER SYSTEM KILL SESSION ile değil.

ORA-00031 aslında bir hata sayılmayadabilir. Bir bilgi mesajı olarak düşünedebilirsiniz. Aradan ne kadar zaman geçecek olursa olsun, ölmesi için komut gönderdiğiniz bağlantı ölecektir. Tabii burada şöyle bir durum ortaya çıkabilir; ölsün dediğiniz bağlantı hala sorgu çalıştırabilir ve hatta veritabanı kaynaklarını tüketebilir. Aslında bu tüketim bir yerde sonlanacaktır elbet.

Arka plandaki olaylar hakkında net teknik bilgiye sahip olmamakla birlikte şunu söyleyebilirim. Diyelim çok uzun bir sorgu çalıştırdınız ve sorgunun yanıtı size 5 dakikada geliyor. 4ncü dakikanın 50nci saniyesindeyken bağlantınız bir veritabanı yöneticisi tarafından sonlandırıldı. Bağlantınızın sonlandığınız siz aniden göreceksiniz (veritabanı yöneticis ALTER SYSTEM KILL SESSION komutunu gönderdiği anda) ve bağlantınız bitirilecek. Ancak v$session görüntüsü sorgulandığı zaman veritabanı yöneticisi hala bu bağlantıyı veritabanına bağlı olarak görecek. v$session görüntüsünün "STATUS" sütununda ilgili bağlantı "KILLED" yani öldürülmüş statüsü ile görüntülenecek. Daha da ileri giderek, zaten öldürülmeyi ve veritabanından tamamen atılmayı bekleyen bağlantıyı "kill -9 sid" unix komutu ile bir defa daha öldürmek isterseniz, alert.log dosyasında göreceğiniz satırı söylüyorum size;

"SMON Parallel transaction recovery tried"

Öldürdüğünüz bağlantının aslında bir evladı, transaction'ı vardı. Bu transaction daha commit veya rollback gönderilemeden sonlandırıldı. SMON'un bu transaction'ın arkasını da toplaması gerekiyor. SMON, yani "System Monitor Process"'in bir görevi de sonlandırılmış transaction'ların recover edilmesidir. Alert.log dosyasında gördüğünüz mesaj SMON'u harıl harıl çalıştırdığınız anlıma gelebilir ama bunun yanında tabii ki PMON'da çalışmaktadır. Öldürülen bağlantının tahsis ettiği bir kaynak vardı ve bu kaynağında bıraktırılması, herhangi bir kilit almışsa da bıraktırılması gerekmektedir. Bunu da sağlayan "Process Monitor Process" (PMON)'dur.

Bu konuyla ilgili aslında Tanel Poder'ın yazdığı bir blog girişi bulunuyor. Bu girişi de mutlaka okumanızı tavsiye ediyorum.

İyi çalışmalar.

Ogan
Takip et: @oganozdogan