567 votes

Tuer une session / connexion postgresql

Comment puis-je tuer toutes mes connexions postgresql?

J'essaye un rake db:drop mais j'obtiens:

 ERROR:  database "database_name" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.
 

J'ai essayé de fermer les processus que je vois d'un ps -ef | grep postgres mais cela ne fonctionne pas non plus:

 kill: kill 2358 failed: operation not permitted
 

1038voto

Frank Heikens Points 29270

À partir de la version 8.4, vous pouvez utiliser pg_terminate_backend() pour supprimer une connexion. Vous devez être superutilisateur pour utiliser cette fonction. Cela fonctionne sur tous les systèmes d'exploitation même.

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    procpid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

Avant l'exécution de cette requête, vous devez RÉVOQUER les privilèges CONNECT pour éviter de nouvelles connexions:

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

278voto

Haris Krajina Points 3051

Peut-être simplement redémarrer postgres => sudo service postgresql restart

14voto

artemave Points 1934

OSX, Postgres 9.2 (installé avec homebrew)

Si votre datadir est ailleurs vous pouvez trouver où c’est en examinant la sortie de``

8voto

Chris Points 1228

Cela semble fonctionner pour PostgreSQL 9.1:

 #{Rails.root}/lib/tasks/databases.rake
# monkey patch ActiveRecord to avoid There are n other session(s) using the database.
def drop_database(config)
  case config['adapter']
  when /mysql/
    ActiveRecord::Base.establish_connection(config)
    ActiveRecord::Base.connection.drop_database config['database']
  when /sqlite/
    require 'pathname'
    path = Pathname.new(config['database'])
    file = path.absolute? ? path.to_s : File.join(Rails.root, path)

    FileUtils.rm(file)
  when /postgresql/
    ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
    ActiveRecord::Base.connection.select_all("select * from pg_stat_activity order by procpid;").each do |x|
      if config['database'] == x['datname'] && x['current_query'] =~ /<IDLE>/
        ActiveRecord::Base.connection.execute("select pg_terminate_backend(#{x['procpid']})")
      end
    end
    ActiveRecord::Base.connection.drop_database config['database']
  end
end
 

Levé des gists trouvés ici et ici .

Voici une version modifiée qui fonctionne à la fois pour PostgreSQL 9.1 et 9.2.

6voto

cmaitchison Points 2450

J’ai utiliser la tâche suivante de râteau pour substituer les Rails `` méthode.

``

Edit : Il s’agit pour Postgresql 9,2 +

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X