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


321

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

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

エラーが出る

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

Apacheをシャットダウンしてもう一度試しましたが、まだこのエラーが発生します。私は何か間違ったことをしていますか?


2
dropdb databasenameコマンドラインからコマンドを実行するとどうなりますか?
ディランマルコウ2011

1
「エラー:現在開いているデータベースを削除できません」と表示されます
iman453

4
使用psql -U <user> -c "drop database protodb"(データベース名なし)
ユーザー

3
これにより、postgresが再起動され、全員が切断されます。sudoservice postgresql restart次に、次の操作を実行します。dropdb -h localhost -p 5432 -U "youruser" "testdb"
unom 2014年

drop database <dataabase_name>;カンマを忘れないでください。
Sandip Subedi

回答:


455

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

dropdb 'database name'

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

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

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

3
dropuserユーザーも削除するコマンドを使用しています。
pl1nk

6
バージョン9に関しては役に立たない回答です。開いた接続に関するエラーがまだ表示されます。
Pavel Vlasov 2014

4
これにより、postgresが再起動され、全員が切断されます。sudoservice postgresql restart次に、次の操作を実行します。dropdb -h localhost -p 5432 -U "youruser" "testdb"
unom 2014年

1
postgresユーザーを使用:sudo -u postgres dropdb 'database name'
leszek.hanusz

\lあなたが持っているすべてのデータベースを表示します。
Sandip Subedi

115

これは私のために働きました:

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/


12
仕事にそれを少し変更しなければならなかった:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
MRT

column "procpid" does not exist
Amazon

うーん。これを実行しましたが、「SSL接続が予期せず閉じられました[...]リセットしようとして、成功しました」と言った直後に再接続しました。Annnd、私は戻ってきました。
mlissner 2018年

67

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

psql -U postgres -c "drop database databasename"

それがうまくいかない場合、孤立した準備済みステートメントを保持しているpostgresに問題があることがわかりました。
それらをクリーンアップするには、次のようにします。

SELECT * FROM pg_prepared_xacts;

次に、表示されるすべてのIDに対して、次のコマンドを実行します。

ROLLBACK PREPARED '<id>';

申し訳ありませんが、データベースは初めてなので、これは愚かな質問ですが、どこに入力すればよいですか。データベースにログインする前にね?そして、私はデータベース名を私のデータベースの名前に置き換える必要がありますか?
iman453 2011

@ iman453:シェル/コマンドラインから直接実行します。
muが短すぎる

2
postgresqlには「サーバー上だけ」などはありません。データベースに接続する必要があります。この場合、このような場合のためだけに存在するpostgresデータベースに接続します。準備されたトランザクションの良い点ですが、その場合、それが問題であることを示すエラーメッセージが表示されます。
スコットマーロウ2011

1
申し訳ありませんがボヘミアンですが、あなたが間違っています。コマンドラインからcreatedbを実行しているときのpg_stat_activityは次のとおりです。postgres =#select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | CREATE DATABASEテスト。| f | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.916578-06 | | -1これは、別の端末のコマンドラインからcreatedbを実行しているときに発生することに注意してください。その最初のフィールドは、私のcreatedbスクリプトが接続されていたデータベースです
Scott Marlowe

1
なぜこれが1番の答えではないのですか?
Henley Chiu

16

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

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.