概要
テストを行う為、rspec
コマンドを入力した際、下記のエラーが表示されました。今回は、このエラーの修正方法について説明します。
エラーの内容
エラーの内容に、データベースを使用している他のセッションが1つあります
と記載されています
# 入力コマンド
rspec
# エラーの出力内容
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "***************" is being accessed by other users (ActiveRecord::StatementInvalid)
DETAIL: There is 1 other session using the database.
Caused by:
PG::ObjectInUse: ERROR: database "***************" is being accessed by other users (PG::ObjectInUse)
DETAIL: There is 1 other session using the database.
Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
You have 100000 pending migrations:
# 以下省略
エラーの原因
何らかの原因で、DB
に接続するユーザーのセッション情報が残っています。この状況でデータベースにアクセスすると、セッションの影響で他のユーザーが既にアクセスしているとDB
が誤認します。この問題を解決するには、セッションに残っているユーザーを消去する必要があります。
その方法は、2種類ある為、下記に記載します。
修正方法1
- 凄く簡単な方法ですが、PCを再起動します。これにより、開いているすべてのセッションが終了する為、正常に動作すると思われます。
修正方法2
-
SQL
を使用して、データベースの接続をリセットし、セッションの情報を消去する
修正手順
-
PostgreSQL
にログインする
# ログインコマンド
# ユーザーが異なる場合、そのユーザーでログインして下さい
psql -U postgres
- 下記のSQL文を実行します。これにより、
DB
のプロセスを消去する事ができる為、セッションの情報が消去されて、正常にDB
に接続できる様になります。
SELECT
pg_terminate_backend(pg_stat_activity.pid)
FROM
pg_stat_activity
WHERE
pg_stat_activity.datname = 'TARGET_DB' /* ← DB名を記載する */
AND pid <> pg_backend_pid();
(TARGET_DB
の部分に対象のデータベース名に入力して下さい)
感想
地味にハマってしまい、この問題を解決するのに、膨大な時間を要してしまいました。
同じ問題で悩んでる人が居ましたら、この記事が何かの役に立って頂ければと思います。