Pages

17 Aralık 2010 Cuma

Oracle11g Flashback Özellikleri

Oracle 10g sürümü ile ortaya çıkan Flashback özellikleri pek çok yenilik ile Oracle 11g sürümünde de veritabanı yöneticilerine felaket durumlarında yardımlar sağlamaktadır. Flashback Database, Flashback Data Archive, Flashback Query, Flashback Table, Flashback Version Query, Flashback Drop ve Flashback Transaction Query olarak çeşitli türde bölümlendirilmiş ve herbirinin farklı amaçları olmaktadır.
Flashback Database
Flashback özelliklerinden yararlanmak için veritabanının flashback operasyonları için etkinleştirilmiş olması gerekmektedir. Aşağıda bu etkinleştirme adım-adım anlatılmaktadır.

1.   Oracle Enterprise Manager konsolunda SYS kullanıcısı ve SYSDBA rolü ile oturum açılır.

2.   Açılan ana konsol penceresinde High Avaliability kısmı altında Flashback Database Logging modunun devredışı olduğu görülmektedir. Flashback Database özelliğinden yararlanmak için bu mod etkin olmalıdır. Bunun için DISABLED üzerine tıklıyoruz.

3.   Açılan pencerede Enable Flashback Database seçeneğini tıklıyoruz. Flashback Retention Time seçeneğinin varsayılan ayarı 24 saattir(Flashback Query, DBMS_FLASHBACK ve Flashback Table metotlarında en son geri kurtarma zamanını işaret etmektedir). Dilerseniz bu ayarı arttırabilirsiniz, ancak Flashback Recovery Size ayarınında arttırılması kaçınılmaz olacaktır. APPLY düğmesine tıklayarak Flashback Database modu etkin hale getirilir.
4.   Bir sonraki pencerede yapılan ayarların geçerli olması için veritabanının yeniden başlatılacağını onaylamak için OK tuşuna tıklanır.
5.   Veritabanını yeniden başlatmak için işletim sisteminde yönetici rolüne sahip kullanıcı/şifresi ve Oracle DBA rolündeki sistem kullanıcı/şifresi bilgilerini girip OK tuşuna tıklanır.
Bu noktadan itibaren veritabanını istediğimiz zaman dilimine yada SCN numarasına döndürmek istediğimizde ne kadar  zaman öncesine dönebileceğimiz ile ilgili bilgi için aşağıdaki sorgu kullanılır.
Örneğin; veritabanını  Flashback Database metodu ile 1 gün önceye geri döndürmek için ;
SQL> shutdown;
SQL> startup mount exclusive;
SQL> flashback database to timestamp sysdate - 1;

