Merhaba arkadaşlar bu yazımda Oracle Flashback teknolojisini örneklerle anlatmaya çalışacagım.

Flashback teknolojisi Oracle 10g ile birlikte çıkmaya başlamış, veri kaybını önlemek için bize yardımcı olan bir recover(kurtarma) teknolojisidir.Flashback teknolojisinin diğer recover yöntemlerinden ayıran en büyük özelliği ise pratik,hızlı ve güvenli bir yöntem olmasıdır.

Flashback ile veritabanımızı geçmiş ve gelecek içerisinde getirip götürebilir ve bunlara read only modda sorgular çekebiliriz.

Oracle 11g’de var olan flashback teknolojileri aşağıdakiler gibidir ;

  • Flashback database
  • Flashback table
  • Flashback query
  • Flashback version query
  • Flashback transaction query
  • Flashback data archive

Flashback özelliğini kullanabilmek için veritabanımız da bazı işlemler yapmalıyız bunlar sırasıyla;

1-Flashback teknolojisini kullanabilmemiz için veritabanımız mutlaka ARCHIVELOG modda olmalıdır.Veritabanımızın ARCHIVELOG modda olup olmadığını öğrenmek için aşağıda ki sorguyu çalıştırabiliriz.

Select log_mode from v$database;

Eger sorgunun sonucu ARCHIVELOG çıkarsa sorun yok ama sorgunun sonucu NOARCHIVELOG çıkarsa aşağıda ki sorguları sıra ile çalıştırarak veritabanımızı ARCHIVELOG moda çekeriz.

NOT : Oracle 11g’de veritabanı varsayılan olarak NOARCHIVELOG modda gelmektedir.

NOT : Veritabanımızı NOARCHIVELOG moddan ARCHIVELOG moda çekmek için veritabanımızı kapatıp mount modda açarız,bu yüzden bu işlemleri veritabanımızı açma kapama yetkisine sahip SYS kullanıcısıyla yapıyorum.

Shutdown immediate;
Startup mount;
Alter database ARCHIVELOG;
Alter database open;

2-Flashback teknolojisini kullanabilmemiz için veritabanımızın flashback_on parametresinin de açık(YES) olması gerekiyor.Veritabanımızın flashback_on parametrsenin hangi modda olduğunu aşağıda ki kodu çalıştırarak öğrenebiliriz.

Select flashback_on from v$database;

NOT : Oracle 11g’de flashback_on parametresi varsayılan olarak kapalı(NO) modda gelmelidir.Flashback parametresini açık(YES) moda getirmek için aşağıda ki sorguyu çalıştırız.

Alter database flashback ON;

NOT : Flashback teknolojisinin parametresini değiştirme işlemini Oracle 10g’de mount modda yapmak zorundayken,Oracle 11g ile birlikte artık bu zorunluk kalkmış veritabanı açık durumdayken de flashback teknolojisinin parametresini değiştirebiliyoruz.

NOT : Flashback_on parametresi 3 deger alabilir bunlar ;

  • NO : Flashback teknolojisi kapalıdır.
  • YES : Flashback teknolojisi kullanılabilir durumdadır.
  • Restore Point Only : Flashback için restore point için özelliğin aktif olmasıdır.(Bir nevi snapshot diyebiliriz bunun için)

FLASHBACK PARAMETRELERİ

DB_FLASHBACK_RETENTION_TARGET : Veritabanımızı kaç dakika geriye alabileceğimizi gösteren parametredir.

db_flashback_retention_target parametresinin değerini aşağıda ki kod ile öğrenebiliriz ;

Select name,value from v$parameter
where name like '%db_flashback_retention_target%';

NOT : db_flashback_retention_target parametresinin değeri varsayılan olarak 1440 dakikadır yani 24 saatdir.

Bu değeri değiştirmek için ise aşağıda ki sorguyu çalıştırabiliriz.

Alter system set db_flashback_retention_target=600;

Yukarıda ki sorgu ile db_flashback_retention_target parametresini 600 dk(10 saat) olarak değiştirmiş olduk.

DB_RECOVERY_FILE_DEST_SIZE : Veritabanımızın yedek işlemleri için ayrılan alanın boyutunu belirler.

db_recovery_file_dest_size parametresinin değerini aşağıda ki kod ile öğrenebiliriz ;

Select name,value from v$parameter
where name like '%db_recovery_file_dest_size%';

db_recovery_file_dest_size parametresinin değerini değiştirmek için ise aşağıda ki sorguyu çalıştırabiliriz.

