top of page

Geçmişe yolculuk: Flashback!

  • Yazarın fotoğrafı: Tuncay Tiryaki
    Tuncay Tiryaki
  • 18 May 2020
  • 3 dakikada okunur

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.

Comments


logo-new.png
  • udemy-black
  • Siyah Instagram Simge
  • Siyah LinkedIn Simge
  • Siyah Facebook Simge

© 2020 dbHunter

bottom of page