1. ホーム
  2. ruby-on-rails

[解決済み] Rails + Postgres drop エラー: データベースは他のユーザーによってアクセスされています。

2022-12-13 17:29:38

質問

Postgres上で動作するrailsアプリケーションを持っています。

テスト用と本番用の2つのサーバを持っています。

非常に頻繁に、テストサーバー上で本番用DBをクローンする必要があります。

私がVlad経由で実行しているコマンドは、次のとおりです。

rake RAILS_ENV='test_server' db:drop db:create

問題は、以下のエラーが出ることです。

ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>

これは、誰かが最近Web経由でアプリケーションにアクセスした場合に発生します(postgresは開いた"session"を保持します)。

postgres DBのセッションを終了させる方法はありますか?

ありがとうございます。

編集

phppgadminのインターフェースを使ってデータベースを削除することはできますが、rakeのタスクではできません。

phppgadminのドロップをrakeタスクで再現するにはどうしたらよいでしょうか。

どのように解決するのですか?

アプリケーションで実行中のpostgresqlの接続を切断すれば、db:dropをうまく実行することができます。 では、どのようにして接続を切断するのでしょうか? 私は以下のようなrakeタスクを使っています。

# lib/tasks/kill_postgres_connections.rake
task :kill_postgres_connections => :environment do
  db_name = "#{File.basename(Rails.root)}_#{Rails.env}"
  sh = <<EOF
ps xa \
  | grep postgres: \
  | grep #{db_name} \
  | grep -v grep \
  | awk '{print $1}' \
  | xargs kill
EOF
  puts `#{sh}`
end

task "db:drop" => :kill_postgres_connections

rails の下から接続を殺すと、次にページを読み込もうとしたときに嘔吐することがありますが、再度読み込むと接続が再確立されます。