Установите значение времени ожидания для ALTER TABLE ADD COLUMN в Oracle (DDL_LOCK_TIMEOUT не работает) - PullRequest
3 голосов
/ 01 ноября 2019

Вопрос

Как я могу установить значение тайм-аута для неблокирующего DDL (добавить столбец ALTER TABLE) в Oracle, чтобы, если какой-либо DML заблокировал таблицу на длительное время (несколько часов), мой DDL мог быстро завершиться с ошибкойвместо того, чтобы ждать часами. (мы ожидаем ошибку повышения оракула, такую ​​как ORA-00054: ресурс занят и получен с указанным NOWAIT или истекло время ожидания для прерывания нашего DDL)

PS: DDL_LOCK_TIMEOUT не работает (см. ниже «Что я пытался»)

Справочная информация

Я работаю над большой базой данных Oracle (Oracle Database 19c). Существуют устаревшие приложения, которые каждый час будут выполнять агрегирование для вычисления данных за прошедший час, например, AVG, SUM счетчиков. Производство имеет 40 процессоров и 200 ГБ + памяти, обычно задание агрегации выполняется около 30 минут ,, но в некоторых случаях, например, из-за перерыва в обслуживании, задания агрегации задерживаются, необходимо обрабатывать больше данных в следующем задании агрегации, так как задание выполняется длянесколько часов.

Эти устаревшие приложения находятся вне моего контроля. Невозможно изменить задание агрегации.

Переопределение на основе редакции не используется.

Моя работа - обновить таблицу базы данных (из-за добавления нового счетчика). Мы используем ALTER TABLE, чтобы добавить новый столбец в существующие таблицы. Но в некоторых случаях задание агрегации блокирует таблицу на несколько часов, и мой сценарий на несколько часов зависает. Это делает клиента несчастным. Поэтому я хочу, чтобы мой сценарий быстро проваливался.

То, что я пробовал

Гуглом давно кажется DDL_LOCK_TIMEOUT - самое простое решение.

Однако, исходя из теста, мы замечаем, что DDL_LOCK_TIMEOUT не работает в нашем случае. В течение долгого времени в Google мы обнаружили документ Oracle здесь с четким упоминанием:

Параметр DDL_LOCK_TIMEOUT влияет на блокирующие операторы DDL (но не на неблокирующие операторы DDL)

ALTER TABLE добавить столбец в точности «неблокирующий DDL», как указано в Список неблокирующих DDL

Ожидание

Когда DML блокирует таблицу на 1 час, например,SELECT * FROM MY_TABLE FOR UPDATE и совершить через 1 час. Я хочу, чтобы мой DDL, например, ALTER TABLE MY_TABLE ADD (COL_A number) мог получить тайм-аут через 10 минут вместо ожидания в течение 1 часа.

Другие решения

1

У меня есть одно решение, котороесначала мы можем выдать lock table MY_TABLE IN EXCLUSIVE MODE wait 600, чтобы получить кулак блокировки. Но прежде чем перейти к этому решению, я хочу выяснить, есть ли какое-то простое решение, например DDL_LOCK_TIMEOUT, для установки только одного параметра.

2

На основе oracle doc, включите Supplemental Loggingвозможность понизить неблокирующий DDL до блокирующего пути. Но дополнительная регистрация - это конфигурация уровня БД. У меня нет разрешения на внесение таких изменений.

...