使用Flashback Query恢复误删除数据:
误删除了部分重要数据,并且已经提交,需要恢复。这该怎么办?
首先尝试使用flashback query闪回数据。首先确认数据库的SCN变化:
sys@CCDB> col fscn for 9999999999999999
sys@CCDB> col nscn for 9999999999999999
sys@CCDB> select name,first_change# fscn,next_change# nscn,first_time from v$archived_Log where status = 'A';
NAME FSCN NSCN FIRST_TIME
--------------------------------------------------- ----------- ----------- -------------------
/databak/ARCHIVELOG/ARC0000004623_0689837452.0001 73470545 73486056 2010-02-01 06:07:23
/databak/ARCHIVELOG/ARC0000004624_0689837452.0001 73486056 73500151 2010-02-01 07:43:11
/databak/ARCHIVELOG/ARC0000004625_0689837452.0001 73500151 73503996 2010-02-01 08:27:51
/databak/ARCHIVELOG/ARC0000004626_0689837452.0001 73503996 73514545 2010-02-01 08:28:23
/databak/ARCHIVELOG/ARC0000004627_0689837452.0001 73514545 73527235 2010-02-01 08:52:14
/databak/ARCHIVELOG/ARC0000004628_0689837452.0001 73527235 73540995 2010-02-01 09:25:19
/databak/ARCHIVELOG/ARC0000004629_0689837452.0001 73540995 73553760 2010-02-01 10:06:36
/databak/ARCHIVELOG/ARC0000004630_0689837452.0001 73553760 73567478 2010-02-01 10:43:23
8 rows selected.
当前的SCN为:
sys@CCDB> select dbms_flashback.get_system_change_number fscn from dual;
FSCN
-----------------
73574265
使用应用用户连接数据库尝试闪回:
sys@CCDB> conn username/password
Connected.
现有数据如下:
winks@CCDB> select count(*) from member;
COUNT(*)
----------
1267661
创建恢复表:
winks@CCDB> create table member_recov as select * from member where 1=0;
Table created.
选择合适的SCN向前恢复:
winks@CCDB> select count(*) from member as of scn 73566300;
COUNT(*)
----------
1297438
尝试多个SCN,获取最佳值(如果能得知具体时间,那么可以获得准确的数据闪回)。
winks@CCDB> select count(*) from member as of scn 73567300;
COUNT(*)
----------
1297466
winks@CCDB> select count(*) from member as of scn 73567478;
COUNT(*)
----------
1297469
最后选择恢复到SCN为73567478的时间点。
winks@CCDB> insert into member_recov select * from member as of scn 73567478;
1297469 rows created.
winks@CCDB> commit;
Commit complete.
经过确认,已经可以满足需要,找回误删除部分数据,至此闪回恢复成功完成。
- The End -