30 Temmuz 2010 Cuma

Media Recovery Çeşitleri Nelerdir?

Selamlar,

Bir önceki yazımda bir tablespace'i nasıl offline konumuna getirebileceğimizi anlatmıştım. Dikkate alınması gereken bir konu diyebilirim. Bu konunun içerisinde de sıklıkla media recovery'den bahsetmiştim. Peki bu meşhur media recovery nedir?

Media recovery Oracle'ın online dokümantasyonlarında "Backup & Recovery" başlığı altında bulunmaktadır. Bu recovery tipinde Oracle yedeği alır ve redo'ları işler. Bu redo işleme işine media recovery denir. Media recovery aslında datafile'ların recover edilmesi işlemidir de diyebiliriz.

4 çeşit media recovery bulunmaktadır.

* Complete Recovery
* Incomplete Recovery
* Datafile Media Recovery
* Block Media Recovery

COMPLETE RECOVERY

Complete Recovery online redolog'ları ya da bir incremental yedek ile birlikte full veritabanı yedeğini kullanarak datafile'ların recover edilmesi işlemidir. Bunun adına complete (bütün, tamam) denmesinin nedeni ise online redolog'ların da recover işleminde kullanılması. Online redolog'lar dışında tabii ki archivelog'lardan da yararlanılmaktadır. Complete media recovery işlemini genelde datafile hatalarında ya da controlfile problemlerinde kullanılmaktadır.

Eğer complete media recovery'i veritabanı seviyesinde yapmak istiyorsanız;

1) Veritabanı mount modda olmalı.
2) Recover etmek istediğiniz bütün datafile'ların online konumda bulunması gerekiyor.
3) Bütün bir veritabanı yedeğiniz restore ediyorsunuz.
4) Online redolog'ları ve / veya archivelog'ları işliyorsunuz.

Yukarıdaki işleme kısaca restore / recover diyebiliriz. Backup / recover genelde geçen isimlerdir ancak bir yedeği recover etmeden önce restore etmeniz gerekmektedir. Recover komutu ile online redolog veya archivelog'lar işlenerek media recovery tamamlanır ve veritabanı ya da ilgili obje yeniden kullanıma alınır.

Eğer complete media recovery'i tablespace ya da bir datafile'a uygulamak istiyorsanız;

1) Eğer veritabanı açıksa tablespace ya da ilgili datafile'ı offline konumuna getiriniz.
2) Bir yedeği restore ederek datafile'ı recover ediniz.
3) Online redolog'ları ve / veya archivelog'ları işliyorsunuz.

INCOMPLETE RECOVERY

Bir diğer ad olarak "point-in-time recovery" de diyebiliriz. Bu tarz bir media recovery'de elimizdeki yedeğin güncelleği ne yazık ki güncel olmayacaktır. Bir diğer anlamıyla en güncel ancak veritabanı ile birlikte bütün archivelog'ları ya da online log'ların işlenemiyor olması.

Incomplete media recovery'i genelde şu durumlarda kullıyoruz;

1) Bir media hatasından dolayı online redolog'ların tamamen silinmesi ya da bozulması.
2) Kullanıcı hatasına bağlı olarak düşürülmüş ve geri dönülemeyen (bkz. flashback table) hatası.
3) Kaybolan archivelog'lardan dolayı yapılamayan complete media recovery.
4) Control dosyasının kaybolması ya da bozulmasına bağlı olarak yedekle birlikte alınmış control file'dan dönülmesi.

Sonuç olarak redo, archivelog ya da control file'dan herhangi birinin uçması sonucu complete recovery yapma şansınız kalmıyor.

Incomplete recovery ile veritabanını "ALTER DATABASE OPEN" diyerek açamıyoruz çünkü bir complete media recovery gerçekleştirmedik. Bu komut yerine "ALTER DATABASE OPEN RESETLOGS" komutunu göndermemiz gerekmekte. RESETLOGS komutu redolog sıralamasına yeni bir başlangıç vermesi ve sayacını 1 olarak sıfırdan başlatması. OPEN RESETLOGS komutundan önce veritabanını READ ONLY olarak açarak, veritabanının doğru noktada olduğunu kontrol etmemizde fayda olacaktır "ALTER DATABASE OPEN READ ONLY".

