Oracle有个非常强大的功能:闪回,它可以修改ORACLE当前用户的时间,令其回到过去指定的某个时间点,并且可以还原当时的数据,就算数据被修改、删除,都能够通过闪回重现。
如果不小心删除了数据,并且已经commit了,那么可以利用闪回回到过去,将数据复制出来,手动恢复。
注意:闪回不能重现已经被TRUNCATE的数据。
下面进入历史重现——闪回的操作:
1、如果需要使用闪回功能,那么需要dba给当前用户赋予权限:
grant execute on sys.dbms_flashback to test;
2、假定原有一个表:table1
3、字段:ID,Name,并且存在8条数据,
4、SQL> select * from table1;
ID NAME
--------------------------------------- ----------
1 User_01
2 User_02
3 User_03
4 User_04
5 User_05
6 User_06
7 User_07
8 User_08
8 rows selected
5、现在删除数据:DELETE FROM table1;commit;
6、再次查询:
SQL> select * from table1;
ID NAME
--------------------------------------- ----------
7、已经没有数据了,那么开始闪回——回到过去:
execute dbms_flashback.enable_at_time(sysdate - 10 /1440);
10/1440表示10分钟
8、再来查询一把:
SQL> select * from table1;
ID NAME
--------------------------------------- ----------
1 User_01
2 User_02
3 User_03
4 User_04
5 User_05
6 User_06
7 User_07
8 User_08
8 rows selected
历史重现了,系统闪回到了数据未被删除的时间点。
9、我们再回到现在:
execute dbms_flashback.disable;
10、再次查询:
SQL> select * from table1;
ID NAME
--------------------------------------- ----------
已经没有数据了,说明在当前时间点,数据已经被删除了。
11、做得彻底一点:TRUNCATE TABLE table1;
12、再次闪回:execute dbms_flashback.enable_at_time(sysdate - 10 /1440);
13、SQL> select * from table1;
ID NAME
--------------------------------------- ----------
由于数据被TRUNCATE 了,所以就算闪回也没有办法了。
14、ORACLE还能够根据系统变更号SCN来进行闪回:
获取当前系统SCN:
SQL> var v_sys_cns number;
SQL> execute :v_sys_cns := dbms_flashback.get_system_change_number;
PL/SQL procedure successfully completed
v_sys_cns
---------
383054
15、回到指定SCN的时间点:
SQL> execute dbms_flashback.enable_at_system_change_number(383054);
16、禁止闪回:execute dbms_flashback.disable();