W PostgreSQL możesz wydać następującą instrukcję, aby zwrócić pid zaplecza wszystkich otwartych połączeń innych niż to:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
Następnie możesz wysłać żądanie zakończenia do każdego z tych backendów za pomocą
SELECT pg_terminate_backend($1);
Powiązanie pidów zwróconych z pierwszej instrukcji z każdym pg_terminate_backend exec.
Jeśli inne połączenia nie używają tego samego użytkownika co ty, będziesz musiał połączyć się jako superużytkownik, aby pomyślnie wydać zakończenia.
- Dokumentacja funkcji sygnalizacji administratora
- Funkcje monitorowania statystyk
- pg_stat_activity view docs
AKTUALIZACJA:Dołączanie komentarzy i wyrażanie jako zadanie Capistrano:
desc "Force disconnect of open backends and drop database"
task :force_close_and_drop_db do
dbname = 'your_database_name'
run "psql -U postgres",
:data => <<-"PSQL"
REVOKE CONNECT ON DATABASE #{dbname} FROM public;
ALTER DATABASE #{dbname} CONNECTION LIMIT 0;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname='#{dbname}';
DROP DATABASE #{dbname};
PSQL
end