web-dev-qa-db-ja.com

postgresqlセッション/接続を終了します

Postgresql接続をすべて切断するにはどうすればいいですか?

私はrake db:dropを試していますが、私は得ます:

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

ps -ef | grep postgresから見えるプロセスをシャットダウンしようとしましたが、これもうまくいきません。

kill: kill 2358 failed: operation not permitted
302
DanS

接続を切断するには pg_terminate_backend() を使うことができます。この機能を使うにはスーパーユーザーになる必要があります。これはすべてのオペレーティングシステムで同じように動作します。

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

このクエリを実行する前に、新しい接続を避けるためにCONNECT権限を 取り消す 必要があります。

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

あなたがPostgres 8.4-9.1を使っているならpidの代わりにprocpidを使ってください

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'
    ;
550
Frank Heikens

たぶんただpostgres => Sudo service postgresql restartを再起動してください

183
Haris Krajina

実行中のプロセスに関するすべての情報で:

SELECT *, pg_terminate_backend(pid)
FROM pg_stat_activity 
WHERE pid <> pg_backend_pid()
AND datname = 'my_database_name';
18
Dorian

OSX、Postgres 9.2(自作でインストール)

$ 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


あなたのdatadirが他の場所にある場合はps aux | grep postgresの出力を調べることでそれがどこにあるのかを知ることができます。

12
artemave

postgresqlbrewでインストールされている場合、MacOS。

brew services restart postgresql

ソース: postgresqlセッション/接続を終了してください

11
Juuso Ohtonen

これは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

ここから ここここ で見つかった要点から持ち上げた.

これはPostgreSQL 9.1と9.2の両方で動作する修正版 です。

8
Chris

私はRailsのdrop_databaseメソッドをオーバーライドするために次のrakeタスクを使います。

lib/database.rake

require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter
      def drop_database(name)
        raise "Nah, I won't drop the production database" if Rails.env.production?
        execute <<-SQL
          UPDATE pg_catalog.pg_database
          SET datallowconn=false WHERE datname='#{name}'
        SQL

        execute <<-SQL
          SELECT pg_terminate_backend(pg_stat_activity.pid)
          FROM pg_stat_activity
          WHERE pg_stat_activity.datname = '#{name}';
        SQL
        execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
      end
    end
  end
end

編集:これはPostgresql 9.2以降用です。

6
Chris Aitchison

私はこの問題を抱えていましたが、問題はNavicatが私のローカルPostgresデータベースに接続されていたことです。 Navicatを切断すると、問題は解決しました。

編集:

また、 絶対的な最後の手段 として、データをバックアップしてから次のコマンドを実行できます。

Sudo kill -15 `ps -u postgres -o pid`

...これはpostgresユーザーがアクセスしているものすべてを殺します。プロダクションマシンでこれを行わないでください。ただし、開発環境に問題はないはずです。この後PostgreSQLを再起動する前に、everypostgresプロセスが本当に終了したことを確認することが重要です。

編集2:

このunix.SE投稿のため 私はkill -9からkill -15に変更しました。

4
Jamon Holmgren
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
3
Janki

私はこの方法で解決しました:

私のWindows 8 64ビットでは、サービスをrestartingするだけです:postgresql-x64-9.5

3
X-Coder

Postgresを終了して再起動してください。単純ですが、他のcliコマンドではうまく行かないことがあるので、私には毎回動作します。

1
Stan Amsellem

他のバックグラウンドプロセスがデータベースを使用していると、Haris's Answerが機能しない可能性があることを指摘したいだけでした。

script/delayed_job stop

そしてそのとき初めて、私はデータベースを削除/リセットすることができました。

1
mlabarca

ドロップする必要はありません。パブリックスキーマを削除して再作成するだけです。ほとんどの場合、これはまったく同じ効果があります。

namespace :db do

desc 'Clear the database'
task :clear_db => :environment do |t,args|
  ActiveRecord::Base.establish_connection
  ActiveRecord::Base.connection.tables.each do |table|
    next if table == 'schema_migrations'
    ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
  end
end

desc 'Delete all tables (but not the database)'
task :drop_schema => :environment do |t,args|
  ActiveRecord::Base.establish_connection
  ActiveRecord::Base.connection.execute("DROP SCHEMA public CASCADE")
  ActiveRecord::Base.connection.execute("CREATE SCHEMA public")
  ActiveRecord::Base.connection.execute("GRANT ALL ON SCHEMA public TO postgres")
  ActiveRecord::Base.connection.execute("GRANT ALL ON SCHEMA public TO public")
  ActiveRecord::Base.connection.execute("COMMENT ON SCHEMA public IS 'standard public schema'")
end

desc 'Recreate the database and seed'
task :redo_db => :environment do |t,args|
  # Executes the dependencies, but only once
  Rake::Task["db:drop_schema"].invoke
  Rake::Task["db:migrate"].invoke
  Rake::Task["db:migrate:status"].invoke 
  Rake::Task["db:structure:dump"].invoke
  Rake::Task["db:seed"].invoke
end

end
0
jtsagata

より簡単でより更新された方法は以下のとおりです。

  1. 接続を見つけるためのUse ps -ef | grep postgres
  2. 接続のSudo kill -9 "#"

注:同一のPIDがある可能性があります。 1人を倒すとすべてが倒されます。

0
Mr. Rene

リモートシナリオしかし、もしあなたがRailsアプリでテストを実行しようとしていて、そしてあなたが何かのようになるならば

"ActiveRecord :: StatementInvalid:PG :: ObjectInUse:ERROR:database" myapp_test "が他のユーザーによってアクセスされています詳細:データベースを使用しているセッションが1つあります。"

テストを実行する前に、pgAdminまたは他のpostgres GUIツールを必ず閉じてください。

0
Shifa Khan

開いているクエリページがあるかどうかPGadminを開いて、すべてのクエリページを閉じて、PostgresSQLサーバを切断して再度接続し、delete/dropオプションを試してみてください。これは私を助けました。

0
Pritam

私はMacを使っていて、Postgres.appを使ってpostgresを使っています。私はこの問題を解決して、アプリを終了して再び起動しました。

0