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 */ into SYS_TEMP_FBT SELECT /*+ FBTSCAN FULL(S) PARALLEL(S, DEFAULT) */ :1, :2, :3, rowid, SYS_FBT_INSDEL FROM "
(注意SYS_TEMP_FBT
在同一模式中创建表).
在Oracle 10.2之前,您需要等待整整5分钟才能在新的/更改的对象上成功执行FLASHBACK查询.在11.1 TIM_SCN_MAP
中引入了该列以使映射更精细.最多100个映射存储在一个值中,这使得SCN映射的时间戳大约为3秒精度.
我尝试了很多东西,但我不认为你可以做任何事情,但是等待大约3秒钟以避免错误,因为这是由后台进程异步处理的,没有任何用户控制.