Flashback Query
Oracle 9i Release 2 sürümü ile başlayarak günümüzde Oracle 11g sürümüne kadar gelen zamanda “as of” takısı SELECT sorgularında bir tablonun belirli bir zaman skalasından veya SCN(System Control Number) numarasından o anki durumu çağırabilmektedir. örneğin, geceyarısıdan sonra silinen satırları bulabilmek veya bir tablonun bugün ile dünkü girilen verileri arasındaki farkları görebilmek için kullanabilmekteyiz.
Aşağıdaki örnekte; UGUR adlı kullanıcı aynı gün içinde yüzlerce kayıt girdikten sonra TB_KURSIYERLER tablosundan 2 kayıdı silmekte ve daha sonra bu işlemi  commit komutu ile diske kalıcı olarak işlemektedir.
SQL > CONN UGUR/****
SQL > DELETE FROM tb_kursiyerler
           WHERE kursiyer_id IN (110,124);
2 rows deleted
SQL> commit;

Ancak, mevcut gün içerisinde UGUR adlı kullanıcı bu silinen kursiyerlerin yanlışlıkla silindiğini ve geri getirilmesi gerektiğini belirtmektedir. En son yedek bir gece once olduğundan ve tablomuza bugün içindede yüzlerce kayıt girdiğinden yedekten geri dönme şansımız yok. Bu noktada, silme işleminin 3 saat once yapıldığı bilgisi verilmektedir. Bir Veritabanı Yöneticisi olarak SYS kullanıcısı ve SYDBA rolunde  oturum açtığımızı farzederek;

SQL > CONN SYS/**** AS SYSDBA
SQL> INSERT INTO ugur.tb_kursiyerler
          SELECT * FROM ugur.tb_kursiyerler
          as of timestamp systimestamp - interval ‘180’ minute
          WHERE ugur.tb_kursiyerler.kursiyer_id NOT IN
         (SELECT kursiyer_id FROM tb_kursiyerler);

SQL> commit,

Yukardaki SQL cümlesini incelersek;  şu anki zamandan 180 dakika önceki TB_KURSİYERLER tablosuna gidiyoruz ve 180 dakika önceki TB_KURSİYER tablosunda yer alan ama şu anki zaman dilimindeki TB_KURSİYERLER tablosunda yer almayan kayıtları bulup, mevcut tablomuza ekliyoruz ve sonra bu işlemi commit ile diske işliyoruz.

DBMS_FLASHBACK

Flashback Query için diğer bir alternative ise DBMS_FLASHBACK paketidir. İkisinin arasındaki ana farklılık Flashback Query obje seviyesinde işlem yaparken, DBMS_FLASHBACK ise oturum seviyesinde çalışmaktadır ve genellikle kısa zaman dilimlerine dönülmek istendiğinde kullanılır.

Kullanıcı oturum seviyesi içinden DBMS_FLASHBACK paketi etkinleştirilebilir ve takip eden tüm işlemleri - çalışan uygulamalarda dahil- “as of” ve “select” sorgusuna gerek kalmadan  geri getirebilir. DBMS_FLASHBACK etkin iken DML işlemlerine izin verilmez.  Aşağıda DBMS_FLASHBACK paketinde kullanılan prosedürler ve bunların tanımları yer almaktadır.

Prosedür
Tanım
DISABLE
Oturum için flashback modunu devredışı bırakır
ENABLE_AT_SYSTEM_CHANGE_NUMBER
SCN belirterek oturumda Flashback modu etkinleştirir.
ENABLE_AT_TIME
TIMESTAMP olarak belirtilen e yakın SCNnumarasını kullanarak oturumda Flashback modu etkinleştirir.
GET_SYSTEM_CHANGE_NUMBER
Mevcut SCN numarasını çağırır.



Üstteki senaryomuzda olduğu gibi UGUR adlı kullanıcı aynı gün içinde yüzlerce kayıt girdikten sonra TB_KURSIYERLER tablosundan 2 kayıdı silmekte ve daha sonra bu işlemi  commit komutu ile diske kalıcı olarak işlemektedir.
SQL > CONN UGUR/****
SQL > DELETE FROM tb_kursiyerler
           WHERE kursiyer_id IN (110,124);
2 rows deleted

SQL> commit;

Ancak, mevcut gün içerisinde UGUR adlı kullanıcı bu silinen kursiyerlerin yanlışlıkla silindiğini ve geri getirilmesi gerektiğini belirtmektedir. En son yedek bir gece once olduğundan ve tablomuza bugün içindede yüzlerce kayıt girdiğinden yedekten geri dönme şansımız yok. Bu noktada, silme işleminin 10 dakika önce yapıldığı bilgisi verilmektedir. UGUR adlı kullanıcı olarak oturum açarak;

SQL > CONN UGUR/****
SQL> execute dbms_flashback.enable_at_time(
          to_timestamp(sysdate-interval ‘15’ minute));

Bu şekilde UGUR adlı kullanıcının oturumu 15 dakika öncesine geri döndüğünden silinen kayıtlar geri gelmiştir. Tabii, bu 10 dakikalık süre içerisinde UGUR adlı kullanıcı herhangi bir veri girişi yapmadığını farzediyoruz. Aksi durumda, Flashback Query kullanmak zaruri olacaktır.

DBMS_FLASHBACK işlemini devredışı bırakmak için UGUR adlı kullanıcı ile aşağıdaki komutu çalıştırmak yeterli gelecektir;

SQL> execute dbms_flashback.disable

Flashback Table

Oracle 10g sürümü ile beraber gelen Flashback table komutu ile bir tablonun sadece geçmiş bir zaman skalasından satırlarını geri kurtarmakla beraber, bu tabloya ait tetikleyiciler, indexler, yordamları dahi veritabanı açıkken geri getirebilmekteyiz. Bir tablo SCN numarasından veya belirli bir zaman diliminden geri getirilebilir. Kullanıcı sayısının az olduğu ve az sayıda tablodan oluşan veritabanı sistemlerinde tavsiye edilen flashback işlemidir. Daha fazla sayıdaki tabloları Flashback Database komutu ile geri getirmek daha avantajlı olacaktır. Flashback Table, standby(beklemede) veritabanlarında ve eklenen/çıkarılan kolonlar gibi bir takım DDL işlemlerinde işlev yapmaz.

Flashback Table özelliğini etkinleştirebilmek için once hedef tablolarda row movement özelliğinin etkin olması lazımdır.

SQL > ALTER TABLE ugur.tb_kursiyerler ENABLE ROW MOVEMENT;
SQL > ALTER TABLE ugur.tb_egitimler ENABLE ROW MOVEMENT;
SQL > ALTER TABLE ugur.tb_egitmenler ENABLE ROW MOVEMENT;

Ertesi gün UGUR adlı kullanıcı, TB_KURSIYERLER tablosundaki 190 kimlik numaralı kursiyer yerine, tüm satırları yanlış bir kopyala-yapıştır işlemi sonucu silmiştir. Bu arada commit ile işlem kalıcı olarak diske yazılmıştır.

SQL> DELETE FROM tb_kursiyerler
SQL> /
217 rows deleted

SQL > commit;
SQL> WHERE kursiyer_id = 190;

Bu durumda UGUR adlı kullanıcı olarak oturum açarak aşağıdaki komut ile bu tabloyu 15 dakika önceki durumuna geri getirme imkanına sahibiz.

SQL> flashback table tb_kursiyerler
          to timestamp systimestamp - interval ‘15’ minute;

SQL> SELECT count(*) FROM tb_kursiyerler;

 COUNT(*)
____________
          107

Flashback Data Archive

Gizli verilerin ve müşteri kayıtlarının yer aldığı tablolardaki satırlardaki değişikliklerinin tarihsel olarak saklanmasının gerekliolduğu SOX veya HIPAA gibi kanuni zorunluluklara tabi firmalar için, Oracle Flashback Data Archive metodu ile tablolardaki tüm değişiklikleri zaman bazlı olarak otomatik olarak kaydeder.

Flashback Data Archive, Oracle 11g ile yeni gelen bir özelliktir. Etkinleştirmek için bir veya daha fazla sayıda ambar alanı oluşturulması, ambar içindeki objeler için varsayılan saklama zamanının tanımlanması ve ilgili tabloların izleme için işaretlenmesi gerekmektedir. Flashback Data Archive içindeki tablolara Flashback Query komutları ile erişebiliriz

  • Arşiv oluşturma:  Create Flashback Archive komutu ile mevcut tablespaceler için arşiv oluşturulabilsede, Oracle arşiv için ayrı bir tablespace oluşturulmasını ve bu tablespace in sadece arşiv için kullanılmasını tavsiye etmektedir. retention takısı ile varsayılan saklama aralığı belirtilir, eğer disk alanında kota tanınlanmak istenirse quota takısı eklenir.
Örneğimizde, arşiv için once bir tablespace oluşturacağız ve daha sonrada SATIŞ departmanı için 2 GB kota limitli ve 3 yıl saklamak üzere bir arşiv oluşturacağız.

SQL > create tablespace satisarsiv
           datafile ‘+DATA(datafile)’ size 10g;

SQL > create flashback archive fb_satis
           tablespace satisarsiv quota 2g
           retention 3 year;

Eğer ilerleyen zamanlarda başka departmanlar içinde arşiv ihtiyacımız olursa, yukardaki create flashback archive komutu ile arşivelemeye devam ederiz. İlerleyen zamanlarda satisarsiv adlı tablespace alanımızda boş alan sıkıntısı ile karşılaşırsak;

SQL> alter flashback archive fb_satis
           add tablespace satisarsiv2 quota 1g;

komutu ile daha önceden oluşturduğumuzu varsaydığımız satisarsiv2 adlı tablespace fb_satis adlı arşive ilave edilerek ek alan kazanılmış olunur.

·         Arşive tablo ekleme:  SQL > ALTER TABLE ugur.tb_kursiyerler flashback archive fb_satis;

komutu ilede UGUR kullanıcısına ait olan TB_KURSİYERLER adlı tablo izleme için işaretlenmekte ve bu tablo üzerindeki tüm değişiklikler FB_SATIS adlı arşivde saklanacaktır.


Flashback Drop ile düşürülen tabloların geri getirilmesi

Bir tabloyu düşürdüğünüz zaman, Oracle düşürülen tablo ile meydana gelen boş alanı başka objelerde kullanmak üzere hemen işleme sokmaz ve RECYCLE BIN olarak bilinen veritabanındaki çöp kutusuna yerleştirir.

SQL > DROP TABLE tb_kursiyerler;

Bu tablo nasıl geri getirilecektir? Düşürülen bir tablonun verilerinin yer aldığı bloklar hala tabloya ait tablespace içerisinde yer alır ve tablespace üzerinde kota olunan durumlarda bu düşürülen tabloya ait bloklar hala kota hesaplamasına dahildir.

Bu tablonun eğer satırları, indeksleri ve istatistikleri ile birlikte geri getirilmesi istenirse aşağıdaki komut kullanılabilir(eğebaşka bir tablo ile referans kısıtlamalarına sahipse bu kısıtlamalar geri gelmez);

SQL> flashback table tb_kursiyerler before drop;

0 yorum:

Yorum Gönder