Alter system set db_recovery_file_dest_size=20G;

Yukarıda ki sorgu ile db_recovery_file_dest_size parametresini 20 GB olarak değiştirmiş olduk.

NOT : db_flashback_retention_target ile db_recovery_file_dest_size parametrelerinin çakışmasına dikkat etmeliyiz.Bunu bir örnek ile açıklayacak olursak db_flashback_retention_target parametresinin değerinin 10080 dk(7 gün) olarak ayarlarsak ve db_recovery_file_dest_size ‘mızıda 20 GB ayarladığımızı varsayarsak ve db_recovery_file_dest_size bir günde dolduğunu varsayarsak db_flashback_retention_target değerinin pek bir önemi kalmaz en fazla 1 gün geriye dönebiliriz bu durumda.

DB_RECOVERY_FILE_DEST : Flashback için kullanılan bilgilerin nerede tutulacağını belirtir.

db_recovery_file_dest parametresinin değerini aşağıda ki kod ile öğrenebiliriz ;

Select name,value from v$parameter
where name like '%db_recovery_file_dest%';

db_recovery_file_dest parametresinin yerini değiştirmek için ise aşağıda ki sorguyu çalıştırabiliriz.

Alter system set db_recovery_file_dest='C:\app\Mustafa\data2';

Yukarıda ki sorgu ile db_recovery_file_dest parametresinin yerini değiştirmiş olduk.

Flashback İle Dönmek İstedigimiz Anı Belirleme

Flashback operasyonlarını anlatmadan önce,Flashback teknolojisi ile dönmek istediğimiz anı nasıl ve neye göre belirleriz ondan bahsetmek istedim.Flashback teknolojisi ile 2 şekilde dönmek istediğimiz anı belirleriz bunlardan biri SCN(System Change) numbarası diğeri ise tarihdir.

SCN veritabanın da yapılan her işlem için sürekli artan numerik bir değerdir.Mevcut SCN değerini aşağıda ki koddan öğrenebiliriz ;

Select current_scn from v$database;

SCN değerinin hangi zamana denk geldiğini öğrenmek için aşağıda ki sorguyu çalıştırabiliriz.

Select scn_to_timestamp(981572) from dual;

Yukarıda ki sorguda 981572 numaralı SCN kodunun hangi zamana denk geldiğini bulmuş olduk.

İstedigimiz bir zamanın hangi SCN numarasına denk geldiğini ise aşağıda ki sorgu ile öğrenebiliriz.

Select timestamp_to_scn(to_timestamp('29-07-12 04.26.36','dd.mm.yy hh24:mi:ss')) from dual;

Yukarıda ki sorguda girdiğimiz tarihin SCN numarasını ögrenmiş olduk.

NOT : SCN değeri her veritabanı için kendine özgüdür.Ve bir süre sonra geçerliliğini yitirir.Çok eski SCN numaralarına ulaşamayız.

FLASHBACK DATABASE

Flashback database ile çok hızlı olarak istediğimiz bir ana veritabanını geri veya ileri götürebiliriz.

Bunu bir senaryoyla açıklayacak olursak,benim şu anda veritabanım da mustafa diye bir kullanıcım ve flashback_database_deneme diye bir tablom var ve tablomda da verilerim var.Senaryoma göre ben kullanıcımı ve table’mı siliyorum ve daha sonra bunu flashback database ile geri getirmeye çalışacağım.İşlemleri adım adım yapalım.

1-Öncelikle mustafa kullanıcım ve flashback_database_deneme tablom varken SCN değerimi öğreniyorum.


Select current_scn from v$database;

982240

2-Daha sonra sırası ile mustafa kullanıcımı ve flashback_database_deneme tablomu siliyorum.

Drop user mustafa;
DROP TABLE flashback_database_deneme CASCADE CONSTRAINTS ;

3-Şimdi Flashback database ile veritabanımızı geri alalım.

NOT : Flashback database ile recover yapmak istediğimiz zaman veritabanımız mutlaka mount modda olmalıdır.

Shutdown immediate;
Startup mount;
Flashback database to scn 982240;
Alter database open resetlogs;

Flashback database operasyonundan sonra mustafa kullanıcısı ve flashback_database_deneme tablom geri geldi.

NOT : Flashback database open to scn 982240; ile veritabanımızı SCN numbarasıyla geri almak yerine,istediğimiz zamanı girerek de veritabanımızı geri alabiliriz.Örnegin;

