PostgreSQL: Временное отключение соединений
У меня есть script в PostgreSQL, который каждую ночь восстанавливает тестовую базу данных из дампа. Доступ к базе данных осуществляется серверами приложений и процессами с пулом соединений, который поддерживает все соединения в любое время.
Итак, script восстанавливает дамп в my_temp_database
. Затем он должен переименовать my_database
в my_old_database
, my_temp_database
в my_database
и в итоге отказаться от my_old_database
.
Как отключить всех клиентов, суперпользователей или нет, от my_database
, чтобы его можно было переименовать? Как я могу временно предотвратить их повторное подключение?
Есть ли лучший способ сделать то, что мне нужно?
Ответы
Ответ 1
Чтобы отметить "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" . Хотя на самом деле может быть задержка до того, как бэкэнды фактически завершат отсоединение?
Ответ 2
После того, как вы завершили текущие активные подключения, вы также можете отправить эту команду, которая позволит супер пользователям вводить логины. Это предполагает, что вы в порядке со всеми супер пользователями, имеющими доступ еще. Надеюсь, вы не передадите права суперпользователя кому-либо.
ALTER DATABASE your_db CONNECTION LIMIT 0;
Ответ 3
У меня был другой сценарий использования, в котором я хотел отключить БД для всех (включая суперпользователя) и навсегда, но не просто отказаться от него еще, чтобы иметь возможность быстро его активировать, если это необходимо.
Это отлично работало на старых 8.3 Postgres:
UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name';
Ответ 4
Начиная с PostgreSQL 9.5, мы, наконец, можем:
ALTER DATABASE db WITH ALLOW_CONNECTIONS false;