Database’i Flashback ile Geriye Nasıl Sarabiliriz

Zaman zaman test ortamlarında test yapılırken yanlış çalıştırılan bir procedure veya geri alınamayan bir işlemden dolayı test ortamındaki datalarımız işlevselliğini kaybedebilir. Aslında her ne kadar her sistem için çok mümkün gibi gözükmesede production ortamlarda da bu tarz işlemler zaman yapılıyor. Örneğin prod ortamda çalışan uygulama üzerine atılacak olan bir sürüm işleminde ortaya çıkabilecek hataları kestiremiyor ve sonrasında ki çıkabilecek muhtemel hatalardan dolayı bir endişeniz var ise flashback bu konuda size yardımcı olacaktır. İşleme başlamadan önce bir point noktası işaretlersek ve bu noktayı saklarsak sonrasında işlem sırasında alınan bir hatadan dolayı database’ i geriye sarıp işleme başladığımız zamana çok kısa bir sürede dönebiliriz. (Buradaki kısa bir süre kavramı yapılan işlemin detayına göre değişiklik gösterecektir, ama bu tarz bir problemde backupdan dönme ile kıyaslandığında çok ciddi zaman avantajı olacaktır)

Bahsetmiş olduğumuz bu işlemin adımlarının üzerinden geçelim;

* Ön koşul database flashback modda olmak zorundadır. Yani aşağıdaki sorgunun sonucu YES dönmelidir.

select flashback_on  from v$database

 

FLASHBACK_ON

——————

YES

1 row selected.

 

Test veya yapacağınız işlem her ne ise hemen öncesinde restore point noktamızı create ediyoruz;

SQL> create restore point before_test;

Restore point created.

Kontrol ediyoruz;

SQL> select scn, time,name from v$restore_point ;

SCN             TIME                                            NAME

6517128       30.07.2011 20:42:15.000000000    BEFORE_TEST

 

Restore point noktamızda problem yok. Eğer kritik bir işlem öncesinde bu opsiyonu kullanmak istiyorsanız, yaptığınız tüm adımların sorunsuz tanımlandığını kontrol etmeniz sizin yararınıza olacaktır.

Restore point create işleminden sonra yapılan tüm işlemlere ait flashback logları oluşmaya başlayacaktır.

Bu konu ilgili kendi test ortamımda yapmış olduğum test sonuçlarını aşağıdaki gibi ;

Restore point noktası create ettikden sonra database üzerinde 3 tane user create ettim, her user altına birkaç tablo createdip sonrasında bunları delete ile sildim ve test işlemim bitmiş oldu. Şimdi ilk başladığım noktaya geri dönmek istiyorum;

Geri dönüş işlemi mount modda yapıldığından dolayı, database kapatıp mount modda başlatıyorum.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area  419430400 bytes

Fixed Size                  1249320 bytes

Variable Size             146804696 bytes

Database Buffers          264241152 bytes

Redo Buffers                7135232 bytes

Database mounted.

Buraya kadar problem yok, şimdi database’i geriye sarmak için komutumuzu çalıştırıyoruz;

SQL> flashback database to restore point before_test;

flashback database to restore point before_test

*

ERROR at line 1:

ORA-38729: Not enough flashback database log data to do FLASHBACK.

Ve yukarıdaki gibi bir hata aldık. Aslında flashback ile ilgili en kritik noktada burası, siz database’ inizi flashback moda aldığınızda database yapılan işlemleri geri alabilmek için (aksi belirtilmedikçe) flashback_recovery_area  altına flb uzantılı dosyalar ile ihtiyaç duyacağı log dosyalarını oluşturmaya başlayacaktır. Dolayısıyla logların oluşacağı alanın size’ ının bu işlem için yeterli olması gerekecektir.  Benim test ortamımdaki değerler aşağıdaki gibiydi ve size’ ı yeterli olmadığı için logların bir kısmı ezildiğinden dolayı dönüş için gerekli olan tüm loglara ulaşamadığından hata alıyoruz.

SQL> show parameter recover;

NAME                                        TYPE             VALUE

db_recovery_file_dest                 string             C:\oracle\10g\flash_recovery_area

db_recovery_file_dest_size          big integer    10M

Problemsiz olarak dönüşü gerçekleştirmeyi umut ederken bu tarz bir sürprizle karşılaşmamak için restore pointi create ederken logların ezilmemesini garanti altına alabiliriz, ilk restore point noktasını drop edip yenisini create  edelim;

SQL> drop restore point before_test ;

Restore point dropped.

SQL> create restore point before_test_q guarantee flashback database ;

Restore point created.

Şimdi tekrar test yapmaya başlayalım.Dikkat ederseniz flashback recovery area’ nın size’ ına müdahale etmedim hala 10M olarak duruyor. Dolayısıyla birkaç işlemden sonra bu alanın dolmasını ve logları ezemeyeceği için database’ in tepki vermesini bekliyoruz;

Birkaç işlem sonrasında flashback recovery area dolduğu için ve buradaki dosyalarıda silemediği için database hang olmuş durumda, son başlatmış olduğum update kum saatinde takıldı ve bu şekilde kaldı , soruna çözüm bulmak için db_recovery_file_dest_size’ ını artırıp anlık sorunuma çözüm buluyorum.  Dolayısıyla bu tarz bir durumla  karşılaştığımız da da neler olabileceğini de görmüş olduk.

Şimdi dönüş işlemlerimize başlayalım, database’ i kapatıp mount modda başlatıyoruz ;

SQL> flashback database to restore point before_test_q;

Flashback complete.

Flashback komutumuz başarı ile çalıştı, aslında burada bir incomplete recovery yaptığımızdan dolayı database resetlog opsiyonunu kullanarak açmak durumundayız;

SQL> alter database open resetlogs;

Database altered.

Restore point kullanımı bu şekilde ancak burada şunlar da yapılabilir, elimizde tüm flashbaack loglarımız olduğundan dolayı en başa dönmek yerine 10dak öncesine veya 1 saat önceki durumuda dönülebilir, örneğin;

select oldest_flashback_time from v$flashback_database_log;

scripti ile dönebileceğimiz mimunum zamanı öğrenip, sonrasındaki bir zamana dönmek istersek;

flashback database to timestamp sysdate -1/24;

ile 1 saat öncesine dönebiliriz.

 

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


2 + = onbir