Отбрасывание раздела таблицы во избежание ошибки ORA-00054 - PullRequest
4 голосов
/ 10 октября 2011

Мне нужно ваше мнение в этой ситуации. Я постараюсь объяснить сценарий. У меня есть служба Windows, которая периодически хранит данные в базе данных Oracle. Таблица, в которой хранятся эти данные, разбита по дате (Интервал интервала дат). В базе данных также есть задание dbms_scheduler, которое среди других операций усекает и удаляет более старые разделы.

Этот подход работал некоторое время, но недавно у меня была ошибка ORA-00054 . После некоторого расследования ошибка была воспроизведена со следующими шагами:

  1. Откройте один сеанс sqlplus, отключите автоматическую фиксацию и вставьте данные в секционированная таблица, без фиксации изменений;
  2. Откройте другой сеанс sqlplus и обрежьте / удалите старый раздел (DDL операции автоматически совершаются, если я не ошибаюсь). Мы затем получит ошибку ORA-00054.

Есть некоторые ограничения, достойные упоминания:

  • У меня нет доступа DBA к базе данных;
  • Это устаревшее приложение, и полный рефакторинг не возможно;

Итак, по вашему мнению, есть ли способ отбросить эти старые разделы, без риска возникновения ошибки ORA-00054 и без вмешательства администратора базы данных? Я могу просто удалить данные, но количество пустых разделов будет расти с каждым днем.

Большое спасибо заранее.

Ответы [ 3 ]

4 голосов
/ 10 октября 2011

Эта ошибка означает, что кто-то (или что-то) работает с данными в разделе, который вы пытаетесь удалить .То есть блокировка предоставляется на уровне раздела.Если никто не использовал раздел, ваша работа могла бы его удалить.

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

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

За исключением того, что у вас "нет доступа DBA к базе данных".Хм, это кудрявый.По сути, это не проблема, которая может быть решена без доступа администратора БД.

Похоже, у вас есть несколько вопросов для решения.К сожалению для вас, они скорее политические и архитектурные, нежели технические, и мы мало что можем сделать, чтобы помочь вам в дальнейшем.

3 голосов
/ 10 октября 2011

Как насчет обрезания усечения или отбрасывания в pl / sql, который пытается выполнить операцию в цикле, ожидая x секунд между попытками, для максимального количества попыток.Затем используйте dbms_scheduler для вызова этой процедуры / функции.

1 голос
/ 10 октября 2011

Может быть это может помочь. Кажется, это та же проблема, что и та, которую вы описываете. (игнорируйте комиксы без, если можете):

...