16 Temmuz 2010 Cuma

Aktif Rollback Segment, ORA-01548

Merhabalar,

Başlıkta belirttiğim hatayı bir undo tablespace düşürmek isterken alabilirsiniz. Peki günlük hayatta, undo tablespace'i neden düşürmek (drop) isteyelim? Bunun en büyük nedenini ben tecrübelerime dayanarak söyleyebilirim;

Data Guard kurulumu yapmak için bir veritabanı teslim aldım. Veritabanının toplam boyutu 470 gigabyte olmuş ve data guard replikasyonu için ciddi bir boyut diyebiliriz. Yalnız bu 470G'lik alanın tam 170G kadarını undo tablespace kaplıyordu. Bu undo tablespace'ten kurtulabilirsem ve fragmantasyona uğraşmış olan indeks ve tabloları da küçültebilirsem alanın 200G'lere kadar inebileceğine karar verdim.

İlk iş olarak yeni bir undo tablespace yarattım;

CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/db_1/undo0201.dbf'
SIZE 2G
AUTOEXTEND ON;

Yarattığım undo tablespace'i geçerli olan undo tablespace olarak tanımladım.

ALTER SYSTEM SET undo_tablespace='undotbs_02' SCOPE=BOTH;

Üzerinde aktif olarak session ve rollback segment'e sahip olan bir undo tablespace'i düşürmek isterseniz eğer düşüremeyecek ve offline da yapamayacaksınız. Bunu yapabilmeniz için veritabanını yeniden başlatmanız gerekiyor. Veritabanını yeniden başlattınız ve undotbs_01'i offline yaptınız. Sırada drop etmek var değil mi? Bu arada birkaç parametre hakkında çıktı göstermem gerekiyor.

SQL> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 1800
undo_tablespace string undotbs_02

Veritabanınızım undo yönetimi otomatik ve retention saniyesi de 1800 olarak ayarlanmış. Geçerli undo tablespace ise undotbs_02. Şimdi aşağıdaki drop komutunu gönderiyorsunuz;

DROP TABLESPACE undotbs_01
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;

Aldığınız hata ne olabilir sizce?

ORA-01548: active rollback segment '_SYSSMU44$' found, terminate dropping tablespace

Bu durumda yapmanız gerekenleri aşağıda sırasıyla listeliyorum. Özet olarak belirtmem gerekirse eğer bir undo tablespace'i bu durumda düşürmenin yolu, ilk önce segment'i düşürmektir.

SQL> drop tablespace undotbs_01;
drop tablespace undotbs_01
*
ERROR at line 1:
ORA-01548: active rollback segment '_SYSSMU44$' found, terminate dropping
tablespace

Kullanmakta olduğunuz spfile'dan bir pfile yaratalım;

SQL> create pfile='/home/oracle/initorcl.ora' from spfile;

Yarattığımız pfile dosyasını açalım ve aşağıdaki parametreyi değiştirelim;

undo_management=manual;

Aşağıdaki değişikliği de pfile dosyasına ekleyelim;

*._offline_rollback_segments=(_SYSSMU44$)

Yukarıdaki değişikliği tekbir segment için yaptık ancak birden çok segment ile ilgili problem olabilir. Bunu anlamak için veritabanı açıkken ve undotbs_01 offline konumundayken aşağıdaki sorguyu koşalım;

SQL> select segment_name,status,tablespace_name from dba_rollback_segs;

Status kısmı "needs recovery" olarak geçenlerle ilgili problem yaşayacaksınız demektir. Bu yüzden eğer eklenmesi gereken bir rollback segment varsa, _offline_rollback_segments parametresinin içerisinde "," ile ayırarak ekleyin.

Veritabanını, yeni oluşturduğumuz pfile ile mount modunda açıyoruz;

SQL> startup mount pfile='/home/oracle/initorcl.ora' ;

Ardından undotbs_01'in sahip olduğu datafile'ları düşürüyoruz;

SQL> alter database datafile '/u01/oracle/db_1/undotbs_01.dbf' offline drop;

Bu ve eğer varsa bunun gibi diğer datafile'ları düşürelim.

Şimdi de veritabanımızı açık hale getirelim;

SQL> alter database open;

Veritabanımızı açtıktan sonra da ilgili rollback segment'i düşürebiliriz;

SQL> drop rollback segment '_SYSSMU44$';

Şimdi ise kullanmak istemediğimiz undo tablespace'i düşürelim. Sona çok yaklaştık :)

SQL> drop tablespace undotbs_01 including contents;

including contents'ten sonra "and datafiles" parametresini vermemize gerek yok zira onlar zaten yoklar artık.

Bu durumda veritabanımız bir pfile ile çalışmakta olduğundan spfile'a geri geçebiliriz ancak önce pfile'da yaptığımız değişiklikleri geri almamız gerekiyor. Bunu geri almayı unutmayın!

SQL> create spfile from pfile='/home/oracle/iniorcl.ora';
SQL> shutdown immediate;
SQL> startup;

Bu işlemleri de yaptıktan sonra undo_management, undo_tablespace ve spfile gibi parametrelerinizi "show parameter" komutu ile birlikte kontrol ediniz.

Yukarıdaki işlemleri gerçekleştirirken bir yandan (eğer *nix üzerinde iseniz) tail -f komutu ile alert.log dosyasını takip ediniz. Alert_log. dosyanızın nerede olduğunu öğrenmek içinse;

SQL> show parameter background_dump_dest;

Bu kadar küçük bir ama önemli hatırlatma yapmam gerekiyor. Undo tablespace shrink edilemez diye bir şey yok. Shrink edilebilir ancak aktif segment'e sahip olmaması gerekiyor. Tuttuğu aktif rollback segment'ler bırakıldığı zaman undo tablespace'in boyutu yeniden yapılandırılabilir.

İyi çalışmalar.

Ogan

1 yorum:

ömer arslan dedi ki...

teşekkürler yazı için.

Takip et: @oganozdogan