Удаление БД при наличии активных соединений - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь создать сценарий резервного копирования базы данных, и часть потока заключается в том, что мне нужно удалить и затем заново создать базу данных из резервной копии.

Когда есть соединения с базой данных, я получаю сообщение об ошибке, подобное этому:

DETAIL: There are 2 other sessions using the database.

Я искал способ либо проигнорировать это, либо уничтожить соединения перед сбросом базы данных. Я пытаюсь использовать приведенный ниже запрос, но, похоже, он не позволяет мне сбросить базу данных после ее запуска.

-- Drop connections
\set database_name `echo $DB_NAME`

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = ':database_name'
AND pid <> pg_backend_pid();

Я взял запрос из поста SO, который, похоже, предполагал, что его можно использовать, есть ли более надежный способ сделать это или способ принудительно удалить базу данных независимо от того, существуют ли активные соединения?

1 Ответ

1 голос
/ 18 апреля 2019

Подключитесь к другой базе данных, чем та, которую вы собираетесь отбросить - в том же кластере БД.Иначе, ваша собственная связь будет мешать.Вы можете использовать базу данных обслуживания по умолчанию "postgres" для этого:

psql -h localhost -U postgres postgres

Затем убедитесь, что клиенты не переподключаются:

UPDATE pg_database SET datallowconn = 'false' WHERE datname = :"database_name";

Наконец:

SELECT pg_terminate_backend(pid)
FROM   pg_stat_activity
WHERE  datname = :"database_name";  -- escape to avoid errors / sql injection

Этот :"database_name" является синтаксисом для SQl-интерполяции в psql.Двойные кавычки для идентификаторов.

См .:

...