08.07.2013

Ошибка ORA-08103 и партиционирование

Причины появления ошибки ORA-08103: object no longer exists при работе с партиционированными таблицами.
Проблемая ситуация: при асихронной работе нескольких процессов возникает ошибка  ORA-08103. Каждый процесс работает с одной таблицей, партиционированной по составному ключу; использовались операторы DDL для работы с партициями (создание, очистка) и DML (запросы, пакетная вставка). Каждый процесс работает только со своим диапазоном партиций, а запросы ограничиваются для чтения только из этих партиций. Ошибка возникает только при параллельной работе нескольких процессов.

Итак, вот ситуации, при которых возникает ошибка ORA-08103:

  • при выполнении запроса в сессии 1 к непартиционированной таблице происходит TRUNCATE TABLE в сессии 2. Причина: TRUNCATE вызывает обновление адреса сегмента, связанного с таблицей (SYS.DBA_OBJECTS.DATA_OBJECT_ID). Решение: пересмотр алгоритма;
  • при выполняющимся запросе в сессии 1 происходит создание партиций с помощью SPLIT PARTITION в сессии 2. Причина: при разрезании партиции DEFAULT на две у партиции DEFAULT обновляется адрес сегмента данных. Решение: использовать ADD PARTITION - в этом случае имеющиеся партиции остаются без изменений;
  • при выполняющимся запросе в сессии 1, выбирающим данные из партиции А происходит TRUNCATE PARTITION A в сессии 2. Причина: та же, что и в предыдущих случаях. Решение: пересмотр алгоритма. Деталь: даже если в плане запроса фигурирует PARTITION LIST ALL, но запрос не выбирает данные из очищаемой партиции (например, where id = p_id or p_id is null), ошибка не возникает.



Комментариев нет :