Як відключити всіх інших користувачів від бази даних postgres?


13

Мені потрібен ексклюзивний доступ до бази даних. Чи можливо за допомогою команди SQL "від'єднати" всіх інших користувачів від бази даних postgres. Або, можливо, закрити всі інші з'єднання, а потім отримати ексклюзивний доступ.

Це для тестування одиниць, а тести виконуються лише вручну, тому небезпеки немає. Будуть зачеплені лише старі мертві зв’язки.

Немає інших користувачів, які підключаються до цих баз даних unittest.

Старі мертві зв’язки походять від розвитку. Це трапляється весь час, коли тест, який пишеться або не працює, не виходить з чистого.


Якщо комусь також потрібно на деякий час тримати заблокованих інших користувачів після відключення їх у виробничому сценарії, дивіться відповідь Скотта Марлоу нижче: /dba//a/6184/2024


Дивіться також подібне запитання на dba: Як скинути всі з'єднання до певної бази даних, не зупиняючи сервер?

Відповіді:


14

Ви можете спробувати підключитися до бази даних як користувач postgres і працює:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

оновлення Ще кращий запит позбавляється від підміру:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );

2
не забудьте ОТМЕНИТИ дозволи на CONNECT, інакше користувачі створюють нові з'єднання, перш ніж у вас буде ексклюзивний доступ.
Френк Хайкенс

@Frank Heikens - Хороший улов. Я ввімкнув "тест вручну", але якщо є інші підключення, окрім особи, яка робить тест одиниці, то "скасувати підключення на <ім'я> від ..." було б важливим.
gsiems

1
У PostgreSQL 9.2 procpidбув перейменований на pid, тому слідкуйте за цим.
Крейг Рінгер

Крім того, щоб робити REVOKE з відповідним користувачем, я повинен був також REVOKE ..... публічно - на що слідкувати!
Девід Н. Уелтон

на 9.3 здається, що pg_stat_activity.procpid тепер називається pg_stat_activity.pid . працював А-ОК інакше.
Дж. Л. Пейрет

4

Проблема тут подвійна, по-перше, вам потрібно відключити цих користувачів, а по-друге, потрібно не мати їх на своєму сервері. Замість того, щоб скасовувати підключення perms, я зазвичай використовую pg_hba.conf, щоб відмовлятися від нових з'єднань з певних машин та / або користувачів, тоді просто робимо pg_ctl -m швидку зупинку; pg_ctl починає скидати всі поточні з'єднання. Якщо неохайно робити зміни в DDL, це в значній мірі необхідність, або ви отримаєте тупики в усьому місці.


6
Я завжди використовую одну роль, яка дозволяє CONNECT і успадковується усіма іншими ролями. ПОВЕРНУЙТЕ підключення для цієї єдиної ролі, і ви закінчили. Увімкніть його у функцію за допомогою pg_terminate_backend (), і ви керуєте, коли вам доведеться припинити всі поточні з'єднання.
Френк Хайкенс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.