Enable flashback database :Tüm VT yi önceye alabiliyor. FlashBack aktif edilmese bile tablo bazında geri getirmeler kullanılabilir. FlashBack in aktif edilmesi ciddi performans kaybettitirir çünkü VT flashback logllara da yazmaya başlıyor.
Not : Bir tablonun yarım saat oncesine alınmasını sağlayan undo dır. (undo retention time).
undo retention : insert/update commit edene kadar undo da durur. FlashBack i destekleyebilmek için commit edilse de retention time kadar bilgi saklanıyor.
FlashBack in 2 aşaması var
1- Undo, tablo bazında onceki verileri gorebilme ve geriye getirme işlemleri için kullanılabilir.
2- FlashBack logging enable edilerek, tüm VT’ yi yarım saat onceye almak mümkün.
1 2 3 4 5 |
SQL> select to_char(sysdate, 'DD/MM/YYYY HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'DD ----------------------------------- 02/06/2011 09:25:29 |
1 2 3 4 |
SQL> update employees 2 set salary=1000 ; SQL> commit; |
1 2 3 4 5 6 7 8 9 10 |
SQL>; select salary from employees; SALARY ---------- 1000 1000 1000 1000 1000 1000 |
where koşulu unutuldugu için tüm tablo değiştirildi bunun için 09:25 donmek lazım. Tüm çalışanların maaşı 1000 oldu
as of timestamp = tablonun önceki halini flashback özelliği ile undo dan görüntüler. Undo retention süresi kadar geri gidilebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQL> select salary 2 from employees as of timestamp to_timestamp('02/06/2011 09:25','DD/MM/YYYY HH24:MI'); SALARY ---------- 2600 4400 13000 6000 6500 10000 12000 8300 |
1 2 |
SQL> select salary 2 from employees as of timestamp (systimestamp - interval '15' minute); |
Tablo yapısı değiştirildi ise eski durum görülemiyor. (Bu sorguları 9i de destekler)
1 2 3 4 5 6 7 8 |
SQL> ALTER TABLE HR.EMPLOYEES 2 DROP CONSTRAINT EMP_EMAIL_UK; SQL> delete from emp; 581000 rows deleted. SQL> commit; Commit complete. |
1 2 3 |
SQL> select * from emp ; no rows |
1 2 3 |
SQL> select * from emp as of timestamp (systimestamp - interval '20' minute) ; 581000 rows selected |
20 dakika önceki veriyi girmek için
1 2 3 4 5 |
SQL> insert into emp 2 select * from emp as of timestamp (systimestamp - interval '20' minute); SQL> commit; 581000 rows created. |
1 2 3 4 |
SQL> delete from emp where department_id=70; 1 row deleted. SQL> commit; |
Örneğin : Kullanıcı yanlışlık bazı kayıtları silmiş olabilirim diye geldi
kontrol ediyoruz.
1 2 3 4 5 |
SQL> select count(*) from emp; COUNT(*) ---------- 106 |
1 2 3 4 5 |
SQL> select count(*) from emp as of timestamp (systimestamp - interval '5' minute) ; COUNT(*) ---------- 107 |
1 kayıt yok
20 dak öncesinin kayıtlarının getirir.
1 |
SQL> select employee_id from emp as of timestamp (systimestamp - interval '20' minute) |
Eksik kaydı bulalım
1 2 3 4 5 6 |
SQL>select employee_id from emp as of timestamp (systimestamp - interval '30' minute) 2 where employee_id not in (select employee_id from emp); EMPLOYEE_ID --------------------- 204 |
Eksik kaydı girelim.
1 2 3 4 |
SQL> insert into emp 2 select * from emp as of timestamp (systimestamp - interval '30' minute) 3 where employee_id not in (select employee_id from emp); 1 row created |
Tablo drop
1 |
SQL> drop table emp cascade constraints; |
Drop edilen tablonun geri getirilmesi (bunu sağlayan undo retention)
1 |
SQL> flashback table emp to before drop; |
SCN’ye göre (system change number) geriye dönme
1 |
SQL> delete from emp where department_id=70 ; |
1 row deleted.
1 2 3 4 |
SQL> select current_Scn from v$database ; SCN ---------- 2479789 -- 1 satır silindi. |
1 2 3 4 5 |
SQL> select count(*) from emp as of scn 2479785 ; COUNT(*) --------------- 106 |
1 2 3 4 |
SQL> select count(*) from emp as of scn 2479780; COUNT(*) --------- 107 |
Tabloyu 1 gün öncesine çevirmek için
1 |
SQL> flashback table emp to timestamp (sysdate-1); |
Öncesinde tablo bazında row movement enable edilmesi gerekebilir.
1 |
SQL> alter table emp enable row movement; |
1 2 |
SQL> flashback table emp to timestamp (sysdate-1) 2 to_timestamp('2007-05.26 16:20:00','YYYY-MM-DD HH24:MI:SS'); |
DBMS_Flashback
1 2 3 4 5 |
SQL> select to_char(sysdate, 'DD/MM/YYYY HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'DD ------------------------------------- 02/06/2011 13:35:39 |
grant execute on dbms_flashback to hr ;
1 2 |
SQL> delete from emp ; SQL> commit; |
emp tablosundaki 106 kayıt silindi
1 |
SQL> execute dbms_flashback.enable_at_time(to_timestamp('02/06/2011 13:35','DD/MM/YYYY HH24:MI')); |
Bu şekilde tüm tabloları geriye alıyor yani session da geri gidiyor.
1 |
SQL> execute dbms_flashback.disable; |
ile normal zamana dönülüyor
1 |
SQL> select first_name, last_name, employee_id from emp; |
no rows selected
Oracle Recovery Manager...
12 Mart 2019