4

Posgresqlデータベースが1つあり(私が所有者です)、それを削除してダンプから再作成したいと思います。

問題は、データベースに定期的にアクセスする2つのアプリケーション(2つのWebサイト、railsとperl)があることです。そのため、「データベースは他のユーザーによってアクセスされています」というエラーが発生します。

1つの可能性は、関連するプロセスのpidを取得し、それらを個別に強制終了することであると読みました。できればもっときれいなことをしたいです。

Phppgadminは、私が望んでいることを実行しているようです。Webサイトがオンの場合でも、エラーが発生することなく、Webインターフェイスを使用してスキーマを削除できます。だから私はそのコードがどのように機能するかを調査しています。しかし、私はPHPの専門家ではありません。

phppgadminコードを理解して、それがどのように機能するかを確認しようとしています。私はそれが言う(Schemas.phpの257)を見つけました:

$data->dropSchema(...)

$dataはグローバル変数であり、定義されている場所が見つかりませんでした。

任意のポインタをいただければ幸いです。

4

2 に答える 2

12

まず、データベースを使用して現在のすべてのプロセス ID を見つけます。

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';
于 2010-03-12T12:26:01.710 に答える
0

PostgreSQLについてはわかりませんが、テーブルにアクセスしようとすると他のプロセスが失敗するように、テーブルをロックすることが解決策になると思います。

参照: http://www.postgresql.org/docs/current/static/sql-lock.html

于 2010-03-12T12:19:04.807 に答える