pg_restore : [archiver (db)] 쿼리를 실행할 수 없습니다 : ERROR : 스키마 “public”이 이미 있습니다 pg_dump / pg_restore를 사용하고 있지만 pg_restore에서

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;

재현 단계 :

  1. 신선한 바닐라 우분투 14.04 배포판을 설치하십시오 ( 이 Vagrant 상자 와 함께 Vagrant를 사용하고 있습니다 ).
  2. PostgreSQL 9.3을 설치하고 Linux 사용자로부터 PostgreSQL 사용자 “postgres”로 로컬 연결을 허용하도록 구성하십시오.
  3. 테스트 데이터베이스를 작성하십시오. 나는 단지하고있다 :

    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
    
  4. 다음과 같이 데이터베이스 백업을 작성하십시오.

    PGPASSWORD = "postgres"pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
  5. mydb의 데이터 테이블에서 일부 행을 삭제하면 데이터가 성공적으로 복원되었는지 알 수 있습니다.

  6. 다음을 사용하여 데이터베이스를 복원하십시오.

    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

--cleanpg_restore 의 옵션은별로 보이지 않지만 실제로는 사소한 문제가 발생합니다.

최대 9.1 버전

pg_restore 옵션 의 조합 --create--cleanpg_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_restorepostgresql-contrib 버전 11.2에서 pg_dump9.6으로 작성된 덤프 를 PostgreSQL 클러스터 9.6 으로 복원 했기 때문 입니다.

pg_restore다시 9.6으로 다운 그레이드 한 후이 schema "public" already exists오류는 사라졌으며 복원 프로세스는 이전과 동일하게 작동했습니다.