245

データベースを削除しようとすると、次のようになります。

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

私が使用する場合:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

そのDBからの接続を終了しましたが、その後データベースを削除しようとすると、誰かが自動的にそのデータベースに接続し、このエラーが発生します。何がそれをしている可能性がありますか?私を除いて、誰もこのデータベースを使用していません。

4

23 に答える 23

285

今後の接続を防止できます。

REVOKE CONNECT ON DATABASE thedb FROM public;

(および場合によっては他のユーザー/役割。 を\l+参照psql)

次に、自分のデータベースを除く、このデータベースへのすべての接続を終了できます。

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid();

古いバージョンpidでは が呼び出されprocpidたため、それに対処する必要があります。

権利を取り消したのでCONNECT、自動接続しようとしていたものは、もはやそうすることができなくなります。

これで、DB をドロップできるようになります。

通常の操作にスーパーユーザー接続を使用している場合、これは機能しませんが、そうしている場合は、最初にその問題を修正する必要があります。


データベースの削除が完了したら、データベースを再度作成する場合は、以下のコマンドを実行してアクセスを復元できます。

GRANT CONNECT ON DATABASE thedb TO public;
于 2013-07-04T04:03:28.947 に答える
214

データベースを削除しようとすると、次のようになります。

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

まず、取り消す必要があります

REVOKE CONNECT ON DATABASE TARGET_DB FROM public;

次に使用します。

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

それは確かにうまくいくでしょう。

于 2014-07-17T05:46:03.783 に答える
49

この問題の解決策を見つけたので、ターミナルでこのコマンドを実行してみてください

ps -ef | grep postgres

このコマンドでプロセスを強制終了します

sudo kill -9 PID
于 2017-10-17T11:05:42.730 に答える
40

Simply check what is the connection, where it's coming from. You can see all this in:

SELECT * FROM pg_stat_activity WHERE datname = 'TARGET_DB';

Perhaps it is your connection?

于 2013-07-03T13:35:46.043 に答える
10

そのような単純な

sudo service postgresql restart
于 2018-10-15T22:57:20.327 に答える
2

最初:

sudo systemctl restart postgresql

それから:

drop database DATABASE_NAME;
于 2022-01-04T09:32:41.843 に答える