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.log
donaudit ルールが原因で、拒否が 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_t
sesearch -s postgresql_t -A | grep ': file.*write'
sesearch
setools-console