@BetsuNo
Программист

Как избавиться от блокировок при обслуживание партиций внешней таблицы в БД PostgreSQL?

Приветствую!

Ситуация следующая: в базе есть таблица, которая подключена как внешняя, и на удалённом сервере настроено партицирование. Всё работает отлично, но заканчивается место на диске, и встал вопрос об оптимизации партиций. Напрямую VACUUM, REINDEX и DROP выполнить не удаётся потому, что постоянно пишется большое кол-во данных, и, как я понял, основная база, при подключении внешней таблицы, требует эксклюзивную блокировку, которая распространяется и на партиции. Пробовал удалять наследование, но так же безрезультатно.

Вопрос: как обойти блокировку не отключая внешнюю таблицу?
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
vacuum full и reindex требуют тяжёлую блокировку и держать блокировку будут долго. Поэтому обычно их избегают.
drop разумеется тоже требует эксклюзивную блокировку, но на короткое время. Важно понимать скользкую ситуацию - если вы пытаетесь взять эксклюзивную блокировку, но не можете её получить из-за других выполняемых транзакций - вы будете ждать окончания этих мешающих транзакций, но уже будете блокировать работу последующих транзакций.

Если вы считаете, что много места пропало впустую - то это можно посчитать (поставив contrib расширение pgstattuple) вот этими нашими запросами: для таблиц и для индексов
Если да, проблема с местом в этом - то вам помогут pgcompacttable или pg_repack

Если данные по большей части архивные - имеет смысл заменить btree индексы на brin. Они медленнее, но очень сильно компактнее по диску.

А отцеплять партиции - посмотреть в pg_stat_activity что вообще происходит, нет ли аномально длинных транзакций или idle in transaction (т.е. затупов на приложении). Затем с statement_timeout и lock_timeout в 1 секунду (или меньше даже) пробовать отцепить пока не получится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы