当表更改后立即创建恢复点时,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
为什么需要延迟,有没有办法消除它?
这个奇怪性可能是由SMON进程引起的,这个进程负责跟踪SCN和闪回查询依赖的时间戳.有一个映射表SYS.SMON_SCN_TIME,每5分钟一个新记录插入SMON.
内部FLASHBACK TABLE执行一个命令INSERT / * APPEND * /进入SYS_TEMP_FBT SELECT / * FBTSCAN FULL(S)PARALLEL(S,DEFAULT)* /:1,:2,:3,rowid,SYS_FBT_INSDEL FROM“< schema> .从SCN:4 S(注意一个表SYS_TEMP_FBT创建在同一个模式中)的“TEST_TABLE”(使用该映射).
直到Oracle 10.2,您需要等待整整5分钟才能在新的/改变的对象上进行FLASHBACK查询.在11.1中引入了TIM_SCN_MAP列,使映射更细粒度.最多100个映射存储在一个值中,这使得SCN映射的时间戳精度约为3秒.