Jak odłączyć wszystkich innych użytkowników od bazy danych Postgres?


13

Potrzebuję wyłącznego dostępu do bazy danych. Czy jest możliwe użycie polecenia SQL do „odłączenia” wszystkich innych użytkowników od bazy danych postgres. A może zamknięcie wszystkich innych połączeń, a następnie uzyskanie wyłącznego dostępu.

Dotyczy to testów jednostkowych, a testy są uruchamiane ręcznie, więc nie ma niebezpieczeństwa. Wpłynie to tylko na stare martwe połączenia.

Nie ma innych użytkowników łączących się z tymi najbardziej nietrafionymi bazami danych.

Stare martwe połączenia pochodzą z rozwoju. Dzieje się tak przez cały czas, gdy test, który jest zapisywany lub nie powiedzie się, nie kończy się jako czysty.


Jeśli ktoś musi również przez pewien czas trzymać zablokowanych innych użytkowników po odłączeniu ich w scenariuszu produkcyjnym, zobacz odpowiedź Scott Marlowe poniżej: /dba//a/6184/2024


Zobacz także podobne pytanie na dba: Jak usunąć wszystkie połączenia z określoną bazą danych bez zatrzymywania serwera?

Odpowiedzi:


14

Możesz spróbować połączyć się z bazą danych jako użytkownik Postgres i uruchomić:

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( )
    );

aktualizacja Jeszcze lepsze zapytanie pozbywa się podselekcji:

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

2
nie zapomnij cofnąć uprawnień CONNECT, w przeciwnym razie użytkownicy utworzą nowe połączenia, zanim uzyskasz wyłączny dostęp.
Frank Heikens,

@Frank Heikens - Dobry połów. Wpisałem „ręczny test jednostki”, ale jeśli istnieją inne osoby, które łączą się oprócz osoby wykonującej test jednostki, wówczas „odwołanie połączenia na <nazwa_danych> z ...” byłoby niezbędne.
gsiems

1
W PostgreSQL 9.2 procpidzostał przemianowany na pid, więc uważaj na to.
Craig Ringer

Oprócz wykonania ZWOLNIENIA z danym użytkownikiem, musiałem również ODWOŁAĆ ... publicznie - na co należy uważać!
David N. Welton

na 9.3 wygląda na to, że pg_stat_activity.procpid nazywa się teraz pg_stat_activity.pid . działało A-OK inaczej.
JL Peyret

4

Problem jest tutaj dwojaki: po pierwsze musisz odłączyć tych użytkowników, a po drugie, trzymać ich z dala od serwera. Zamiast odwoływać perm perms, zwykle używam pg_hba.conf do odrzucania nowych połączeń od niektórych maszyn i / lub użytkowników, a następnie po prostu wykonuję pg_ctl -m szybkie zatrzymanie; pg_ctl zaczyna przerywać wszystkie bieżące połączenia. Przy slony dokonującym zmian w DDL jest to prawie konieczna, bo w przeciwnym razie dostaniesz impas.


6
Zawsze używam pojedynczej roli, która umożliwia CONNECT i jest dziedziczona przez wszystkie inne role. Odwołaj połączenie dla tej pojedynczej roli i gotowe. Zawiń go w funkcję za pomocą pg_terminate_backend () i masz kontrolę, kiedy musisz zatrzymać wszystkie bieżące połączenia.
Frank Heikens
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.