PostgreSQL 데이터베이스를 백업 및 복원하기 위해 pg_dump / pg_restore를 사용하고 있지만 pg_restore에서 오류 메시지 (및 0이 아닌 종료 상태)가 나타납니다. 슈퍼 간단한 기본 사례 (아래에 설명)를 시도했지만 여전히 다음 오류가 발생합니다.
pg_restore : [아카이버 (db)] TOC 처리 중 오류 : pg_restore : [아카이버 (db)] TOC 항목 5의 오류; 2615 2200 SCHEMA 공개 postgres pg_restore : [archiver (db)] 쿼리를 실행할 수 없습니다 : ERROR : 스키마 "public"이 이미 있습니다 명령은 다음과 같습니다 : CREATE SCHEMA public;
재현 단계 :
- 신선한 바닐라 우분투 14.04 배포판을 설치하십시오 ( 이 Vagrant 상자 와 함께 Vagrant를 사용하고 있습니다 ).
- PostgreSQL 9.3을 설치하고 Linux 사용자로부터 PostgreSQL 사용자 “postgres”로 로컬 연결을 허용하도록 구성하십시오.
-
테스트 데이터베이스를 작성하십시오. 나는 단지하고있다 :
vagrant @ vagrant-ubuntu-trusty-64 : ~ $ psql --username = 포스트그레스 postgres psql (9.3.5) 도움말을 보려면 "help"를 입력하십시오. postgres = # 데이터베이스 생성 mydb; 데이터베이스 생성 postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64 : ~ $ psql --username = postgres mydb psql (9.3.5) 도움말을 보려면 "help"를 입력하십시오. mydb = # 테이블 데이터 생성 (entry bigint); 테이블 만들기 mydb = # 데이터 값에 삽입 (1); 삽입 0 1 mydb = # 데이터 값에 삽입 (2); 삽입 0 1 mydb = # 데이터 값에 삽입 (3); 삽입 0 1 mydb = # \ q
-
다음과 같이 데이터베이스 백업을 작성하십시오.
PGPASSWORD = "postgres"pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
-
mydb의 데이터 테이블에서 일부 행을 삭제하면 데이터가 성공적으로 복원되었는지 알 수 있습니다.
-
다음을 사용하여 데이터베이스를 복원하십시오.
PGPASSWORD = "postgres"pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
데이터는 복원되지만 6 단계의 pg_restore 명령은 상태 1
와 함께 종료되며 다음 출력을 표시합니다.
pg_restore : [아카이버 (db)] TOC 처리 중 오류 : pg_restore : [아카이버 (db)] TOC 항목 5의 오류; 2615 2200 SCHEMA 공개 postgres pg_restore : [archiver (db)] 쿼리를 실행할 수 없습니다 : ERROR : 스키마 "public"이 이미 있습니다 명령은 다음과 같습니다 : CREATE SCHEMA public; 경고 : 복원시 오류가 무시되었습니다. 1
프로그래밍 방식으로이 명령을 실행하고 있으며 종료 상태를 사용하여 복원이 실패했는지 여부를 결정해야하므로이를 무시할 수 없습니다. 처음에이 문제가 데이터베이스를 공개 (기본 스키마)에 두었 기 때문인지 궁금했습니다. 나는 --create
데이터가 복원되기 전에 pg_restore에 의해 옵션 의 결과로 public이 생성 될 것이라고 추론했다. 다른 스키마에서 결과는 동일하고 오류 메시지는 동일합니다.
내가 뭔가 잘못하고 있습니까? 이 오류가 발생하는 이유는 무엇입니까?
답변
오류는 무해하지만 제거하려면이 복원을 두 개의 명령으로 나눌 필요가 있다고 생각합니다.
dropdb -U postgres mydb && \
pg_restore --create --dbname=postgres --username=postgres pg_backup.dump
--clean
pg_restore 의 옵션은별로 보이지 않지만 실제로는 사소한 문제가 발생합니다.
최대 9.1 버전
pg_restore 옵션 의 조합 --create
과 --clean
pg_restore 옵션은 이전 PG 버전 (9.1까지)에서 오류였습니다. 실제로는 (9.1 맨 페이지 인용) 사이에 모순이 있습니다.
–clean 데이터베이스 객체를 재 작성하기 전에 정리 (삭제)
과
–create 데이터베이스를 복원하기 전에 만듭니다.
새로운 데이터베이스 내부를 정리할 때 요점이 무엇입니까?
버전 9.2부터
이제 조합이 승인되었으며 의사는 다음과 같이 말합니다 (9.3 맨 페이지 인용).
–clean 데이터베이스 객체를 재 작성하기 전에 정리 (삭제)합니다. 대상 데이터베이스에 개체가없는 경우 이로 인해 무해한 오류 메시지가 생성 될 수 있습니다.
–create 데이터베이스를 복원하기 전에 만듭니다. –clean도 지정되면 연결하기 전에 대상 데이터베이스를 삭제하고 다시 작성하십시오.
이제 둘 다 함께 있으면 복원하는 동안 이런 종류의 순서로 이어집니다.
DROP DATABASE mydb;
...
CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
...
CREATE SCHEMA public;
...
CREATE TABLE...
DROP
각 개별 객체 DROP DATABASE
에 대해 처음 에는 a 만 없습니다 . 사용하지 않으면 --create
반대가됩니다.
어쨌든이 순서의 오류 제기 public
만들기 때문에 기존의 스키마 mydb
에서 template0
이미 수입 (정상이다, 그것은 템플릿 데이터베이스의 요점을).
이 사례가에 의해 자동으로 처리되지 않는 이유를 잘 모르겠습니다 pg_restore
. 관리자 가하지 말아야하더라도 관리자가 template0
의 목적 을 맞춤 설정 및 / 또는 변경 하기로 결정할 때 이로 인해 바람직하지 않은 부작용이 발생할 수 있습니다 public
.
답변
필자의 경우, 그 이유는 pg_restore
postgresql-contrib 버전 11.2에서 pg_dump
9.6으로 작성된 덤프 를 PostgreSQL 클러스터 9.6 으로 복원 했기 때문 입니다.
pg_restore
다시 9.6으로 다운 그레이드 한 후이 schema "public" already exists
오류는 사라졌으며 복원 프로세스는 이전과 동일하게 작동했습니다.