データベースを削除し、コマンドラインから新しいデータベースを作成しようとしています。
psql -U username
を使用してログインしてから\connect template1
を実行し、続いてDROP DATABASE databasename;
を実行します。
私はエラーが出ます
データベースdatabasenameは他のユーザーによってアクセスされています
私はApacheをシャットダウンしてこれを再試行しましたが、まだこのエラーが出ます。私は何か悪いことをしていますか?
コマンドラインから dropdb コマンドを実行できます。
dropdb 'database name'
削除できるようにするには、スーパーユーザーまたはデータベース所有者になる必要があります。
また、pg_stat_activityビューをチェックして、すべてのアイドルプロセスを含め、データベースに対して現在どのような種類のアクティビティが行われているかを確認することもできます。
SELECT * FROM pg_stat_activity WHERE datname='database name';
これは私のために働いた:
select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
9.2より前のpostgresqlでは、pid
をprocpid
に置き換えます。
DROP DATABASE "YourDatabase";
これを試して。データベースが指定されていないことに注意してください - それはただ「サーバー上で」実行されます
psql -U postgres -c "drop database databasename"
それでもうまくいかない場合は、postgresが孤立した準備済みステートメントを保持することに問題があります。
それらを片付けるには、次のようにします。
SELECT * FROM pg_prepared_xacts;
それからあなたが見るすべてのIDに対して、これを実行します。
ROLLBACK PREPARED '<id>';
ユーザが接続していると言ったとき、クエリは「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;