Flashback database to timestamp to_timestamp('29-07-12 04.26.36','dd-mm-yy hh24.mi.ss');
  • Flashback database ile silinen datafile’leri geri getiremeyiz.Sadece datafile üzerinde yapılabilen değişiklikleri getirebiliriz.
  • Undo datafile üzerinde Shrink yapılırsa Flashback database’i kullanamayız.
  • Control file dosyası backup’dan restore edilir veya create edilirse flashback loğları kullanılamaz.Ve controlfile’in create edildiği tarihten öncesine flashback database komutunu kullanamassınız.

Flashback teknolojisin read only modda açabileceğimizi söylemiştik peki bunun bize sagladıgı avantaj nedir,veritabanımızı tam olarak ne zamana çekmek istediğimizi bilmediğimiz durumlar da deneme yapmak için işimize yarar.Veritabanımızı eski veya ileri bir zamanda read only modda açmak için yapmamız gereken işlemler aynıdır.Sadece veritabanımızı açarken kullandığımız ’ Alter database open resetlogs; ’ yerine aşağıda ki kodu kullanırız ve veritabanımız read only modda açılabiliriz.

Alter database open read only;

Eger read only modda iken veritabanımızın baktığımız şekilde olmasını istersek kullandığımız ’ Alter database open resetlogs; ’ komutunu kullanarak baktığımız gibi olmasını sağlayabiliriz.

Eger read only modda iken veritabanımızı eski anına Flashback yapılmamış haline döndürmek istersek aşağıda ki komutu kullanırız ;

Recover database ;

FLASHBACK TABLE

Flashback table ile tablonun geçmiş bir anda ki durumuna dönebiliriz.Flashback table’ı kullanırken tablolarda ki verilere ait rowid’leri değiştireceği için tablonun row movement özelliğinin aktif(enable) olması gerekmektedir.Bir tablonun row movement özelliğini aşağıda ki kod ile değiştirebiliriz.

Alter table flashback_table_deneme row movement;

Flashback table olayını da bir senaryo üzerinden örneklendirme yapmak istersek bir table oluştururuz veri ekleriz ve sonra eski haline getirmeye çalışırız bunun için sırasıyla aşağıda ki işlemleri takip ederiz;

1-Önce aşağıda ki kod ile bir table oluşturur içine veri eklenmesini saglarız

Create table flashback_table_deneme as Select * from all_tables;

2-Kontrol için bir sorgu çektiğimde aşağıda ki sonuç geliyor.

Select * from  flashback_table_deneme;

2726 rows selected

3-Bu adımda var olan scn değerimizi öğreniyoruz.

Select current_scn from v$database;

984344

4.Şimdi deneme yapabilmek için tablomda ki her şeyi siliyor ve kalıcı olması için commit yapıyorum.

Delete flashback_table_deneme;

2726 rows deleted

Commit;

Commit complete
5.Şimdi tablomuzda veri var mı diye kontrol edelim.

Select * from  flashback_table_deneme;

no rows selected

6.Şimdi flashback table ile tablomuzu eski haline getirelim.

Flashback table flashback_table_deneme to scn 984344;

7. Şimdi tablomuzda veri var mı diye kontrol edelim.

Select * from  flashback_table_deneme;

2726 rows selected

NOT : Tablomuza DML işlemleri yaptık ve commit yapmadan flashback ie ileri veya geri gittik tekrar eski haline döndürmek istediğimiz de DML işlemleri gözükmeyecektir.

NOT : Her table için Flashback table teknolojisini kullanamayız.Örnegin Cluster table,Advanced Queuing tables,static data dictionary tables,system tables,remote tables,object tables,nested tables vb.

FLASHBACK QUERY

Bir hedef zaman seçip sorgularımızın sonucunu sanki o zamandaymış gibi getirmeyi sağlar.

Flashback Query’ide bir senaryo üzerinden örneklendirmeye çalışırsak senaryomuz da önce bir table yaratalım ve yarattıktan hemen sonra SCN numarasını alalım daha sonra tablomuza veriler ekleyelim ve COMMIT yapalım ve son olarak da Flashback query ile SCN numaramızı kullanarak sorgu çekelim.

1-Önce aşağıda ki kod ile bir table oluşturalım.

Create table flashback_query_deneme(id number,name Varchar2(20));

Table created.

2- Bu adımda var olan scn değerimizi öğreniyoruz.

Select current_scn from v$database;

1009505

3-Tablomuza veriler ekleyip commit yapıyoruz.

