Подтвердить что ты не робот

"определение таблицы изменилось", несмотря на создание точки восстановления после создания таблицы/изменения

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

Почему требуется отсрочка и есть ли способ ее устранения?

4b9b3361

Ответ 1

Эта странность может быть вызвана процессом 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 отображений сохраняются в одном значении, которое составляет примерно 3 секунды в метрической шкале для отображения SCN.

Я пробовал много вещей, но я не думаю, что вы можете что-то сделать, но подождите около 3 секунд, чтобы избежать ошибки, потому что это обрабатывается асинхронно фоновым процессом без какого-либо пользовательского контроля.