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;