554 Stimmen

Eine Postgresql-Sitzung/Verbindung beenden

Wie kann ich alle meine Postgresql-Verbindungen beenden?

Ich versuche eine rake db:drop aber ich verstehe:

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

Ich habe versucht, die Prozesse zu beenden, die ich in einer ps -ef | grep postgres aber auch das funktioniert nicht:

kill: kill 2358 failed: operation not permitted

14voto

artemave Punkte 6516

OSX, Postgres 9.2 (installiert mit Homebrew)

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ pg_ctl restart -D /usr/local/var/postgres
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Wenn Ihr Datenverzeichnis an einem anderen Ort liegt, können Sie es herausfinden, indem Sie sich die Ausgabe von ps aux | grep postgres

13voto

Janki Punkte 161
SELECT 
pg_terminate_backend(pid) 
FROM 
pg_stat_activity 
WHERE
pid <> pg_backend_pid()
-- no need to kill connections to other databases
AND datname = current_database();
-- use current_database by opening right query tool

11voto

eku-code Punkte 61

Wenn Sie die Sitzungen eines bestimmten Benutzers trennen müssen, hat mir das geholfen:

Prüfen Sie alle Stromanschlüsse:

select * from pg_stat_activity; 

Weisen Sie Ihrem Benutzer eine Rolle zu (nicht wichtig):

set role "db_admin";

Sitzungen töten:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = '*** USER NAME TO DISCONNECT ***';

8voto

CHAVDA MEET Punkte 589

MacOS, wenn postgresql mit brew installiert wurde:

brew services restart postgresql

UBUNTU,

Prüfen Sie zunächst Folgendes (beenden Sie den Server, der im Hintergrund läuft)

sudo kill -9 $(lsof -i :3000 -t)

Wenn Sie die pid nicht gefunden haben, müssen Sie einfach neu starten Postgresql-Dienst mit dem folgenden Befehl neu starten:

sudo service postgresql restart

8voto

Chris Punkte 1419

Dies scheint für PostgreSQL 9.1 zu funktionieren:

#{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

Entnommen aus gefundenen Gists aquí y aquí .

Hier ist eine geänderte Version die sowohl für PostgreSQL 9.1 als auch 9.2 funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X