[database] postgresqlセッション/接続を終了する


Answers

たぶん再起動postgres => sudo service postgresql restart

Question

どのように私はすべての私のpostgresql接続を殺すことができますか?

私はrake db:drop試してい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から見たプロセスをシャットダウンしようとしましたps -ef | grep postgres ps -ef | grep postgresしかしこれはうまくps -ef | grep postgresません:

kill: kill 2358 failed: operation not permitted






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

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




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出力を調べることで、どこにあるのかを知ることができますps aux | grep postgres ps aux | grep postgres




ケース:
クエリの実行に失敗しました:

DROP TABLE dbo.t_tabelname

解決策:
a。 次のようにクエリのステータスアクティビティを表示します。

SELECT * FROM pg_stat_activity  ;

b。 「クエリ」列に含まれる行を検索:

'DROP TABLE dbo.t_tabelname'

c。 同じ行で 'PID'列の値を取得する

example : 16409

d。 次のスクリプトを実行します。

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



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

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



以下のrakeタスクを使用して、Railsのdrop_databaseメソッドをオーバーライドします。

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+用です




Related