PostgreSQLデータベースへのアクティブな接続がある場合、PostgreSQLデータベースを削除する方法は?


Answers

PostgreSQL 9.2以降では、接続しているデータベースからセッションを除くすべての接続を切断します:

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

古いバージョンでは同じですが、単にpidprocpid変更してprocpid 。 別のデータベースから切断するには、 current_database()をユーザーの接続を解除するデータベースの名前に変更します。

ユーザーを切断する前に、データベースのユーザーからCONNECT REVOKEREVOKEたい場合があります。そうしないと、ユーザーは再接続を続けるだけで、DBを削除することはできません。 このコメントとそれに関連する質問、 他のすべてのユーザーをデータベースからどのように切り離すのかを参照してください。

アイドル状態のユーザーを切断する場合は、 この質問を参照してください。

Question

PostgreSQLデータベースを削除するスクリプトを書く必要があります。 そこにはたくさんの接続があるかもしれませんが、スクリプトはそれを無視すべきです。

開いている接続がある場合、標準のDROP DATABASE db_nameクエリは機能しません。

どうすれば問題を解決できますか?




ここに私のハック... = D

# Make sure no one can connect to this database except you!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "UPDATE pg_database SET datallowconn=false WHERE datname='<DATABASE_NAME>';"

# Drop all existing connections except for yours!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '<DATABASE_NAME>' AND pid <> pg_backend_pid();"

# Drop database! =D
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "DROP DATABASE <DATABASE_NAME>;"

私は新しい接続をブロックするためのコマンド(上記)を含んでおり、コマンドでの任意の試みが含まれているので、この答えを入れます...

REVOKE CONNECT ON DATABASE <DATABASE_NAME> FROM PUBLIC, <USERS_ETC>;

...新しい接続をブロックするようには機能しません!

@araqnid @GoatWalkerに感謝します! = D

https://.com/a/3185413/3223785




Linuxのコマンドプロンプトでは、まずこのコマンドを実行することによって実行されているすべてのpostgresqlプロセスを停止します。sudo /etc/init.d/postgresql restart

他のpostgresqlプロセスがまだ実行中かどうかを確認するコマンドbgを入力してください

その後dropdb dbnameを実行してデータベースを削除します。

sudo /etc/init.d/postgresql restart
bg
dropdb dbname

これは、Linuxのコマンドプロンプトで私のために働く




私の場合は、アクティブな管理者接続を含むすべての接続を削除するコマンドを実行する必要がありました

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()

すべての接続を終了し、私に致命的な「エラー」メッセージを表示します。

FATAL: terminating connection due to administrator command SQL state: 57P01

その後、データベースを削除することができました




私はpostgres 9.2がprocpidではなくpidカラムを呼び出すことに気付きました。

私はシェルから呼び出す傾向があります:

#!/usr/bin/env bash
# kill all connections to the postgres server
if [ -n "$1" ] ; then
  where="where pg_stat_activity.datname = '$1'"
  echo "killing all connections to database '$1'"
else
  echo "killing all connections to database"
fi

cat <<-EOF | psql -U postgres -d postgres 
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
${where}
EOF

希望があれば助かります。 SQLの@JustBobに感謝します。




Related



Tags

postgresql postgresql