0
0

There is 1 other session using the database. の修正方法

Last updated at Posted at 2023-12-20

概要

テストを行う為、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の部分に対象のデータベース名に入力して下さい)

感想

地味にハマってしまい、この問題を解決するのに、膨大な時間を要してしまいました。
同じ問題で悩んでる人が居ましたら、この記事が何かの役に立って頂ければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0