Oracle根据SCN号闪回表
在安装Oracle软件时建议更改undo_retention参数,建议将默认900的值更改为10800秒,即3小时;alter system set undo_retention=10800 scope = both ;
加入一张employees 表中数据被删除一部分,并且已经提交,需要恢复,并且数据库运行在归档模式。
思路:通过SCN号来讲表恢复到原来的记录上
首先查看SCN好的变化:
conn /as sysdba
select name,first_change# fscn,next_change# nscn,first_time
from v$archived_log;
NAME FSCN
---------------------------------------- ---------------------
NSCN FIRST_TIME
--------------------- -------------------
5795407 2012-09-14:22:00:52
/u/oracle/fast_recovery_area/ORA11G/arch 5795407
ivelog/2012_09_17/o1_mf_1_43_85fzkcbs_.a
rc
5803747 2012-09-17:18:10:38
/u/oracle/fast_recovery_area/ORA11G/arch 5803747
ivelog/2012_09_17/o1_mf_1_44_85fzkh75_.a
NAME FSCN
---------------------------------------- ---------------------
NSCN FIRST_TIME
--------------------- -------------------
rc
5807441 2012-09-17:18:40:43
/u/oracle/fast_recovery_area/ORA11G/arch 5807441
ivelog/2012_09_17/o1_mf_1_45_85fzkmq7_.a
rc
5810907 2012-09-17:18:40:47
/u/oracle/fast_recovery_area/ORA11G/arch 5810907
(显示部分)
获得当前SCN
SQL> select dbms_flashback.get_system_change_number fscn from dual;
FSCN
---------------------
5874910
连接上用户(尝试用用户恢复):
conn /as sysdba
查看现有数据:
SQL> select count(*) from employees;
COUNT(*)
----------
107
创建一张恢复表:
SQL> create table t as select * from employees where 1=0;
表已创建。
根据提供的大致误操作时间,结合V$archived_log视图,选择执行闪回查询;
SQL> select count(*) from employees as of scn 5810907;
COUNT(*)
----------
107
找到最合适的值,例如最合适的值为5810907
选择SCN为5810907的时间点进行恢复:
SQL> insert into t select * from employees as of scn 5810907;
已创建 107 行。
SQL> commit;
提交完成。
完成,查看数据完整性!