25 Kasım 2010 Perşembe

ORACLE FLASHBACK DATABASE TEKNOLOJİSİ

Flashback geniş bir konu. Drop edilen tabloların geri getirilmesinden, RMAN içinde kullanıma
kadar  birçok  başlık  bulunuyor.  Konu  çok  geniş  olduğundan  bu  yazıda  sadece  Flashback
Database konusuna değineceğim. 

Veri kayıplarını  telafi etmek  için çeşitli recover yöntemleri kullanılabilir. Fakat bu yöntemlerin
en büyük eksikleri, işlem süresinin uzun oluşudur. Data kaybını sıfıra indirseniz bile, bozulan
birkaç  tabloyu  geri  getirmek  için  harcayacağınız  süre,  hatrı  sayılır  zaman  alacaktır. Pratik,
hızlı  ve  güvenli  bir  yöntem  gerekmektedir.  Yarım  saat  geriden  gelen  bir  physical  standby
oluşturmak anlık hataların önüne geçmek  için kullanılabilecek bir  yöntemdir. Fakat  yetersiz
kaldığı  birçok  nokta  çıkacaktır.  Oracle  bu  problemlerin  önüne  geçmek  için  FLASHBACK
özelliğini sunmuştur. 



FLASHBACK  özelliği  sayesinde,  saatler  sürecek  recover  işlemini  birkaç  dakika  içinde
tamamlayıp;  veritabanını  geçmişteki  bir  zaman  dilimine  kolayca  geri  çekebilirsiniz.  Hatta
bununla  kalmaz,  veri  tabanını  geçmiş  ve  gelecek  içinde  getirip  götürebilir  ve  read  only
mode’da sorgular çekebilirsiniz. Fiziksel hatalardan ziyade, özellikle kullanıcı  tabanlı hatalar
için bir can simidi olarak düşünebiliriz. 
Veritabanını Hazırlamak

Flashback  özelliğini  kullanmak  için  üzerinden  geçmemiz  gereken  belli  başlı  adımlar
bulunuyor. Önce veritabanının flashback mode’da olup-olmadığını kontrol ediyoruz:

SQL> SELECT FLASHBACK_ON FROM V$DATABASE;
FLASHBACK_ON      
------------------
NO                

Görüldüğü  gibi  veritabanımızın  flashback  özelliği  açık  değil.  Bunu  değiştirmek  amacıyla
veritabanını kapatıp mount mode’da açmamız gerekiyor. 

SQL>  SHUTDOWN IMMEDIATE;
SQL>  STARTUP MOUNT;
SQL>  SELECT OPEN_MODE FROM V$DATABASE; 
OPEN_MODE
----------
MOUNTED
                                                                                                                                                                                                                            
Flashback’i  aktif  hâle  getirmeden  önce  ikinci  bir  kontrol  yapıyoruz.  Flashback  özelliği  için
veritabanı  ARCHIVELOG  şeklinde  çalışmalıdır.  Bunu  da  kontrol  edip,  gerekirse
değiştiriyoruz:

SQL>  SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE    
------------
NOARCHIVELOG

Sorgu sonucuna bakarak veritabanının arşiv modda olmadığını görüyoruz. Gerçek işlemlerin
yürütüldüğü,  veri  kaybına  toleransın  gösterilemeyeceği  hiçbir  ortamda  NOARCHIVELOG
şeklinde  çalışılmaz.  Ancak  örnek  olarak  kullandığım  veritabanı,  test  amaçlı  olduğundan
şimdiye  kadar  ARCHIVELOG’a  çekme  ihtiyacı  duyulmamış.  şimdi  ise  flashback’in
kullanılabilmesi için veritabanının arşiv mode’a geçmesini sağlamamız gerekiyor! 

Önce arşiv dosyalarının  yazılacağı hedef klasörü  “/data2/TESTDB/archive/” şeklinde ayar-
lıyoruz:

SQL> ALTER SYSTEM SET log_archive_dest_1='LOCATION=/data2/TESTDB/archive/';

Kontrol edelim:
SQL>  show parameter log_archive_dest_1
log_archive_dest_1  string  LOCATION=/data2/TESTDB/archive/

Dosyaların yazılacağı lokasyon bilgisi tutuyorsa; archivelog mode desteğini açalım ve
log_mode bilgisini kontrol edelim:
SQL> ALTER DATABASE ARCHIVELOG;
  Database altered.
  SQL> SELECT LOG_MODE FROM V$DATABASE;
LOG_MODE
------------
ARCHIVELOG

Her şey tamamsa flashback için parametreleri düzenleyebiliriz.

DB_FLASHBACK_RETENTION_TARGET, DB_RECOVERY_FILE_DEST_SIZE ve
DB_RECOVERY_FILE_DEST  olmak üzere bizi ilgilendiren üç temel parametre vardır. Bu
parametreleri kısaca özetlersek:
• •• •  DB_FLASHBACK_RETENTION_TARGET  :  Veritabanını  kaç  dakika  geriye
alabileceğinizi  gösterir. Örneğin  600  değerini  girerseniz,  10  saatlik  zaman  diliminde
herhangi bir noktaya gidebilirsiniz. 

