如果在丢失数据是使用了DDL语句造成或丢失数据后修改了表结构,那么就会造成使用不了闪回功能。
SQL> select count(1) from test;
COUNT(1)
----------
9
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
10-12月-07 11.29.05.765000 上午 +08:00
SQL> delete from test where rownum <3;
已删除2行。
SQL> commit;
提交完成。
SQL> select count(1) from test;
COUNT(1)
----------
7
SQL> col scn for 999999999999;
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-------------
1352535
SQL> select count(1) from test as of scn 1352530;
COUNT(1)
----------
7
SQL> select count(1) from test as of scn 1352520;
COUNT(1)
----------
9
SQL> create table test_rec as select *from test as of scn 1352520;
表已创建。
SQL> select count(1) from test_rec;
COUNT(1)
----------
9
SQL> delete from test;
已删除7行。
SQL> commit;
提交完成。
SQL> insert into test select *from test_rec;
已创建9行。
SQL> commit;
提交完成。
SQL>
如果是之前进行drop过表,就无法恢复:
SQL> create table zero as select *from test;
create table zero as select *from test
*
ERROR 位于第 1 行:
ORA-00955: 名称已由现有对象使用
SQL> drop table zero;
表已丢弃。
SQL> create table zero as select *from test;
表已创建。
SQL> insert into zero select *from test;
已创建9行。
SQL> commit;
提交完成。
SQL> select count(1)from zero;
COUNT(1)
----------
18
SQL> delete from zero where rownum <8;
已删除7行。
SQL> commit;
提交完成。
SQL> select count(1) from zero;
COUNT(1)
----------
11
SQL> col scn for 999999999999;
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-------------
1352901
SQL> select count(1) from zero as of scn 1352850;
select count(1) from zero as of scn 1352850
*
ERROR 位于第 1 行:
ORA-01466: 无法读数据 - 表定义已更改
SQL>
如果修改一下表结构呢?
SQL> alter table TEST rename column COL to COL1;
表已更改。
SQL> alter table TEST add col2 number;
表已更改。
SQL> update test set col2 = col1;
已更新9行。
SQL> commit;
提交完成。
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-------------
1352972
SQL> select * from test as of scn 1352965;
select * from test as of scn 1352965
*
ERROR 位于第 1 行:
ORA-01466: 无法读数据 - 表定义已更改
SQL>
改了表结构也无法恢复被删除的数据。