2010-07-06 3 views
15

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

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

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

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

ответ

23

Чтобы пометить базы данных, как не принимать новые соединения «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». Хотя на самом деле может быть задержка до того, как бэкэнды на самом деле закончат отключение?

+0

Ха, я хотел бы он работал в 8.3. –

+0

В 8.3 вы можете попробовать 'select pg_terminate_backend (pid) из pg_stat_activity;' –

+0

@araqnid Комманда "update pg_database set datallowconn = false где datname = 'applogs';" работает как шарм! «REVOKE CONNECT ON DATABASE» не работает для меня! UP! UP! UP! UP! UP! UP! –

7

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

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

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

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

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name'; 
0

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

ALTER DATABASE db WITH ALLOW_CONNECTIONS false; 
Смежные вопросы