Incomplete media recovery başlığı altındaki bir alt başlık;

Tablespace PITR (Point-in-time Recovery)

Bu tipteki bir media recovery'da geçmişteki bir zamana dönerek, tablespace'i kurtarma işlemini gerçekleştiriyoruz.

1) Hatalı bir drop ya da truncate işlemi gerçekleşmiş ise.
2) Bir tablo mantıksal olarak bozulmuş ise.
3) Bir şemanın fiziksel veritabanı ile tutarsız bir zamana döndürülmesinden sonra.
4) Bütün bir veritabanının restore edilmesindense tek bir tablespace'in restore/recover edildiği durumlarda.

TSPITR seçeneğini aşağıdaki durumlarda kullanamayız;

1) SYSTEM ya da UNDO tablespace'ini recover ederken.
2) Herhangi bir şekilde rollback segment içeren tablespace'leri.

Incomplete media recovery seçenekleri arasında;

1) Time-Based Recovery: İlgili veriyi herhangi belirlenen bir zamana döndürerek.
2) Cancel-Based Recovery: Cancel komutunu verdiğiniz zamana kadar döndürerek (Recovery manager ile kullanılmıyor).
3) Change-Based Recovery: Belirlenen bir SCN (System Change Number) döndürerek.
4) Log Sequence Recovery: Verilen bir log sıra numarasına döndürerek (Recovery manager ile kullanılmıyor).

DATAFILE MEDIA RECOVERY

Bu tip media recovery'de datafile ya da controlfile'ın kurtarılması hedeflenmektedir. Bunun dışında bir önceki tablespace konusunda belirttiğim offline methodlarından immediate methodunun kullanımasından sonra shutdown abort gönderilirse datafile media recovery kullanılabilir.

Online redolog'lar dışında archivelog'lar da kullanılabilmektedir. Bu tipte media recovery'de herhangi bir media hatası taranmamaktadır.

BLOCK MEDIA RECOVERY

Block media recovery'nın özelliği veritabanı online ve işlem görmekte iken data bloklarının restore ve recover edilmesidir. Eğer bir datafile'ın sadece birkaç bloğunda hata varsa datafile media recovery yerine block media recovery tercih edilebilir.

Blocke media recovery kullanımı RMAN (Recovery Manager) ile mümkündür.

Media recovery tiplerinden sonra gelen konu ise Recovery Manager ile yedekleme ve yedekten dönme olabilir.

İyi çalışmalar.

Ogan

Bir Tablespace'i Offline Yapmak

Merhaba,

Temporary (geçici), undo ve system tablespace'lerinin ortak bir özelliği bulunuyor. Bu tablespace'leri offline konumuna alamıyoruz ve hatta system tablespace'ini düşüremiyoruz. Bir tablespace'i offline yapmak istememizin en büyük nedenlerinden birisi bünyesinde bulunan bir datafile'ı başka bir alana taşımak veya yeniden adlandırmak olabilir. Ya da offline olarak yedeğini almak isteyebilirsiniz ki online olarak yedeği alınabilmekte.

Bir tablespace'i offline konumuna getirebilmek için kullanabileceğiniz birkaç offline methodu bulunuyor.

1) Normal: Bir tablespace offline normal konumuna eğer herhangi bir datafile'ında bir hata yoksa alınabilir. Bu komutu gönderdiğiniz zaman Oracle ilgili tablespace'in bütün datafile'larına checkpoint göndererek offline konumuna getirir. Normal son ekini sorgunun sonuna eklemezseniz tablespace normal olarak offline yapılacaktır;

ALTER TABLESPACE TBS_01
OFFLINE [NORMAL];

2) Temporary: Bir ya da birkaç datafile'ınında problem ya da hata olan bir tablespace temporary komutu ile offline konuma çekilebilir. Eğer tablodaki bütün datafile'lar zaten offline ise ve bu komutu yine de göndermişseniz, tablespace'i online yaparken media recovery yapmanıza gerek kalmaz. Ancak bir ya da birden çok datafile'da sorun varsa online yaparken media recovery yapmanız gerekecektir.

ALTER TABLESPACE TBS_02
OFFLINE TEMPORARY;

