2017-05-10 16 views
0

데이터베이스를 만든 후 적절한 오류 처리 기능을 사용하여 스크립트를 통해 백업 파일을 사용하여 검정색 데이터베이스에서 postgresql 8.4의 데이터베이스를 복원합니다. 오류가 발생하면 스크립트는 전체 프로세스를 중단하고 프로세스를 실패한 것으로 표시합니다. 데이터베이스 동안 오류가 생성됩니다 다음 복원Postgresql 8.4 오류 '언어'를 해결하는 방법 plpgsql "already exists '?

pg_restore: connecting to database for restore 
pg_restore: creating SCHEMA public 
pg_restore: creating COMMENT SCHEMA public 
pg_restore: creating PROCEDURAL LANGUAGE plpgsql 
pg_restore: [archiver (db)] Error while PROCESSING TOC: 
pg_restore: [archiver (db)] Error from TOC entry 302; 2612 16386 PROCEDURAL LANGUAGE plpgsql postgres 
pg_restore: [archiver (db)] could not execute query: ERROR: language "plpgsql" already exists 
    Command was: 
CREATE PROCEDURAL LANGUAGE plpgsql; 
pg_restore: setting owner and privileges for SCHEMA public 
pg_restore: setting owner and privileges for COMMENT SCHEMA public 
pg_restore: setting owner and privileges for ACL public 
pg_restore: setting owner and privileges for PROCEDURAL LANGUAGE plpgsql 
WARNING: errors ignored on restore: 1 
Exit code : 1 

나는이 오류의 PostgreSQL 8.x에서 무시되어야한다는 것을 알고,하지만 난 스크립트를 통해이를 실행하고 있기 때문에이 문제가 필요가 즉 PostgreSQL을의 종료 코드를 해결하기 위해 0이어야합니다. 그렇지 않으면 전체 프로세스가 완료되지 않습니다.

어떻게하면 좋을까요?

+0

실제로 업그레이드하고 있습니다. 업그레이드가 실패 할 경우를 대비하여 실제로 업그레이드해야합니다. –

답변

1

(후자는, 단지의 경우 덤프가 CREATE 문을 포함하지 않았다), 내가 발견 다음과 같은 기본적이고 간단한 솔루션입니다. 'CREATE DATABASE'명령을 사용하여 작성된 데이터베이스는 기본적으로 'template1'이라는 표준 시스템 데이터베이스를 사용합니다. 대신 'template0'을 사용하십시오. document에 명시된 바와 같이 :

대신 template1를의 template0 복사 DATABASE를 만들 지시하여 template1를에있는 사이트 로컬 추가 전혀 포함하지 않는 "처녀"사용자 데이터베이스를 생성 할 수 있습니다. 이것은 pg_dump 덤프를 복구 할 때 특히 편리합니다. 나중에 덤프 된 template1에 추가되었을 수있는 객체와의 충돌없이 덤프 된 데이터베이스의 올바른 내용을 다시 만들도록 덤프 스크립트를 처녀 데이터베이스에 복원해야합니다.

0

우아한 해결 방법이있을 것입니다. 모든 사람들은 메시지를 무시해야한다고 말합니다.

더러운 해결 방법 : pg_restore 및 이후 CREATE OR REPLACE LANGUAGE 전에 DROP LANGUAGE ..를 넣고 몇 시간 동안이 문제에 대한 작업 후