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';