Mit PostgreSQL können Sie die folgende Anweisung absetzen, um die Backend-PIDs aller offenen Verbindungen außer dieser zurückzugeben:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
Dann können Sie mit
eine Beendigungsanforderung an jedes dieser Backends sendenSELECT pg_terminate_backend($1);
Binden der von der ersten Anweisung zurückgegebenen PIDs an jede pg_terminate_backend-exec.
Wenn die anderen Verbindungen nicht denselben Benutzer wie Sie verwenden, müssen Sie sich als Superuser verbinden, um die Terminierungen erfolgreich auszugeben.
- Dokumentation zu Admin-Signalisierungsfunktionen
- Überwachungsstatistikfunktionen
- pg_stat_activity-Dokumente anzeigen
UPDATE:Kommentare einarbeiten und als Capistrano-Aufgabe ausdrücken:
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