LoginSignup
8
3

More than 5 years have passed since last update.

rails db:resetでエラーが出たお話

Last updated at Posted at 2019-02-20

はじめに

Railsアプリを作成している中で、rails db:resetをしたところエラーが発生しました。
結論を先に述べてしまうと、PostgreSQLを再起動すれば正常に作動したというあっさりとしたお話ですが、エラー内容やPostgreSQLのコマンドのメモもかねて事態をまとめたいと思います。

環境

ruby   : 2.5.1
rails  : 5.2.2
psql (PostgreSQL) 11.1

エラー内容

rails serverは閉じた状態でrails db:resetをしたところ以下のエラーが出ました。

$ rails db:reset
PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users
DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "〇〇_development"
Couldn't drop database '〇〇_development'
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users

DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "〇〇_development"
/Users/ユーザー名/practice/〇〇/bin/rails:nine:in `<top (required)>'
/Users/ユーザー名/practice/〇〇/bin/spring:15:in `<top (required)>'
bin/rails:three:in `load'
bin/rails:3:in `<main>'

Caused by:
PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users
DETAIL:  There is 1 other session using the database.
/Users/ユーザー名/practice/〇〇/bin/rails:nine:in `<top (required)>'
/Users/ユーザー名/practice/〇〇/bin/spring:15:in `<top (required)>'
bin/rails:three:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)

解決に向けて

エラーの原因は上述の通り、
・ database "〇〇_development" is being accessed by other users
・ There is 1 other session using the database
です。
アプリで作成したuserデータは以下の通りで、id=1に関してはdestroyしていました。

[1] pry(main)> User.all
  User Load (0.9ms)  SELECT "users".* FROM "users"
=> [#<User id: 2, email: "〇〇@gmail.com", created_at: "2019-02-19 09:27:13", updated_at: "2019-02-19 09:27:13", name: "〇〇", profile_photo: nil>]

冒頭で述べた通り、rails serverは閉じており、当然他のユーザーがアクセスしていることもありません。
そこでデータベースに接続中のセッションの有無を確認することにしました。

PostgreSQLをイジる

主に[PostgreSQL] 接続中のセッションを切断すると、サイトにもリンクが貼られている表 27-2. pg_stat_activityビューを参考にしました。

$ psql postgres
postgres=# select pid, datname, client_addr from pg_stat_activity where datname = '{〇〇_development}';
 pid | datname | client_addr 
-----+---------+-------------
(0 rows)

アクセスがあると言われたデータベースに接続しているセッションは見つかりませんでした。

結論

よく分からなかったのでとりあえずPostgreSQLを再起動させたらrails db:resetは正常に実行されました。

*追記
アクセスが1つあった原因はSQLクライアントのTeamSQLを接続していたからだと思われます。。。

備考

アクティブなセッションの有無を確認する際、selectやwhereを使って検索条件を絞ってりましたが、PostgreSQLの再起動前後で一切条件を絞らずに確認したところ、以下のように違いが出ました。
ただ単純にPostgreSQLが正常に動作してなかったのかなんなのか。。。データベースに関する理解がまだ不十分であるため時間をとって勉強したいと思います。

再起動前
postgres=# select * from pg_stat_activity;
 datid |       datname        |  pid  | usesysid |    usename     |    application_name    | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change          | wait_event_type |     wait_event      | state  | backend_xid | backend_xmin |       query       |         backend_type         
-------+----------------------+-------+----------+----------------+------------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+-----------------+---------------------+--------+-------------+--------------+-------------------+------------------------------
       |                      | 62989 |          |                |                        |             |                 |             | 2019-02-13 16:13:43.580955+09 |                               |                               |                               | Activity        | AutoVacuumMain      |        |             |              |                   | autovacuum launcher

再起動後
postgres=# select * from pg_stat_activity;
 datid | datname  |  pid  | usesysid |    usename     | application_name | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change         | wait_event_type |     wait_event      | state  | backend_xid | backend_xmin |              query                                                         |                                                           
                                                              backend_type         
-------+----------+-------+----------+----------------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+------------------------------+-----------------+---------------------+--------+-------------+--------------+---------------------------------+------------------------------
       |          | 78885 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533763+09 |                               |                               |                              | Activity        | AutoVacuumMain      |        |             |              |                                 | autovacuum launcher
       |          | 78887 |       10 | 〇〇            |                  |             |                 |             | 2019-02-19 20:15:26.534469+09 |                               |                               |                              | Activity        | LogicalLauncherMain |        |             |              |                                 | logical replication launcher
 13364 | postgres | 79041 |       10 | 〇〇            | psql             |             |                 |          -1 | 2019-02-19 20:27:34.681684+09 | 2019-02-19 22:51:59.447419+09 | 2019-02-19 22:51:59.447419+09 | 2019-02-19 22:51:59.44742+09 |                 |                     | active |             |          601 | select * from pg_stat_activity; | client backend
       |          | 78883 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533005+09 |                               |                               |                              | Activity        | BgWriterHibernate   |        |             |              |                                 | background writer
       |          | 78882 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.53262+09  |                               |                               |                              | Activity        | CheckpointerMain    |        |             |              |                                 | checkpointer
       |          | 78884 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533406+09 |                               |                               |                              | Activity        | WalWriterMain       |        |             |              |                                 | walwriter
(6 rows)

参考にしたサイト

PostgreSQL DROP DATABASE
PostgreSQL - DBに接続しているセッションの確認
PostgreSQLのデータベースにアクセスしているセッションを切断する

8
3
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
8
3