phppgadmin :ユーザーを postgres から追い出し、db_drop できるようにするにはどうすればよいでしょうか?
-
19-09-2019 - |
質問
Posgresql データベースが 1 つあり (私が所有者です)、それを削除してダンプから再作成したいと考えています。
問題は、データベースに定期的にアクセスするアプリケーションがいくつか (2 つの Web サイト、Rails と Perl) あることです。そのため、「データベースは他のユーザーによってアクセスされています」というエラーが表示されます。
可能性の 1 つは、関係するプロセスの pid を取得し、それらを個別に強制終了することであると読みました。できればもっとすっきりしたものにしたいと思っています。
phpgadmin は私が望むことを行うようです:Web インターフェイスを使用して、Web サイトが起動しているときでも、エラーが発生することなくスキーマを削除できます。そこで、そのコードがどのように機能するかを調査しています。ただし、私は PHP の専門家ではありません。
それがどのように行われるかを確認するために、phppgadmin コードを理解しようとしています。分かりました 一行 (Schemas.php の 257) そこには次のように書かれています。
$data->dropSchema(...)
$data
はグローバル変数ですが、定義されている場所が見つかりませんでした。
ご指摘をいただければ幸いです。
解決
まず、データベースを使用して現在のすべての processid を検索します。
SELECT usename, procpid FROM pg_stat_activity WHERE datname = current_database();
次に、不要なプロセスを強制終了します。
SELECT pg_terminate_backend(your_procpid);
これはバージョン 8.4 以降で動作しますが、それ以外の場合は pg_terminate_backend() が不明なため、OS レベルでプロセスを強制終了する必要があります。
特定のデータベースに接続されているすべての接続をすばやく削除するには、このショートカットがうまく機能します。スーパーユーザーとして実行する必要があります:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='YourDB';
最近の Postgres バージョン (少なくとも 9.2 以降、おそらくそれ以前) では、列名が変更され、クエリは次のようになります。
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='YourDB';
他のヒント
PostgreSQLについてはわかりませんが、考えられる解決策は、他のプロセスがテーブルにアクセスしようとしたときに失敗するようにテーブルをロックすることだと思います。
見る:http://www.postgresql.org/docs/current/static/sql-lock.html