24 Mayıs 2010 Pazartesi

Deallocate Edilemeyen Datafile

Merhaba,

Unix tabanlı işletim sistemlerinde karşılaşılabilecek bir ufak hata ile ilgili çözüm sunmak istiyorum.

Oracle veritabanınızda bir datafile'ın fiziksel olarak yerini değiştirmek istiyorsunuz ve yapmanız gerekenleri de biliyorsunuz ya da bilmiyorsunuz. Ben aşağıda bu listeyi tekrar hatırlatmak istiyorum;

İlk önce veritabanının fiziksel parçası olan datafile'ın bulunduğu tablespace'i buluyorsunuz;

SQL> select a.name tablespace, b.file#, b.name datafile
from v$tablespace a, v$datafile b
where a.ts#=b.ts#
and b.name = '/usr/db/data01.dbf';

Karşınızdaki listede yerini değiştirmek istediğiniz datafile'ın hangi tablespace'de olduğunu gördünüz. Şimdi ise önce tablespace'i offline konumuna getirerek, datafile'ın fiziksel olarak taşınması işlemine başlayabilirsiniz;

SQL> alter tablespace TS_1 offline normal;

Bu aşamada fiziksel olarak datafile'ın taşınmasını gerçekleştirebilirsiz (unix'te mv yerine cp komutunu koşmanız daha yararlı olacaktır;

# cp /usr/db/data01.dbf /usr/db_1/data01.dbf

Ardından datafile'ın adının değiştiğini Oracle'a iletmemiz gerekiyor;

SQL> alter datafile '/usr/db/data01.dbf' rename '/usr/db_1/data01.dbf';

Son olarak tablespace'i online durumuna getiriyoruz;

SQL> alter tablespace TS_1 online;

Bu aşamalardan geçtiğimiz zaman Oracle artık bu datafile'ın fiziksel olarak yerinin değiştiğini biliyor. Peki unix tarafındaki durum nedir?

Bir datafile'ı kullanmakta olan bir kullanıcı ya da bir background process'i varsa eğer bu datafile fiziksel olarak taşınsa bile kullandığı alanı unix bırakmayacaktır. Sizin cp ya da mv komutu ile taşıdığınız datafile aslında o datafile'ın inode girişi olacaktır. inode taşınmış olacak ve yeni yeri hem unix hem de oracle tarafından biliniyor olacak ancak eski işlemlerin üzerinde işlem yapıyor olmasından dolayı bu datafile'ın kapladığı alanın hala bırakılmadığını göreceksiniz. Bu duruma bir açıklık getirebilmek için kullanabileceğiniz unix programının adı "lsof", yani list of files.

Root kullanıcısı ile aşağıdaki komutu koşalım;

# lsof grep "/usr/db/data01.dbf"

lsof yazılımı bize bu datafile üzerinde hangi session'ın işlem gerçekleştirdiğini gösterecektir. Eğer bir ya da birden çok satır dönüyorsa, bu datafile'ın alanının bırakılmadığını farkedeceksiniz. Eğer hiçbir satır dönmüyorsa da datafile'ın hem fiziksel olarak taşınması gerçekleştirilmiş olacak hem de kullanmakta olduğu alan bilgisi güncellenmiş.

shutdown komutunu gönderirseniz eğer bütün bağlı kullanıcıların ve arkaplan görevlerinin çalışmaları durdurulacağından dolayı unix datafile'ın kapladığı alan bilgisini güncelleyebilecektir çünkü artık bu datafile için işlem sırasında olan ya da işlem yapan bir kullanıcı olmayacaktır.

İyi çalışmalar dilerim,

Ogan

Hiç yorum yok:

Takip et: @oganozdogan