PostgreSQL: временно отключить соединения

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

ALTER DATABASE your_db CONNECTION LIMIT 0;

Запустив PostgreSQL 9.5, мы наконец можем:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false;

Если вы подключены в сеансе с БД, к которой вы хотите запретить подключение, и оставаться подключенным в том же сеансе после запрета подключений, используйте это:

UPDATE pg_database SET datallowconn = false WHERE datname = '_db_name_' ;

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

Но если вы используете это, он должен быть из сеанса в другой БД:

ALTER DATABASE _db_name_ WITH ALLOW_CONNECTIONS false ;

((я понимаю, что это почти резюме ответов выше))

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

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

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name';
Другие вопросы по тегам