29 Mayıs 2010 Cumartesi

Flashback Query!

Merhabalar,


Benim izlenimlerim arasında bir Oracle özelliği var ki; gerçekten şimdiye kadar geliştirilmiş en güzel Oracle veritabanı özelliği olduğunu düşünüyorum. Bir RAC ya da Data Guard gibi veya ASM gibi ileri düzey ve sistem seviyesinde de çalışmakta olan bir özellik değil ancak hayat kurtarabiliyor. Bu arkadaşımızın adı ise "Flashback". Bu konuyla ilgili daha önce de yazı yazmıştım ve "Flashback Database" komutu ile veritabanını bir yedekleme sistemi kullanmadan nasıl eski tarihe döndürebiliriz onu açıklamıştım.

Öncelikle birkaç örnek vermek istiyorum;

Bir kullanıcınız var ve aktif olarak sorgu çalıştırıyor, tablolara erişip veri siliyor, tablo yaratıyor, paket yaratıyor ya da değiştiriyor. Bunları yaparken de bir tabloda silmemesi gereken bir veriyi, bir arayüz ya da yazdığı sorgu aracılığı ile siliyor ve commit gönderiyor. Geçmiş olsun mu demek lazım ya da soğuk su mu ikram etmek lazım? Cevap, hiçbiri çünkü undo tablespace'in segment'lerinde bundan önceki tablonun şekli de tutuluyor! Bu noktada bir hatırlatma, Flashback bir 10g özelliğidir.

Kullanıcının yapması gereken veritabanı yöneticisi olan kişiye durumu acil bildirecek. İlk yapması gereken budur. Çünkü bu tablodan silinen kayıtların da undo'larda tutulduğu bir süre bulunuyor. Bu süreyi de undo_retention parametresi, saniye türünden belirliyor. Bu parametreyi ne kadar uzun tutarsanız o kadar geriye dönebilir ve görmek istediğiniz verileri görebilirsiniz. Yüksek tutarsanız alandan kaybedersiniz, düşük tutarsanız da geriye dönebildiğiniz zaman aralığı azalır. Bu noktada tercih merkezi veritabanı yöneticisidir.

Kullanım yöntemi ve şeklini ise birkaç örnekle göstermem gerekirse;

SQL> select * from tablo_adi as of timestamp sysdate-3/24; (3 saat önceki tablonuz).

SQL> select * from tablo_adi as of scn scn_sayisi (belirtilen scn'deki tablonuz).

Insert ya da update komutları ile de alt sorgu mahiyetinde de kullanabilirsiniz. Bu noktada PK ya da FK varsa dikkat edilmeli.

Flashback query undo segment'lerini kullanmaktayken rollback komutu ise system segment'lerini kullanıyor. Bu farkı da unutmamak gerekir.

İyi çalışmalar,

Ogan

Hiç yorum yok:

Takip et: @oganozdogan