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';
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
--- --------- --------------- --------------- -------- ---- -------- -------- -----------
12 _SYSSMU3$ PENDING OFFLINE UNDOTBS1 53312D103 19 22976 EOGAOZD sqlplus.exe
MACHINE OS_USER
---------------------- --------------------
TESTCITRIXOP EOGAOZD
---------------------- --------------------
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:
Yorum Gönder