3

COPYPostgreSQL のテーブルにファイルを作成しようとしています。テーブルの所有者はpostgresで、ファイルの所有者はpostgresです。

ファイルは にあり/tmpます。

それでもエラーメッセージが表示されます:

ファイル「/tmp/file」を読み取り用に開くことができませんでした: 権限が拒否されました

私が見つけたすべての投稿が、ファイルが/tmpあり、所有者がいるpostgres場合、COPYコマンドは機能するはずだと言っているので、私が間違っていることを理解していません。

4

2 に答える 2

6

推測: Fedora、Red Hat Enterprise Linux、CentOS、Scientific Linux、またはデフォルトでSELinuxを有効にするその他のディストリビューションのいずれかを使用しています。

特定の OS/バージョンで、PostgreSQL の SELinux ポリシーが、サーバーが PostgreSQL データ ディレクトリ外のファイルを読み取ることを許可していないか、ファイルがターゲット ポリシーの対象となるサービスによって作成されたため、PostgreSQL ではないというラベルが付けられています。から読み取ることができます。

これが問題かどうかを確認するには、root として次のコマンドを実行します。

setenforce 0

その後再テスト。走る:

setenforce 1

テスト後に SELinux を再度有効にします。setenforce永続的ではありません。いずれにせよ、SELinux は再起動時に自動的に再度有効になります。通常、SELinux を永続的に無効にすることは、このような問題の適切な解決策ではありません。問題が SELinux であることが確認された場合は、さらに詳しく調べることができます。


使用している OS やバージョン、PostgreSQL のバージョン、実行している正確なコマンドls -al、ファイル、\d+テーブルなどを指定していないため、これ以上詳細を説明したり、これが詳細かどうかを知ることは困難です。推測より。回答を更新して、そのすべてとls --lcontextファイルも含めるようにしてください。

于 2012-09-05T09:05:46.540 に答える
1

COPYをファイル名とともに使用すると、PostgreSQL サーバーはファイルから直接読み書きするように指示されます。ファイルは PostgreSQL ユーザー (サーバーが実行されるユーザー ID) によってアクセス可能である必要があり、名前はサーバーの観点から指定する必要があります。(ソース: postgresql のドキュメント)

したがって、このファイルは、postgresql サーバーを実行している UNIX ユーザー (つまり、あなたのユーザーではない!) によって読み取り (または書き込み) 可能である必要があります。絶対に確実にするために、実行を試みることができます sudo -u postgres head /tmp/test.csv(使用が許可されsudoており、データベース ユーザーが postgres であると仮定します)。

それが失敗した場合は、SELinux に関連する問題である可能性があります (Craig Ringer が言及)。Red Hat/Fedora/CentOS、Scientific Linux、Debian などで使用される最も一般的な SELinux ポリシー (「対象を絞った」参照ポリシー) では、postgresql サーバー プロセスは制限されています。いくつかのファイル タイプのみを読み書きできます。 .

/var/log/audit/audit.logdonaudit ルールが原因で、拒否が auditd のログ ファイル ( ) に記録されない場合があります。したがって、通常の SELinux クイック テストが適用されます。たとえば、SELinux を実行してプロセスの制限を停止しgetenforce;setengorce 0;getenforce、postgresql の をテストしCOPYます。次に、実行して SELinux を再度アクティブにしますsetenforce 1(このコマンドは、構成ファイルではなく実行状態を変更するため、再起動後に SELinux がアクティブ (強制) になります。

これを修正する適切な方法は、ロードするファイルの SELinux コンテキストを変更することです。簡単なハックは次を実行することです:

chcon -t postgresql_tmp_t /tmp/a.csv

ただし、ファイルシステムが再ラベル付けされている場合、または新しいファイルを作成している場合、このファイルのラベル付けは存続しません。SELinux ファイル コンテキスト マッピングを使用してディレクトリを作成する必要があります。

which semanage || yum install policycoreutils-python
semanage fcontext -a -t postgresql_tmp_t '/srv/psql_copydir(/.*)?'
mkdir /srv/psql_copydir
chmod 750 /srv/psql_copydir
chgrp postgres /srv/psql_copydir
restorecon -Rv /srv/psql_copydir
ls -Zd /srv/psql_copydir

そのディレクトリに作成されたファイルはすべて、postgresql サーバーが読み書きできるように、適切なファイル コンテキストを自動的に持つ必要があります。

(postgres が実行されている SELinux コンテキストを確認するには、 を実行します。出力ps xaZ | grep "postmaste[r]" | grep -o "[a-z_]*_t"されるはずです。書き込み可能postgresql_tなコンテキスト タイプを一覧表示するには、 RPM パッケージに属するコマンドを使用します)。postgresql_tsesearch -s postgresql_t -A | grep ': file.*write'sesearchsetools-console

于 2015-02-18T22:31:12.903 に答える