Базу данных нельзя удалить, если к ней подключены пользователи. Перед удалением базы данных 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?
Комментариев нет:
Отправить комментарий