database xxx is being accessed by other users エラーの解消法
2021.11.26
データベースをドロップしようとしたら『ERROR: database "xxx" is being accessed by other users』というエラーが発生したときの解決メモ
エラー内容としては、xxxってDBに他の接続があるから操作できないよ。という意味
解決方法
エラーメッセージそのままググると強制的に接続中のセッションを終了するコマンドとかがでてくるけど、
まずは一つずつ確認しながらやりたいので、次の方法で解決する。
- 接続中のセッション一覧を調べる
- pidをメモる
- メモったpidの接続を切断する
1. 接続中のセッション一覧を調べる
db=# select * from pg_stat_activity;
pg_stat_activity
でPostgreSQLのプロセス状況などが一覧で確認できる
pid
(プロセスID)をメモる
2. 実行結果から接続を切りたいセッションの-[ RECORD 1 ]----+--------------------------------
datid | 28817
datname | db
pid | 3315
usesysid | 10
usename | postgres
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2021-06-11 20:12:18.924775+09
xact_start | 2021-06-11 20:12:25.002678+09
query_start | 2021-06-11 20:12:25.002678+09
state_change | 2021-06-11 20:12:25.002688+09
wait_event_type |
wait_event |
state | active
backend_xid |
backend_xmin | 8691
query | select * from pg_stat_activity;
-[ RECORD 2 ]----+--------------------------------
datid | 28817
datname | db
pid | 68
usesysid | 10
usename | postgres
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2021-06-02 10:49:14.586371+09
xact_start |
query_start |
state_change | 2021-06-02 10:49:14.594316+09
wait_event_type |
wait_event |
state | idle
backend_xid |
backend_xmin |
query |
今回はpid
68のセッションを切る
pid
をpg_terminate_backend()
に渡せばセッションが切れる
3. メモったdb=# SELECT pg_terminate_backend(68);
-[ RECORD 1 ]--------+--
pg_terminate_backend | t
これで本来流したかったクエリが流れるようになるので解決。
バージョン情報など
PostgreSQL 9.6.16