PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Capistrano com PostgreSQL, erro:banco de dados está sendo acessado por outros usuários


Com o PostgreSQL, você pode emitir a seguinte instrução para retornar os pids de backend de todas as conexões abertas que não sejam esta:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();

Em seguida, você pode emitir uma solicitação de rescisão para cada um desses back-ends com
SELECT pg_terminate_backend($1);

Ligando os pids retornados da primeira instrução para cada exec pg_terminate_backend.

Se as outras conexões não estiverem usando o mesmo usuário que você, você terá que se conectar como superusuário para emitir as terminações com sucesso.

ATUALIZAÇÃO:Incorporando comentários e expressando como tarefa de 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