top of page
  • Yazarın fotoÄŸrafıTuncay Tiryaki

Geçmişe yolculuk: Flashback!

Güncelleme tarihi: 23 May 2020

Tabloları geçmişteki bir haline geri döndürme.


Tablolarınızdaki verileri istemeden mi kaybettiniz? Endişe etmeyin, Flashback komutu ile geri getirebiliriz. Fakat elbette bazı şartlar dahilinde...


Flashback ile geçmişe yolculuk...

Oracle 10G ile birlikte gelen Flashback özelliği hem DBA'ler için hem de yazılımcılar için büyük kolaylık sağlamıştır. Bu özellik sayesinde veritabanı açıkken dahi tablolarınızı geçmişteki bir haline döndürebilirsiniz. Yalnız unutmayın, geçmişteki haline geri getirdiğiniz anda tablonuzun mevcut durumu silinir. İşlemleri yapmadan önce bir yedek almanızda fayda var.


Flashback, tablolarınızdaki verinin geçmişte belirlenmiş bir noktaya döndürülmesini sağlar. Bunun için bazı şartlarımız var:


  • Veri tabanınızın flashback özelliÄŸini desteklemesi gerekiyor. Oracle 10G ve sonrası.

  • Bu özellik veri tabanınızda açık olmalı

  • Tabloların row movement özelliÄŸi açık olmalı

  • Geri döndüreceÄŸiniz zaman diliminden bugüne tablo DDL komutu görmemeli

  • Ayrıca geri döneceÄŸiniz verinin silinmemiÅŸ olması gerekmektedir


Şimdi bu özelliklerden bazılarına açıklık getirelim:


Row movement: İlgili tablonuzun bu özelliği açık olmalı, yoksa flashback komutu çalışmaz. Bu özelliği açmak için aşağıdaki gibi komut satırını çalıştırmalısınız.


 alter table flashback_table_test enable row movement

DDL komutu görmemek: Tablonuz üzerinde alan ekleme, çıkarma, tablo ismi değiştirme, tablo fiziksel özellikleri değiştirme gibi komutlardan biri ile değiştirilmiş ise bu değişim öncesine maalesef dönüş yapamazsınız. Çünkü artık tablonuz yeni bir nesneye dönüşmüştür. Bir de Truncate komutunu kullanmışsanız, bu tabloyu da flashback ile geri getiremezsiniz.


Verinin silinmemiş olması: Veri tabanlarının geriye dönmek amacıyla verileri tuttuğu bir disk alanı (Undo Tablespace) vardır. Bu disk alanı sonsuz olmayacağına göre, alan dolduğunda ilk bu alana kaydedilen verilerden başlanarak silinir. Yani First in First out (FIFO) yöntemi kullanılır. Dolayısıyla çok geriye dönük verileri geri getiremeyebilirsiniz.

 

Örnek1 - Drop edilmiş tabloyu geri getirme:


Tabloları drop edilmeden önceki haline geri getirebilirsiniz. Tablolar drop edildikten sonra çöp kutusuna (Recycle Bin) atılırlar. Bu örneğimizde çöp kutusundan geri getirmeyi göreceğiz.


Tabloyu oluşturalım ve 2 kayıt insert ederek commit edelim. Ardından tabloyu drop edelim. Örneğin en altındaki kırmızı font ile yazılmış komut ile tabloyu drop edilmeden önceki haline kolayca geri getirebiliriz:


create table flashback_ornek (ad varchar2(50))

insert into flashback_ornek values('Funda');
insert into flashback_ornek values(‘Selen');
commit;

drop table flashback_ornek;

flashback table flashback_ornek to before drop;
 


Örnek2 - Net bir zamana döndürme:


Tablonuzun verilerinin getirilmesini istediğiniz zaman dilimini net olarak hatırlıyorsanız ya da loglardan böyle bir bilgiye ulaştıysanız, işte aşağıdaki gibi bu zaman dilimini vererek verilerinizi geri getirebilirsiniz.


  • As of Timestamp: Verinizi geri getirmeden önce doÄŸru olup olmadığını kontrol etmek için aÅŸağıdaki SQL'i kullanmanız büyük önem arz eder. Benzer kontrolü örnek3 de de görebilirsiniz.


select * from flashback_ornek as of timestamp
to_date('20.02.20 18:15:00','dd.mm.yyyy hh24:mi:ss');

Mavi ile yazılmış olan to_timesamp ifadesi, bilinen zaman dönüştürme fonksiyonudur. Tablonuzun verisini geri getiren SQL aşağıdakidir.


flashback table flashback_ornek to timestamp
to_timestamp('2020-06-04 11:30:00', 'yyyy-mm-dd hh24:mi:ss');
 


Örnek3 - SCN verisine göre döndürme:


Oracle, her bir değişiklik için System Change Number (SCN) bilgisini üretir. Bu numarayı da vererek tablolarımızı geçmişe döndürebiliriz. Bu numarayı database seviyesinde aşağıdaki SQL ile alabiliriz:


select current_scn, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss')
from v$database;




  • As of SCN: Bu komutla bir tablonun ilgili SCN'deki verisinin gösterilmesi saÄŸlanır. Dikkat edin, aÅŸağıdaki komut tablonun verisini geri döndürmez, geçmiÅŸteki halini gösterir.


select * from flashback_ornek as of scn 3635413;

Aşağıdaki SQL ile de, ilgili SCN'deki veriye geri dönüş sağlanır.

flashback table flashback_ornek to scn 3635413;

 

Örnek4 - Versions Betweens:


Tablonuzdaki verilerin değişim versiyonlanmasını görebileceğiniz bir yapı mevcuttur. Bu özellik sayesinde hangi verinin ne zaman ve nasıl değiştiğini görebiliriz. Bunu güzel bir örnekle açıklayalım:


  • Bir tablomuzdan bir kayıt seçerek görüntüleyelim

  • Sube_adi kolonundaki veriyi 2 kez farklı deÄŸerlerle güncelleyelim ve commit edelim

  • Son olarak özel ve farklı bir SQL ile bu deÄŸiÅŸimi izleyelim


select * from mudurluk_sube where sube_kodu = 3;

update mudurluk_sube set sube_adi = 'Giresun 6. Åžube' 
where sube_kodu = 3;

update mudurluk_sube set sube_adi = 'Giresun 10. Åžube' 
where sube_kodu = 3;

commit;

select versions_starttime, versions_endtime, sube_adi 
from mudurluk_sube
     versions between scn minvalue and maxvalue
where sube_kodu = 3;

Aşağıda görüldüğü üzere Sube_Adi kolonundaki değişimi zaman bazlı olarak izleyebiliyoruz. Bu harika bir özelliktir.


Sonuç olarak, Flashback ile bir çok farklı yöntem ile verilerimizi geri getirebilir, önceki hallerini izleyebilir ve buna göre karar verebiliriz. Bu özelliğin ince ayrıntılarını ihtiyaç oldukça öğrenmeniz sizin yararınıza olacaktır.

134 görüntüleme0 yorum

Son Yazılar

Hepsini Gör
bottom of page