Insert into flashback_query_deneme values(1,'Mustafa');

1 row created.

COMMIT;

4-Sorgu çekip tablomuzda ki verilerin sayısını görelim.

Select * from flashback_query_deneme;

COUNT(*)
1
5-Şimdi de flashback query ile tablomuz da daha önceden kaç veri oldugunu görelim.

Select count(*) from flashback_query_deneme AS OF SCN 1009505;

COUNT(*)
0

NOT : Flashback Query ile bir zamana baktığımız da o zamanın bize rollback yapılmış halini gösterir.

NOT : Flashback query ile veritabanı üzerin deki tüm zamanlar üzerin de sorgulama yapamayız.Kısıtlama bizim UNDO tablespace mizin alanının yettiği kadardır.Bu alanı da aşağıda ki sorgudan öğrenebiliriz.

show parameter undo_retention;

Varsayılan olarak 900 sn 15 dk’dır.

FLASHBACK VERSION QUERY

Flashback version query ile tablonun satırların da yapılan tüm değişiklikleri görebiliriz.

Flashback version query ile de bir örnek yapmaya çalışırsak öncelikle bir tablo oluşturalım ve bu tablo üzerin de bir takım değişiklikler yapalım daha sonra ise bu yaptığımız değişiklikleri görelim.

1-Table yaratırız.

Create table flashback_version_query_deneme(id NUMBER,name VARCHAR2(20));

2-Table’a veriler ekler sonrada COMMIT yaparız.

insert into flashback_version_query_deneme values(1,'Mustafa');
COMMIT;

3- SCN değerini öğreniriz.

Select current_scn from v$database;

1012292

4-Yine table üzerinde oynamalar yapar veri ekler,siler ve güncelleriz. Her işlemden sonrada COMMIT yaparız.

insert into flashback_version_query_deneme values(2,'Ensar');
COMMIT;
Update flashback_version_query_deneme SET name='Mehmet' where id=1;
COMMIT;
Delete flashback_version_query_deneme where id=2;
COMMIT;
insert into flashback_version_query_deneme values(1,'Mustafa');
COMMIT;

5- SCN değerini öğreniriz.

Select current_scn from v$database;

1012330

6-Şimdi de Flashback version query yardımıyla tablomuz üzerin de hangi işlemler yapılmış onu öğrenelim.

SELECT versions_startscn, versions_starttime,
versions_endscn, versions_endtime,
versions_xid, versions_operation
FROM   flashback_version_query_deneme
VERSIONS BETWEEN SCN 1122055 AND 1122089;

Oracle Flashback Teknolojisi1

Girdigimiz 2 SCN numarası arasında yapılan bütün işlemleri yukarıda ki sorgu ile öğrenmiş olduk U yazanlar update yaptığımızı,I insert yaptığımızı D yazanlar delete yaptığımızı gösterir.

NOT : Eger istersek SCN numaraları yerine minvalue ve maxvalue yazarsak o table’da ki bütün işlemleri gösterir.

FLASHBACK TRANSACTION QUERY

Flaskback transaction query veritabanın da işlem seviyesin de yapılan değişiklikleri göstermeyi sağlar.

Aşagıda ki sorgu ile undo segmentlerde bulunan aktif ve commit edilmiş tüm transactionlar için bilgi döndürür.

SELECT operation, undo_sql,table_name FROM   flashback_transaction_query;

Oracle Flashback Teknolojisi1

FLASHBACK DATA ARCHIVE

Bu özellik Oracle 11g ile birlikte gelmiştir.Bunun amacı kritik öneme sahip tablolar üzerin de yapılan DML işlemlerini farklı bir tablespace’de saklayıp istediğimiz zaman da değişiklikleri görmemizi sağlar.

Burada yapacağımız senaryo çok uzun olduğundan Flashback data archive başka bir makelede yazacağım.

NOT : Flashback için bazı kodlar ;

1-Flashback loglarını gösterir

Select * from v$flashback_database_logfile;

2-Gidilebilecek en eski Flashback zamanını gösterir.

Select * from v$flashback_database_log;

3-Flashback recovery areanın doluluk oranını gösterir.

Select name,to_char(space_limit, '999,999,999,999') as space_limit,
to_char(space_limit - space_used + space_reclaimable,'999,999,999,999')
as space_available,
round((space_used - space_reclaimable)/space_limit * 100, 1)
as pct_full from v$recovery_file_dest;

Yazar : Mustafa Bektaş Tepe
Java && Oracle

Loading