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
接続を切断するには 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'
;
たぶんただpostgres
=> Sudo service postgresql restart
を再起動してください
実行中のプロセスに関するすべての情報で:
SELECT *, pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname = 'my_database_name';
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
の出力を調べることでそれがどこにあるのかを知ることができます。
postgresqlがbrewでインストールされている場合、MacOS。
brew services restart postgresql
これは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
私は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以降用です。
私はこの問題を抱えていましたが、問題はNavicatが私のローカルPostgresデータベースに接続されていたことです。 Navicatを切断すると、問題は解決しました。
編集:
また、 絶対的な最後の手段 として、データをバックアップしてから次のコマンドを実行できます。
Sudo kill -15 `ps -u postgres -o pid`
...これはpostgresユーザーがアクセスしているものすべてを殺します。プロダクションマシンでこれを行わないでください。ただし、開発環境に問題はないはずです。この後PostgreSQLを再起動する前に、everypostgres
プロセスが本当に終了したことを確認することが重要です。
編集2:
このunix.SE投稿のため 、 私はkill -9
からkill -15
に変更しました。
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
私はこの方法で解決しました:
私のWindows 8 64ビットでは、サービスをrestart
ingするだけです:postgresql-x64-9.5
Postgresを終了して再起動してください。単純ですが、他のcliコマンドではうまく行かないことがあるので、私には毎回動作します。
他のバックグラウンドプロセスがデータベースを使用していると、Haris's Answerが機能しない可能性があることを指摘したいだけでした。
script/delayed_job stop
そしてそのとき初めて、私はデータベースを削除/リセットすることができました。
ドロップする必要はありません。パブリックスキーマを削除して再作成するだけです。ほとんどの場合、これはまったく同じ効果があります。
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
より簡単でより更新された方法は以下のとおりです。
Use ps -ef | grep postgres
#Sudo kill -9 "#"
注:同一のPIDがある可能性があります。 1人を倒すとすべてが倒されます。
リモートシナリオしかし、もしあなたがRailsアプリでテストを実行しようとしていて、そしてあなたが何かのようになるならば
"ActiveRecord :: StatementInvalid:PG :: ObjectInUse:ERROR:database" myapp_test "が他のユーザーによってアクセスされています詳細:データベースを使用しているセッションが1つあります。"
テストを実行する前に、pgAdminまたは他のpostgres GUIツールを必ず閉じてください。
開いているクエリページがあるかどうかPGadminを開いて、すべてのクエリページを閉じて、PostgresSQLサーバを切断して再度接続し、delete/dropオプションを試してみてください。これは私を助けました。
私はMacを使っていて、Postgres.app
を使ってpostgresを使っています。私はこの問題を解決して、アプリを終了して再び起動しました。