COPY
(파일 이름 포함)은 PostgreSQL 서버가 파일을 직접 읽거나 쓰도록 지시합니다. 이 파일은 PostgreSQL 사용자 (서버가 실행되는 사용자 ID)가 액세스 할 수 있어야하며 서버의 관점에서 이름을 지정해야합니다. (출처 : postgresql documentation)
그래서 파일은 postgresql 서버가 실행중인 (즉, 사용자가 아닌) 유닉스 사용자가 읽을 수 있어야합니다 (또는 쓰기 가능). 절대적으로 확실하려면 sudo -u postgres head /tmp/test.csv
을 실행 해보십시오 (사용자가 sudo
을 사용하고 데이터베이스 사용자가 postgres라고 가정 할 경우).
이것이 실패하면 SELinux와 관련된 문제 일 수 있습니다 (Craig Ringer의 언급). Red Hat/Fedora/CentOS, Scientific Linux, Debian 및 기타에서 사용되는 가장 일반적인 SELinux 정책 ("대상"참조 정책)에서 ... postgresql 서버 프로세스는 제한되어 있습니다. 몇 가지 파일 유형만 읽기/쓰기 할 수 있습니다 .
donaudit 규칙으로 인해 auditd의 로그 파일 (/var/log/audit/audit.log
)에 거부가 기록되지 않을 수 있습니다. 따라서 보통의 SELinux 빠른 테스트는 다음과 같이 적용됩니다. getenforce;setengorce 0;getenforce
을 실행하여 SELinux가 모든 프로세스를 제한하지 않도록하고 postgresql의 COPY
을 테스트합니다. 그런 다음 setenforce 1
을 실행하여 SELinux를 다시 활성화합니다 (이 명령은 구성 파일이 아닌 실행 상태를 수정하므로 재부팅 후 SELinux가 활성화됩니다 (적용).
올바른 방법은 해당 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 서버에서 해당 파일 컨텍스트를 읽고 쓸 수 있습니다.
은 (
postgresql_t
를 인쇄해야
ps xaZ | grep "postmaste[r]" | grep -o "[a-z_]*_t"
실행 실행 포스트 그레스하는 아래의 SELinux 문맥을, 확인합니다.
sesearch -s postgresql_t -A | grep ': file.*write'
를 사용
postgresql_t
쓸 수있는 상황에 맞는 유형을 나열합니다. 명령
sesearch
가
setools-console
RPM 패키지에 속한).
사용한 구문과 파일에 대한 사용 권한을 추가하십시오. –
예를 들면, PostgreSQL 버전, Pg 설치 방법, OS와 버전, 파일 사용 권한 ('ls -l filename'과'ls --lcontext filename'), 테이블 사용 권한 ('\ d + tablename 'psql'에서), 당신이 실행 한 명령의 정확한 텍스트 + 오류 메시지가 도움이 될 것입니다. –