5 Ocak 2011 Çarşamba

"Undo Tablespace 1 moved to Pending Switch-Out state"

Merhaba,


Konunun başlığının nereden geldiğini açıklamaya başlamadan ne olduğunu açıklamak isterim. Bu bilgi mesajı ile ilgili metalink'te bir açıklama bulunuyor (Undo Tablespace Moved To Pending Switch-Out State [ID 341372.1]).


Bu mesaja ek olarak veritabanınızın alert dosyasında aşağıdaki bilgilendirme satırlarını da görmeniz mümkün;



Successfully onlined Undo Tablespace 1494.
Undo Tablespace 1 moved to Pending Switch-Out state.
*** active transactions found in undo tablespace 1 during switch-out.


Peki neden bu satırlar alert.log dosyanıza yazılmış olabilir? Sebebi kısaca varsayılan olarak atanmış bir undo tablespace'ini, hala aktif işlemler (transaction) varken başka bir undo tablespace'ini varsayılan olarak atamanız.


Bir örnek;


SQL> create table ogan_deneme
2 as
3 select * from all_users;


Table created.


--> Henüz aktif bir transaction içerisinde değiliz. Öncelikle bir transaction yaratmamız gerekiyor.


SQL> insert into ogan_deneme
2 select * from ogan_deneme;


127 rows created.


--> Şu anda commit etmedik ve hala transaction'ınımız geçerli.


SQL> select ADDR, XIDUSN,STATUS, START_TIME 
2 from v$transaction;


ADDR         XIDUSN STATUS           START_TIME
-------- ---------- ---------------- --------------------
53312D103          12 ACTIVE           05/01/11 09:11:32



--> Bu transaction henüz commit etmediği sırada başka bir bağlantı ile veritabanı yöneticisinin sisteme girdiğini varsayalım.


SQL> show parameter undo_tablespace;


NAME                                 TYPE        VALUE
   ------------------------------------ ----------- ------------------------------
   undo_tablespace                      string      UNDOTBS1



--> UNDOTBS1 hala commit etmemiş ilk bağlantının aktif rollback segment'lerine sahip.



SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;


System altered.


--> Yukarıdaki komut ile varsayılan ve geçerli olan undo tablespace'i, UNDOTBS1'den UNDOTBS2'ye geçirdik ve bundan sonraki bütün rollback segment kullanacak olan işlemler UNDOTBS2'yi kullanacak.



SQL> show parameter undo_tablespace
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS2



--> Aslında amacımız belli oldu. UNDOTBS1'i geçersiz kılmak ve düşürmek ancak drop işlemini hemen yapamazsınız çünkü hala aktif rollback segment'lere sahipsiniz. Bir başka yazdımda aktif rollback segment'lere sahip olan bir undo tablespace'i nasıl düşürebileceğimizi yazmıştım. Detaylar için tıklayınız.


Buraya kadar her şey normal ancak alert.log dosyanız şu bilgileri göstermeye başladı;



Successfully onlined Undo Tablespace 1494.
Undo Tablespace 1 moved to Pending Switch-Out state.
*** active transactions found in undo tablespace 1 during switch-out.

Oracle bir switch-out operasyonu yapmak istiyor, yani artık UNDOTBS1'i kullanımdan çıkarmayı hedefliyor ancak aktif işlemler bulduğu için bunu yapamıyor. Bu işlemler tamamlandıktan ve aktif olarak kullanılan bir rollback segment kalmadığında ise aşağıdaki mesajı alacaksınız;

Undo Tablespace 1 successfully switched out.

Eğer bu mesajdan önce UNDOTBS1'i düşürmeye çalışırsanız;

ORA-30013 signalled during: DROP TABLESPACE UNDOTBS2 INCLUDING CONTENTS AND DATAFILES ...

Yani Oracle'dan, düşürmek istediğimiz undo tablespace'inin hala kullanımda olduğuna dair bir mesaj ve hata geldi. Peki nasıl hala kullanımda, neden düşüremiyorum? Suçluyu bulabilmek için aşağıdaki sorguyu koşmamız gerekiyor;

SQL> SELECT
2   a.usn,
3   a.name,
4   b.status,
5    c.tablespace_name,
6   d.addr,
7   e.sid,
8   e.serial#,
9    e.username,
10   e.program,
11   e.machine,
12   e.osuser
13   FROM
14    v$rollname a,
15   v$rollstat b,
16   dba_rollback_segs c,
17    v$transaction d,
18   v$session e
19   WHERE
20   a.usn=b.usn AND
21    a.name=c.segment_name AND
22   a.usn=d.xidusn AND
23   d.addr=e.taddr AND
24   b.status='PENDING OFFLINE';

USN NAME      STATUS          TABLESPACE_NAME ADDR     SID  SERIAL#  USERNAME PROGRAM    
--- --------- --------------- --------------- -------- ---- -------- -------- -----------
12   _SYSSMU3$ PENDING OFFLINE UNDOTBS1        53312D103 19    22976     EOGAOZD      sqlplus.exe
MACHINE                OS_USER
---------------------- --------------------
TESTCITRIXOP EOGAOZD

EOGAOZD kullanıcısına ait bir tane PENDING OFFLINE durumunda olan yani offline konumuna çekilmeyi bekleyen bir aktif rollback segment gözükmekte. Eğer buna bir çözüm bulmazsanız Oracle sürekli olarak alert.log dosyasına "Undo Tablespace 1 moved to Pending Switch-Out state" basmaya devam edecektir. Bu işlemin sahibi olan kişi kendiliğinden commit veya rollback komutunu gönderir ve işlemini sonlandırırsa, alert.log dosyası da daha fazla ilgili mesajı basmayacaktır. Mesajın daha fazla gözükmesini istemiyorsanız eğer aşağıdaki komutu koşmanız gerekmektedir;

SQL> ALTER SYSTEM KILL SESSION ', ';

Ancak bu komutu koşmanız, sadece makale başlığındaki mesajın alert.log dosyasına basılmasını engelleyecektir. Commit veya rollback koşmamış bağlantıyı öldürmek, size eskiden kullandığınız ve şimdi kullanmak istemediğiniz undo tablespace (UNDOTBS1)'i düşürmenizin yolunu açmaz! Unutmayın ki hala süresi daha dolmamış (retention period) rollback segment'lerimiz olabilir. Bunlar okuma tutarlılığı ve felaket durumları için hala UNDOTBS1'de bulundurulmaktadır. UNDO_RETENTION zaman aşımı ile birlikte ömrünü doldurduktan sonra aktif olarak kullanılan bir rollback segment de bulunmayacağı için aşağıdaki komutu artık koşabilirsiniz;


SQL> drop tablespace UNDOTBS1 including contents and datafiles;


Tablespace dropped.

İyi çalışmalar.

Ogan

Hiç yorum yok:

Takip et: @oganozdogan