13 октября 2025

Удаление базы данных PostgreSQL с активными подключениями

Базу данных нельзя удалить, если к ней подключены пользователи. Перед удалением базы данных PostgreSQL я всегда выполняю запрос, который для всех подключений к удаляемой базе данных вызывает функцию принудительного завершения процесса подключения:

SELECT pg_terminate_backend (pid)
  FROM pg_stat_activity
 WHERE datname = 'наименование удаляемой базы данных';
где pg_stat_activity – это view’юшка со списком активных подключений к СУБД, а pid – это идентификатор подключенного процесса. Функция pg_terminate_backend имеет некоторые ограничения по правам. Например, только суперпользователям разрешено завершать процессы подключения суперпользователей. Поэтому я обычно выполняю этот запрос подключившись к базе данных postgres пользователем postgres. Подключения не завершаются, если в целевой базе имеются подготовленные транзакции, активные слоты логической репликации или подписки.

В документации PostgreSQL 17 я случайно заметил, что с 13-й версии у команды DROP DATABASE появился новый параметр "FORCE":

DROP DATABASE [ IF EXISTS ] name [ [ WITH ] (FORCE) ]
Если команде DROP DATABASE указать параметр FORCE, то СУБД попытаться перед удалением базы данных принудительно завершить все существующие подключения к удаляемой базе данных. Если завершатся не все подключения, эта команда выдаст ошибку. Удаление с параметром FORCE использует функцию pg_terminate_backend, поэтому имеет ее ограничения.

Вы скажете, что на дворе уже октябрь 2025-го года и вышел PostgreSQL 18, а я рассказываю вам про новинки PostgreSQL 13. В оправдание скажу, что PostgreSQL 13 я пропустил и с 12-го сразу перешел на 14-й. К тому же кто читает документацию по DROP DATABASE?

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

Отправить комментарий