PostgreSQL: временно отключить соединения - PullRequest
22 голосов
/ 06 июля 2010

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

Таким образом, сценарий восстанавливает дамп в my_temp_database.Затем он должен переименовать my_database в my_old_database, my_temp_database в my_database и в конечном итоге сбросить my_old_database.

Как я могу отключить всех клиентов, суперпользователя или нет, с my_databaseчто это можно переименовать?Как я могу временно предотвратить повторное подключение?

Есть ли лучший способ сделать то, что мне нужно?

Ответы [ 4 ]

29 голосов
/ 06 июля 2010

Чтобы пометить базу данных «applogs» как не принимающую новые подключения:

update pg_database set datallowconn = false where datname = 'applogs';

Другой возможностью будет аннулирование доступа «connect» к базе данных для роли (ей) клиента.

Отключить пользователей от базы данных = убить бэкэнд. Таким образом, чтобы отключить всех других пользователей от базы данных «applogs», например:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();

Как только вы сделали оба этих шага, вы единственный пользователь, подключенный к 'applogs'. Хотя на самом деле может быть задержка, прежде чем бэкэнды действительно завершат отключение?

9 голосов
/ 30 марта 2011

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

ALTER DATABASE your_db CONNECTION LIMIT 0;
4 голосов
/ 10 мая 2017

Начиная с PostgreSQL 9.5 мы наконец можем:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false;
0 голосов
/ 13 декабря 2015

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

Это работало нормально на старом 8.3 Postgres:

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...