3) Immediate: Bu komut eklentisi ile Oracle, ilgili tablespace'in datafile'larına bir checkpoint göndermeden offline konumuna çeker. Bu şartlar altında datafile'lar için media recovery yapmak zorunda kalırsınız. Buradaki en önemli nokta ve farklılık ise bir tablespace'i immediate olarak offline yapmak istiyorsanız veritabanınız mutlaka archivelog modda olması gerekiyor. Noarchivelog modda çalışmaktaysanız tablespace'i normal olarak offline yapmanız gerekiyor. Aksi halde olmayan archivelog'lar ile media recovery yapmanız söz konusu değil zaten.

ALTER TABLESPACE TBS_03
OFFLINE IMMEDIATE;

Eğer bir tablespace'i offline yapmak amacındaysanız bunu yapmanın en iyi yolu normal ile yapmaktır. Bu sayede tablespace'i media recovery ile yeniden online yapmanıza gerek kalmayacaktır.

Bir tablespace'i yeniden online yapmak için kullanabileceğiniz komut;

ALTER TABLESPACE TBS_04
ONLINE;

Unutmadan eklemem gerekiyor ki "media recovery" dediğimiz konsept archivelog'ların ilgili tablespace'e işlenerek, datafile'ların yeniden tutarlı hale getirilmesi ve kaldığı yerden devam ederek bağlı olduğu tablespace'in online konumuna getirilmesi diyebiliriz. Aslında bu dediğimden daha fazlası ancak şu an konumuzdaki media recovery'dan kastımız budur. Bir sonraki konuda media recovery'i ele alabiliriz bu durumda :)

İyi çalışmalar.

Ogan

26 Temmuz 2010 Pazartesi

ORA-08104: this index object string is being online built or rebuilt

Merhaba,

Bir tablo üzerinde -ki bu tablonun gerçekten çok büyük olduğunu düşünelim- indeks yaratmak istediniz fakat bu işlemin yarısında bağlantınız koptu ya da kötü bir biçimde bağlantınız sonlandırıldı. Oluşturmak istediğiniz indeksin bilgisini indeksler arasında görüyorsunuz fakat kullanmak ya da düşürmek istediğiniz zaman hata alıyorsunuz. Aldığınız hata ise;

SQL> set serveroutput on;
SQL> exec dbms_output.put_line(SQLERRM('-8104'));
ORA-08104: this index object is being online built or rebuilt

PL/SQL procedure successfully completed.

SQL> alter session set nls_language='TURKISH';

Oturum değiştirildi.

SQL> exec dbms_output.put_line(SQLERRM('-8104'));
ORA-08104: bu dizin nesnesi ilk kez veya yeniden çevrimiçi olarak oluşturuluyor

PL/SQL yordamı başarıyla tamamlandı.

Durumu düzeltmek için Oracle'ın önerdiği yöntem basit ve klasik; veritabanını yeniden başlatın! Ancak biraz araştırma yaptığınız zaman aşağıdaki sonuca ulaşıyorsunuz ve eğer bu durumu bir şekilde çözmezseniz ORA-00600 hataları da eklenecektir. Bunun dışında indeksi tamamen unutun, tabloyu bile düşürmek isterseniz hata almaya devam edeceksiniz. FORCE opsiyonu ile de indeksi düşüremeyeceksiniz.

DECLARE

RetVal BOOLEAN;
OBJECT_ID BINARY_INTEGER;
WAIT_FOR_LOCK BINARY_INTEGER;

BEGIN
OBJECT_ID := 931288;
WAIT_FOR_LOCK := NULL;

RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN (OBJECT_ID);
COMMIT;
END;

DBMS_REPAIR paketinin bir parçası olan ONLINE_INDEX_CLEAN fonksiyonu bize, yarıda kalan indeks oluşturma ya da yeniden yaratma işlemlerini, elle tamamlama şansını sağlar. Bunu aslında SMON (System Monitor) arkaplan görevi periyodik olarak sağlamaktadır. Fonksiyonun cevabı "TRUE" ya da "FALSE" olarak dönebilir. Yukarıdaki RetVal fonksiyonunun boolean olarak tanımlanmasındaki amaçta bu yüzdendir.

İlgili indeksin object_id bilgisine dba_object data dictionary görüntüsünden ulaşabilirsiniz.
SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME = 'IDX_01';
İyi çalışmalar.
Ogan


Takip et: @oganozdogan