Muszę napisać skrypt, który upuści bazę danych PostgreSQL. Może być z nim wiele połączeń, ale skrypt powinien to zignorować.
Standardowe DROP DATABASE db_name
zapytanie nie działa, gdy istnieją otwarte połączenia.
Jak mogę rozwiązać problem?
postgresql
Roman Prykhodchenko
źródło
źródło
Odpowiedzi:
Spowoduje to porzucenie istniejących połączeń oprócz twoich:
Zapytaj
pg_stat_activity
i uzyskaj wartości pid, które chcesz zabić, a następnie wydajSELECT pg_terminate_backend(pid int)
je.PostgreSQL 9.2 i nowsze wersje:
PostgreSQL 9.1 i poniżej:
Gdy rozłączysz wszystkich, będziesz musiał rozłączyć i wydać polecenie DROP DATABASE z połączenia z innej bazy danych, inaczej niż ta, którą próbujesz usunąć.
Zwróć uwagę na zmianę nazwy
procpid
kolumny napid
. Zobacz ten wątek listy adresowej .źródło
; drop database TARGET_DB;
działało dobrze w moim przypadku, aby upewnić się, że baza danych zniknęła, zanim wszystko zacznie się ponawiać.dropdb --force
.W PostgreSQL 9.2 i nowszych, aby odłączyć wszystko oprócz sesji od bazy danych, z którą jesteś połączony:
W starszych wersjach jest tak samo, wystarczy zmienić
pid
naprocpid
. Aby rozłączyć się z inną bazą danych, wystarczy zmienićcurrent_database()
nazwę bazy danych, z której chcesz rozłączyć użytkowników.Możesz
REVOKE
naCONNECT
prawo od użytkowników bazy danych przed odłączeniem użytkowników, inaczej użytkownicy będą po prostu zachować na ponownym podłączeniu i nigdy nie będziesz miał szansę na wyrzucenie DB. Zobacz ten komentarz i pytanie z nim związane: Jak odłączyć wszystkich innych użytkowników od bazy danych .Jeśli chcesz tylko odłączyć bezczynnych użytkowników, zobacz to pytanie .
źródło
Możesz usunąć wszystkie połączenia przed usunięciem bazy danych za pomocą
pg_terminate_backend(int)
funkcji.Możesz uzyskać wszystkie działające backendy za pomocą widoku systemu
pg_stat_activity
Nie jestem do końca pewien, ale następujące działania prawdopodobnie zabiłyby wszystkie sesje:
Oczywiście możesz nie być podłączony do tej bazy danych
źródło
W zależności od wersji postgresql możesz napotkać błąd, który powoduje
pg_stat_activity
pominięcie aktywnych połączeń od upuszczonych użytkowników. Te połączenia nie są również pokazane w pgAdminIII.Jeśli wykonujesz testy automatyczne (w których również tworzysz użytkowników), może to być prawdopodobny scenariusz.
W takim przypadku musisz wrócić do zapytań takich jak:
UWAGA: W wersji 9.2+ zmienisz
procpid
napid
.źródło
procpid
napid
ten fragment działa na 9.3.Zauważyłem, że postgres 9.2 teraz nazywa kolumnę pid zamiast procpid.
Zwykle nazywam to z powłoki:
Mam nadzieję, że jest to pomocne. Dzięki @JustBob dla sql.
źródło
Właśnie uruchamiam ponownie usługę w Ubuntu, aby rozłączyć podłączonych klientów.
źródło
W wierszu polecenia systemu Linux najpierw zatrzymałbym wszystkie uruchomione procesy postgresql, wiążąc to polecenie sudo /etc/init.d/postgresql restart
wpisz polecenie bg, aby sprawdzić, czy inne procesy postgresql nadal działają
a następnie dropdb dbname, aby usunąć bazę danych
Działa to dla mnie w wierszu poleceń systemu Linux
źródło
PostgreSQL 9.2 i nowsze wersje:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
źródło
Oto mój hack ... = D
Podaję tę odpowiedź, ponieważ zawierają polecenie (powyżej), aby zablokować nowe połączenia i ponieważ każda próba użycia polecenia ...
... nie działa, aby blokować nowe połączenia!
Dzięki @araqnid @GoatWalker! = D.
https://stackoverflow.com/a/3185413/3223785
źródło
Nadchodzące PostgreSQL 13 wprowadzi
FORCE
opcję.źródło
W moim przypadku musiałem wykonać polecenie, aby usunąć wszystkie połączenia, w tym moje aktywne połączenie administratora
który zakończył wszystkie połączenia i pokazał mi krytyczny komunikat „błąd”:
FATAL: terminating connection due to administrator command SQL state: 57P01
Następnie można było usunąć bazę danych
źródło
Nic mi nie działało, oprócz tego, że zalogowałem się za pomocą pgAdmin4, a na pulpicie nawigacyjnym odłączyłem wszystkie połączenia oprócz pgAdmin4, a następnie mogłem zmienić nazwę, klikając prawym przyciskiem myszy bazę danych i właściwości, i wpisałem nową nazwę.
źródło