phppgadmin :ユーザーを postgres から追い出し、db_drop できるようにするにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/2432555

  •  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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top