2015-12-02 63 views
13

FLASHBACK TABLE到恢复点失败,但表还原点是在表更改后立即创建的。下面的代码仅适用于特定步骤之间有睡眠的情况。尽管在表创建/更改表后创建恢复点

SQL> DROP TABLE TEST_TABLE; 

Table dropped. 

SQL> CREATE TABLE TEST_TABLE AS SELECT 1 A FROM DUAL; 

Table created. 

SQL> ALTER TABLE TEST_TABLE ENABLE ROW MOVEMENT; 

Table altered. 

SQL> --Sleep required here to prevent error on flashback. 
SQL> DROP RESTORE POINT TEST_RESTORE_POINT; 

Restore point dropped. 

SQL> CREATE RESTORE POINT TEST_RESTORE_POINT; 

Restore point created. 

SQL> FLASHBACK TABLE TEST_TABLE TO RESTORE POINT TEST_RESTORE_POINT; 
FLASHBACK TABLE TEST_TABLE TO RESTORE POINT TEST_RESTORE_POINT 
       * 
ERROR at line 1: 
ORA-01466: unable to read data - table definition has changed 

为什么需要延迟,有没有办法消除它?

+0

你在任何地方都没有任何'PARALLEL = TRUE',是吗? –

+0

@MikeNakis一次运行一次就可以重现此问题。它在最新版本12.1.0.2上失败了。 –

回答

7

这种怪异可能是由SMON进程造成的,该进程负责跟踪闪回查询依赖的SCN和时间戳。有一个映射表SYS.SMON_SCN_TIME,其中每5分钟插入一条新记录SMON

FLASHBACK TABLE内部,执行命令INSERT /*+ APPEND */ into SYS_TEMP_FBT SELECT /*+ FBTSCAN FULL(S) PARALLEL(S, DEFAULT) */ :1, :2, :3, rowid, SYS_FBT_INSDEL FROM "<schema>."TEST_TABLE" as of SCN :4 S(注意表SYS_TEMP_FBT在相同的模式中创建)使用此映射。

直到Oracle 10.2,您需要等待整整5分钟才能在新的/更改的对象上进行FLASHBACK查询。在11.1中引入TIM_SCN_MAP列以使映射更细化。最多100个映射存储在一个值中,这使SCN映射的时间戳精度大约为3秒。

我尝试了很多事情,但我不认为你可以做任何事情,而是要等待3秒左右,以避免错误,因为这是异步的后台处理,无需任何用户的控制处理。

+0

这很有道理。我独立发现,所需的等待时间约为3秒。 –