PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Capistrano mit PostgreSQL, Fehler:Datenbank wird von anderen Benutzern aufgerufen

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 senden
SELECT 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.

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