Я пытаюсь автоматизировать управление разделами в своей базе данных psql (версия 15).
Я хотел бы удалить старые разделы, чтобы освободить место в базе данных. Для этого я планирую отсоединить его с помощью ключевого слова CONCURRENTLY
, чтобы мне не требовалась блокировка ACCESS EXCLUSIVE
для секционированной таблицы.
После одновременного запуска моего отсоединяемого раздела безопасно ли удалить таблицу сразу после ? Или мне следует подождать, пока будет выполнено одновременное отсоединение? Если мне нужно это сделать, как я могу?
Спасибо
Я попытался запустить две команды вручную и последовательно, и это сработало, но я боюсь, что поведение может быть другим в рабочей среде, которая находится под большой рабочей нагрузкой.
Хорошо спасибо. И как проверить успешность отсоединения? Нужно ли мне проводить какое-то голосование? Каковы лучшие практики при попытке автоматизировать такого рода задачи?
@RémiPradal Поскольку раздел блокируется исключительно операцией отсоединения, я думаю, что ваша попытка удаления зависнет и будет ждать сама по себе, пока эта блокировка не будет снята. Не нужно проводить опрос.
ALTER TABLE ... DETACH PARTITION CONCURRENTLY
завершается, как только заканчивается это утверждение. Поскольку DROP TABLE
требует блокировки ACCESS EXCLUSIVE
, попытка удалить раздел до того, как ALTER TABLE ... DETACH PARTITION CONCURRENTLY
будет выполнена, приведет к блокировке DROP TABLE
.
Поэтому просто подождите, пока ALTER TABLE ... DETACH PARTITION CONCURRENTLY
не завершится, а затем запустите DROP TABLE
, чтобы избавиться от раздела.
DROP TABLE requires taking an ACCESS EXCLUSIVE lock on the parent table.
Пока раздел является частью родительской таблицы, вы не можете удалить его без блокировки ACCESS EXCLUSIVE. Так что да, придется подождать, пока отсоединение пройдет успешно