Commit edilmiş verilerin Flashback version query ile geri alınması
Ekstra kurulum gerektirmeden bir satır üzerinde oynanan tüm kirli oyunları görelim :D
Aslında bu yazıda herhangi bir tablonun herhangi bir satırının üzerinde yapılan tüm değişiklikleri nasıl görebiliriz sorusunun cevabını vericez tabiki oracle ın bize sunduğu güzelliklerle ve ekstra bir kurulum gerektirmeden.
Önce örnek için tablomuzu yaratalım
create table cihaz_sahip
(
cihaz_no number,
sahip_no number
)
;
Sonrasında tablomuz üzerinde çeşitli operasyonlar yapalım
insert into cihaz_sahip
values(1,1);
commit;
update cihaz_sahip
set sahip_no =2
where cihaz_no = 1;
commit;
update cihaz_sahip
set sahip_no =3
where cihaz_no = 1;
commit;
delete cihaz_sahip;
commit;
insert into cihaz_sahip
values(1,5);
commit;
Şimdi yapılan bu işlemleri bir film gibi önümüze dökelim
SELECT cihaz_no,
sahip_no,
versions_starttime,
versions_endtime,
versions_xid,
versions_operation
FROM cihaz_sahip versions BETWEEN TIMESTAMP minvalue AND maxvalue
order by VERSIONS_STARTTIME
VERSIONS_OPERATION
I
U
U
D
I
olarak gördüklerimiz tahmin ettiğiniz üzere I=Insert ,D=Delete ve U=Update işlemlerine denk geliyor
Ayrıca yine
VERSIONS_XID
05002E00AB000000
09002100B2000000
06000B00AA000000
07002700AD000000
03001500AF000000
değerlerini kullanarak yaptığımız işlemi geri alacak sql sorgusunu elde edebilmek mümkün bunun için
SELECT UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = '03001500AF000000';
UNDO_SQL
delete from "DEVELOPER"."CIHAZ_SAHIP" where ROWID = 'AAADm+AAEAAABJuAAB';
Ancak bu FLASHBACK_TRANSACTION_QUERY view ini sorgulayabilmek için
grant select any transaction to kullanici
şeklinde verilebilecek sorgulama hakkına sahip olmanız gerekiyor.
En önemli nokta Flashback Versions Query ler ile ancak kısa bir zaman aralığında filmi izleyebilecek olmanız sınır ise
UNDO_RETENTION
bu parametreyi de sqlplus ile
show parameter UNDO_RETENTION
komutu ile görebilirsiniz.Ben kendi database imde bu değeri 900 saniye olarak görüyorum yani 15 dakika :D
Kaynak :
http://www.oracle.com/technology/pub/articles/10gdba/week1_10gdba.html
Test Ortamı:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
Aslında bu yazıda herhangi bir tablonun herhangi bir satırının üzerinde yapılan tüm değişiklikleri nasıl görebiliriz sorusunun cevabını vericez tabiki oracle ın bize sunduğu güzelliklerle ve ekstra bir kurulum gerektirmeden.
Önce örnek için tablomuzu yaratalım
create table cihaz_sahip
(
cihaz_no number,
sahip_no number
)
;
Sonrasında tablomuz üzerinde çeşitli operasyonlar yapalım
insert into cihaz_sahip
values(1,1);
commit;
update cihaz_sahip
set sahip_no =2
where cihaz_no = 1;
commit;
update cihaz_sahip
set sahip_no =3
where cihaz_no = 1;
commit;
delete cihaz_sahip;
commit;
insert into cihaz_sahip
values(1,5);
commit;
Şimdi yapılan bu işlemleri bir film gibi önümüze dökelim
SELECT cihaz_no,
sahip_no,
versions_starttime,
versions_endtime,
versions_xid,
versions_operation
FROM cihaz_sahip versions BETWEEN TIMESTAMP minvalue AND maxvalue
order by VERSIONS_STARTTIME
VERSIONS_OPERATION
I
U
U
D
I
olarak gördüklerimiz tahmin ettiğiniz üzere I=Insert ,D=Delete ve U=Update işlemlerine denk geliyor
Ayrıca yine
VERSIONS_XID
05002E00AB000000
09002100B2000000
06000B00AA000000
07002700AD000000
03001500AF000000
değerlerini kullanarak yaptığımız işlemi geri alacak sql sorgusunu elde edebilmek mümkün bunun için
SELECT UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = '03001500AF000000';
UNDO_SQL
delete from "DEVELOPER"."CIHAZ_SAHIP" where ROWID = 'AAADm+AAEAAABJuAAB';
Ancak bu FLASHBACK_TRANSACTION_QUERY view ini sorgulayabilmek için
grant select any transaction to kullanici
şeklinde verilebilecek sorgulama hakkına sahip olmanız gerekiyor.
En önemli nokta Flashback Versions Query ler ile ancak kısa bir zaman aralığında filmi izleyebilecek olmanız sınır ise
UNDO_RETENTION
bu parametreyi de sqlplus ile
show parameter UNDO_RETENTION
komutu ile görebilirsiniz.Ben kendi database imde bu değeri 900 saniye olarak görüyorum yani 15 dakika :D
Kaynak :
http://www.oracle.com/technology/pub/articles/10gdba/week1_10gdba.html
Test Ortamı:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
Comments