2014-03-26 3 views
3

COPY 문을 사용하여 PostgreSQL 테이블을 덤프하려고합니다. 나올 때 열 중 하나에서 변환을 수행해야하기 때문에 pg_dump 대신 COPY를 사용하고 있습니다.postgres 오류가 발생하는 Windows에서 COPY (...) TO PROGRAM 오류

내가 실행하고자하는 문은 기본적으로이

COPY (SELECT 'punt') TO PROGRAM '7z a -si C:/Users/Public/Documents/punt'; 

하지만 나는 일반 오류

ERROR: program "7z a -si C:/Users/Public/Documents/punt" failed 
DETAIL: child process exited with exit code 1 
을 얻고있다

나는에 the fourth example 유사한 7zip과를 통해 COPY 출력을 통과하는 것을 시도하고있다 COPY 데이터베이스가 약 130GB이므로 출력을 압축하려면 설명서를 읽고 SSD로 작업하는 것이 이상적입니다. 다음 명령은 정상적으로 작동합니다.

COPY (SELECT 'punt') TO 'C:/Users/Public/Documents/punt'; 

결과는 COPY 1입니다. 나는 psql의 프롬프트에서 다음 명령을 실행하고 또한 구문 및 권한에 대한 나를 상당히 확신하게하는 작품 : 나는 cmd 파이프 라인 또는 7zip과 실행 권한에 대한 뭔가가

\! echo 'punt' | 7z a -si C:/Users/Public/Documents/punt 

건가요?

편집 : 포스트 그레스 버전은 아직도 크레이그 링어의 답변에 따라 NETWORK SERVICE에 대한 디렉토리 권한을 변경 한 후 같은 오류를 받고 있어요 9.3.3

입니다. 그러나 이것은 문제를 해결하지 못했고 오류는 동일합니다. Everyone으로 모든 권한을 부여하는 대상 디렉토리의 권한을 변경 한 후에도 동일한 오류가 발생합니다. 또한 7zip 실행 파일과 7zip Program Files 디렉터리에 대한 사용 권한을 변경하려고 시도했습니다.

이 실험에서, 내가 실행 한 방정식에서 복사본에서 입력을 고려하여 다음

COPY (select '1') TO PROGRAM 'echo punt | 7z a -si C:/Users/Public/Documents/punt'; 

과 호기심 실패 메시지를 얻었으나, 대신에 종료 코드 255와 함께하는 7zip과 has the meaning에 대한 "사용자가 중지 과정". 내 자신을위한 이유를 찾을 수 없습니다.

+0

'\!'는'COPY ... PROGRAM' 명령이 명령의 종료 상태를보고하거나 신경 쓰지 않습니다. 마지막 예제에서 실제로 작동하는지 확신합니까? – jjanes

+0

@jjanes 확실히 그렇습니다. 명령 앞에는'punt.7z'가 존재하지 않으며 명령 뒤에 있습니다. 사실, 명령 줄에서 곧바로 실행할 때 출력과 똑같은'\! '를 통해 출력을 보았습니다. – FLGMwt

답변

2

필자 편집에서 7zip 비트를 사용하여 255 오류 코드는 실제로는 cmd에서 7zip exe를 찾을 수 없습니다./(프로그램 파일에 공간을 탈출 알아낼 수)이이 근무

COPY (SELECT 'punt') TO PROGRAM 'C:/7z a -si C:/Users/Public/Documents/punt'; 

을 실행 : 나는 C에 7zip.exe을 풍덩. NETWORKSERVICE 사용자에게 path 환경 변수가로드되어 있지 않다고 생각합니다. 그러나 그것에 대해 확실하지 않습니다.

나는 다시 기본값으로 C:/Users/Public/Documents에 대한 권한을 설정하고 COPY ... TO PROGRAM는 여전히 권한 이 특정한 경우에 문제가 아니었다 파일을했다. 이런 문제가 다시 발생하면 나는 Craig Ringer의 제안을 먼저 볼 것입니다.

+1

아아, * 헤드 스탁 *. 나는 그것을 생각해 보았을 것이지만, 거부 된 * 허가에 의해 던져졌다. –

2

사용 권한 문제입니다.

PostgreSQL 서버는 9.2 이상에서는 NETWORKSERVICE, 9.1에서는 postgres 사용자로 실행됩니다. COPY는 PostgreSQL 사용자로서 server-side를 실행합니다.

이들 중 어느 것도 C:\Users\Public\Documents에 글을 쓸 권한이 없습니다.

PostgreSQL 서비스 사용자에게 Windows 보안 속성 대화 상자를 사용하여 쓰기 권한을 부여하거나 기록 할 수있는 다른 위치를 선택해야합니다.

것이다이 쓸 수있는 권한이 사용자로 실행 \!psql 때문에 작동하고, \!psql를 실행하는 사용자로 명령 클라이언트 측을 실행합니다.

+1

다시 한번 크레이그 링거가 구출하기 위해 :-) – dschulz

+0

아하! 나는 그것에 대해 걱정했다. 불행히도 아직 작동하지 않았습니다. 내 질문을 업데이트 할게. – FLGMwt