• •• •  DB_RECOVERY_FILE_DEST_SIZE  :  Yedek  işlemleri  için  ayrılan  alanın
boyutunu  belirler.  200  GB’lik  bir  disk  alanına  sahip  olabilirsiniz.  Ama  20  GB’tan
fazlasını  tahsis  etmek  size  cazip  gelmeyebilir.  Bu  sebeple  parametre  değerini,
DB_RECOVERY_FILE_DEST_SIZE=20G  şeklinde  ayarlayıp,  n’olursa  olsun  20GB’i
geçme diye belirtmeniz mümkündür. 

Fakat bu parametre bir üstte gördüğümüz DB_FLASHBACK_RETENTION_TARGET
değeri  ile  çakışabilir.  Örneğin  10080  dakika  (yani  7  gün)  boyunca  herhangi  bir
zamana dönebilecek şekilde DB_FLASHBACK_RETENTION_TARGET 
parametresini  ayarlayabilirsiniz.  Yalnız  DB_RECOVERY_FILE_DEST_SIZE,  20G
şeklinde  ayarlıysa  ve  siz  sadece  bir  günde  20G’in  üstünde  flashback  verisi
yarattıysanız, girilen 10080 değerinin pek bir anlamı kalmayacaktır. 


 DB_RECOVERY_FILE_DEST      : Flashback  bilgisinin  nerede  tutulacağını
belirtir.  Arşiv  dosyalarının  koyulacağı  lokasyonu  belirten  log_archive_dest_1
parametresine benzetebiliriz.



Bu parametrelere göre ayarlamalarımızı yapalım. Veritabanı için Flashback recovery area’yı
maksimum 20GB olsun. Flash recovery area lokasyonu olarak
/data2/TESTDB/flashback_area/ klasörünü verelim. Geri dönebileceğimiz zaman olaraksa
600 dakikalık (10 saat) bir aralık ayaralayalım. 

-- 10 SAAT (600 DAKIKA) FLASHBACK AYARI
SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=600;
System altered.
-- 20GB UST LIMIT
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G;
System altered.

-- LOKASYON BELIRLENIYOR
SQL> ALTER SYSTEM SET   
  DB_RECOVERY_FILE_DEST='/data2/TESTDB/flashback_area/';
System altered.

Bazı durumlarda aşağıdaki gibi bir hata mesajıyla karşılaşabilirsiniz: 
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16018: cannot use LOG_ARCHIVE_DEST with LOG_ARCHIVE_DEST_n or
DB_RECOVERY_FILE_DEST

Aşağıdaki adımları takip ederek, sorunu çözebilirsiniz:
    -- ARSIV LOKASYONUNU SIFIRLAYIN
  SQL> ALTER SYSTEM SET log_archive_dest='';

    -- FLASHBACK ICIN KULLANILACAK ADRESI TEKRAR GIRIN 
SQL> ALTER SYSTEM SET
  DB_RECOVERY_FILE_DEST='/data2/TESTDB/flashback_area/';

    -- ARSIV LOKASYONUNU TEKRAR GIRIN 
SQL> ALTER SYSTEM SET
  log_archive_dest_1='LOCATION=/data2/TESTDB/archive/';

Gerekli değişiklikleri yaptıktan sonra, aşağıdaki ifadeyi çalıştırıp, ayarları kontrol edebilirsiniz: 
SET FEEDBACK OFF
SET LINES 130
COLUMN NAME FORMAT A30
COLUMN FLASHBACK_ON FORMAT A30
COLUMN LOG_MODE FORMAT A50
SELECT NAME, FLASHBACK_ON,LOG_MODE FROM V$DATABASE;
COLUMN NAME FORMAT A30
COLUMN VALUE FORMAT A80
select name,value from v$parameter 
where upper(name) in
('DB_FLASHBACK_RETENTION_TARGET','DB_RECOVERY_FILE_DEST_SIZE',
                      'DB_RECOVERY_FILE_DEST','LOG_ARCHIVE_DEST_1');

NAME                           FLASHBACK_ON                   LOG_MODE                                         
-----------------------------  ------------------------------ ------------
YATIRIM                        NO                             NOARCHIVELOG                                     



NAME                            VALUE                                                                          
------------------------------  -------------------------------------------
log_archive_dest_1              LOCATION=/data2/TESTDB/archive/
db_recovery_file_dest           /data2/TESTDB/flashback_area/
db_recovery_file_dest_size      21474836480                                                                              
db_flashback_retention_target   600   

 Bu noktaya kadar her şey doğruysa, flashback özelliğini aktif hâle getirip, veritabanını
açabiliriz: 

-- FLASHBACK OZELLIGINI AKTIF HALE GETIRELIM
SQL> ALTER DATABASE FLASHBACK ON;
Database altered.

-- VERITABANINI ACALIM
SQL> ALTER DATABASE OPEN;
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
READ WRITE


* Çağatay Cebi'nin aynı başlıklı kitabından yararlanılmıştır.

Hiç yorum yok:

Yorum Gönder