はじめに
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のデータベースにアクセスしているセッションを切断する