web-dev-qa-db-ja.com

コマンドラインからPostgreSQLデータベースを削除します

データベースを削除し、コマンドラインから新しいデータベースを作成しようとしています。

psql -U usernameを使用してログインしてから\connect template1を実行し、続いてDROP DATABASE databasename;を実行します。

私はエラーが出ます

データベースdatabasenameは他のユーザーによってアクセスされています

私はApacheをシャットダウンしてこれを再試行しましたが、まだこのエラーが出ます。私は何か悪いことをしていますか?

270
iman453

コマンドラインから dropdb コマンドを実行できます。

dropdb 'database name'

削除できるようにするには、スーパーユーザーまたはデータベース所有者になる必要があります。

また、pg_stat_activityビューをチェックして、すべてのアイドルプロセスを含め、データベースに対して現在どのような種類のアクティビティが行われているかを確認することもできます。

SELECT * FROM pg_stat_activity WHERE datname='database name';
392
csano

これは私のために働いた:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

9.2より前のpostgresqlでは、pidprocpidに置き換えます。

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/ /

101
Eugene

これを試して。データベースが指定されていないことに注意してください - それはただ「サーバー上で」実行されます

psql -U postgres -c "drop database databasename"

それでもうまくいかない場合は、postgresが孤立した準備済みステートメントを保持することに問題があります。
それらを片付けるには、次のようにします。

SELECT * FROM pg_prepared_xacts;

それからあなたが見るすべてのIDに対して、これを実行します。

ROLLBACK PREPARED '<id>';
60
Bohemian

ユーザが接続していると言ったとき、クエリは「select * from pg_stat_activity;」と何をしますか。いう?自分以外の他のユーザーも接続していますか?その場合、他のユーザからの接続を拒否するためにpg_hba.confファイルを編集するか、pgデータベースにアクセスしているすべてのアプリがそれをドロップできるようにシャットダウンする必要があります。私は生産において時々この問題を抱えています。このように2行になるようにpg_hba.confを設定します。

local   all         all                               ident
Host    all         all         127.0.0.1/32          reject

そしてpgsqlにリロードまたは再起動するように(つまりSudo /etc/init.d/postgresql reloadまたはpg_ctl reloadのいずれか)指示すると、今あなたのマシンに接続する唯一の方法はローカルソケット経由です。私はあなたがLinux上にいると仮定します。そうでなければ、これはその最初の行のlocal/ident以外の何かに、Host ... yourusernameのようなものに調整する必要があるかもしれません。

今、あなたはできるはずです:

psql postgres
drop database mydatabase;
14
Scott Marlowe