database xxx is being accessed by other users エラーの解消法

2021.11.26

データベースをドロップしようとしたら『ERROR: database "xxx" is being accessed by other users』というエラーが発生したときの解決メモ

エラー内容としては、xxxってDBに他の接続があるから操作できないよ。という意味

解決方法

エラーメッセージそのままググると強制的に接続中のセッションを終了するコマンドとかがでてくるけど、

まずは一つずつ確認しながらやりたいので、次の方法で解決する。

  1. 接続中のセッション一覧を調べる
  2. pidをメモる
  3. メモったpidの接続を切断する

1. 接続中のセッション一覧を調べる

db=# select * from pg_stat_activity;

pg_stat_activityでPostgreSQLのプロセス状況などが一覧で確認できる

2. 実行結果から接続を切りたいセッションのpid(プロセスID)をメモる

-[ 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            |

今回はpid68のセッションを切る

3. メモったpidpg_terminate_backend()に渡せばセッションが切れる

db=# SELECT pg_terminate_backend(68);
-[ RECORD 1 ]--------+--
pg_terminate_backend | t

これで本来流したかったクエリが流れるようになるので解決。

バージョン情報など

PostgreSQL 9.6.16