Rastgele Yazılar : ORACLE - XML - 1
Rastgele Yazılar : Standby Database' in Incremantal Backup ile Tekrardan S...
Rastgele Yazılar : Meta Data Nedir ?
Rastgele Yazılar : SharePoint 2010 Döküman Yönetimi
Rastgele Yazılar : Group By ve Having By
Rastgele Yazılar : PL-SQL (ORACLE) Fonksiyonları / Decode, NVL, NVL2
Rastgele Yazılar : OBI Dashboard Tablarını Çoklu Satırda Görüntüleme
Rastgele Yazılar : Standby Database Nasıl Gerçek bir Test Ortamına Dönüştü...
Rastgele Yazılar : OLAP Mimarisine Genel Bakış-1
Rastgele Yazılar : Otomatik Bellek Yönetimi - Automatic (Shared) Memory Ma...
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 B.LOGON_TIME,
B.LAST_CALL_ET / 60 dk,
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine,
b.inst_id
FROM v$locked_object a, gv$session b, dba_objects c
WHERE b.sid = a.session_id AND a.object_id = c.object_id;
Sorgumuzun sonucu aşağıdaki gibidir.
LOGON_TIME
DK
OWNER
OBJECT_NAME
OBJECT_TYPE
SID
SERIAL#
STATUS
OSUSER
MACHINE
INST_ID
05.10.2012 15:39:10
18
TEST
DENEME
TABLE
399
51181
ACTIVE
oracle
1
TABLE PARTITION
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 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.
[email protected] # 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.sh
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.
[email protected] # kill pid
Eğer bir kaç dakika içinde process durmazsa , sessionı aşağıdaki şekilde öldürebilirz.
[email protected] # kill -9 pid
İyi çalışmalar...