Подтвердить что ты не робот

Отключение принудительного клиента с помощью PostgreSQL

Есть ли способ заставить клиентов отключиться от PostgreSQL? Я ищу equivlent DB2 force application all.

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

4b9b3361

Ответ 2

Объявляет простаивающие процессы в PostgreSQL 8.4:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
   WHERE current_query LIKE '<IDLE>';

Ответ 3

Этот ответ SO прекрасно объясняет (полная цитата из araqnid между горизонтальными правилами, затем меня еще раз):


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


Обновление от MarkJL: действительно есть задержка до того, как бэкенды закончат отсоединение.

Теперь я снова: если сказать, что столбец procpid был переименован в pid в PostgreSQL 9.2 и более поздних версиях.

Я думаю, что это гораздо более полезно, чем ответ Милена А. Радева, который, несмотря на технически то же самое, не приходит с примерами использования и реальными предложениями.

Ответ 4

Я отправляю свой ответ, потому что не мог использовать ни одного из них в моем script, сервере 9.3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';"

В следующей строке вы можете делать все, что хотите, с помощью 'my_database_to_alter'. Как вы можете видеть, выполним запрос из базы данных postgres, которая существует почти в каждой установке postgresql.

Выполнение суперпользователем и вне самой базы данных проблем работало идеально для меня.

Ответ 5

вероятно, следует использовать более тяжелый подход, но:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done

Ответ 6

Я нашел этот поток в списке рассылки. Он предлагает использовать SIGTERM, чтобы заставить клиентов отключиться.

Не так чисто, как db2 force application all.