pg_dump 및 pg_restore : 입력 파일이 유효한 아카이브가 아닙니다


66

한 컴퓨터에서 pg_dump를 사용하고 결과 파일을 다른 컴퓨터에 복사하여 복원하려고했습니다. 나는 스키마가 같다고 생각합니다. 그러나 나는 얻는다 :

pg_restore: [archiver] input file does not appear to be a valid archive

다음 작업을 수행했습니다.

pg_dump -a -f db.txt dbname

과:

pg_restore -a -d dbname db.txt

무엇이 잘못 되었나요?


덤프를 생성 한 동일한 시스템에서 덤프를 가져 오십시오. 또한 Postgres 버전을 확인하십시오.
Hank Gay

프로덕션 머신이기 때문에 같은 머신에서 가져 오기를 시도 할 수 없습니다. 어떤 아이디어라도 할 수 있습니까?
gruszczy 2016 년

이 솔루션은 또한 어떤 사람들과 관련이있을 수 있습니다 : stackoverflow.com/questions/42433414/...
무하마드 한난에게

답변:


93

psql에 피드하도록 설계된 일반 SQL 형식으로 덤프하고 있습니다. pg_restore에서 인식되지 않습니다.

cat db.txt | psql dbname

트릭을해야합니다


5
또는 psql dbname < db.txt;)
Aleksey Deryagin

26

pg_dump기본적으로 데이터를 다시 작성하는 데 필요한 SQL 명령이 작성됩니다. 파일을 복구하려면 파일을 input 으로 호출 psql하지 않아야 pg_restore합니다. pg_restore이진 (기본값은 아니지만 일반적으로 권장되지 않음 ) 형식 에만 사용됩니다 pg_dump. 문서를 읽으십시오 .

업데이트 : 함께 사용되는 pg_dump이진 형식 ( -Fc -Ft) pg_restore은 정상이며 약간의 추가 유연성을 제공합니다. 그러나 표준 (SQL이 아닌)이 적고 일부 도구 (예 : php frontend)에서 가져 오기에 적합하지 않거나 텍스트 편집기로 조작하기가 쉽지 않으며 다른 버전 및 다른 데이터베이스에도 이식성이 떨어집니다. 백업의 경우 기본 일반 형식을 사용합니다. 다른 시나리오의 경우 binary + pg_restore 옵션은 동일하거나 더 적합 할 수 있습니다.

유지해야 할 점은 일반적인 시나리오 에서 Postgresql 에서 백업은 일반적으로 pg_dump (일반)에 의해 수행되고 표준 명령 행 클라이언트 ( psql )에 의한 복원 이 수행된다는 것 입니다.


2
[OT] 사용자 지정 출력 형식의 "권장되지 않음"상태와 관련하여달라고 간청합니다. "이것은 매뉴얼에서 데이터를로드하고 개체 정의를 다시 정렬 할 수있는 가장 유연한 형식입니다 ..." 나에게 꽤지지하는 것.
Milen A. Radev

"권장되지 않음"은 과장된 표현이었습니다. 그러나 "가장 유연하다"는 것이 반드시 "가장 권장"되는 것은 아닙니다. 명확히했다.
leonbloy 2016 년

13

--format=c옵션을 전달해보십시오 pg_dump. 이를 pg_restore복원 할 수 있습니다.


이것을 수정 한 사람이 이유를 설명하고 싶습니까? 허용 대답은이 :-) 작동하는지 설명

@skrafi : 요점이 뭐예요?
psmears

1
죄송합니다, 복사하여 잘못된 출력을 붙여 넣었습니다. 올바른 출력 pg_restore: [archiver] did not find magic string in file header은 간단한 sql 덤프에서 작동하지 않습니다.
skrafi

@skrafi : 무슨 말인지 잘 모르겠습니다. 당신이 사용하는 경우 pg_dump --format=c ...> archivefile, 다음 사용 pg_restore에 대한 archivefile다음, (나는 지금 그것을 테스트 할 때 적어도) 그것을 잘 작동합니다. 어쩌면 파일이 어떻게 든 손상 되었습니까? 아니면 특정 버그에 부딪 혔습니까?
psmears

6

이것이 이전 데이터베이스를 백업하고 복원하는 것입니다.

데이터베이스를 백업하려면

pg_dump --format=c olddb_name > db_dump_file.dump

해당 백업을 복원하려면

pg_restore -v -d newdb_name db_dump_file.dump

pg_dumppg_restore대해서 더 읽어보세요.


5

Windows 사용자의 경우

type db.txt | psql --username="YOURNAME" dbname

매력처럼 작동


감사합니다! 적어도 창문에 대한 답변을 받아 들여야합니다.
다니엘 버틀러

2

당신은 MySQL의 SOURCE명령에 뭔가를 할 수 있습니다 :

psql dbname

그런 다음 postgresql 터미널에서

\i filename

2

고양이 dumpFileName | psql -h ip -d dbName -U 사용자 이름 -W


1
그것이하는 일과 그것이 도움이 될 수있는 이유를 설명하면 일반적으로 도움이됩니다.
Falcon Momot

1

이 오류 메시지는 백업 파일 (또는 그에 대한 가정)에 실제로 문제가 있음을 의미 할 수도 있습니다.

한 경우에는 Docker 컨테이너에 백업 파일을 마운트하고 복원하려고 시도했지만 실패했습니다 does not appear to be a valid archive. 실제로 마운트가 올바르게 수행되지 않았기 때문에 파일이 비어있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.