2015-12-02 65 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秒。 –