2011-03-19 6 views
6

나는 약 85 개 이상의 테이블을 가진 postgresql db를 가지고 있습니다. 복사 모드에서 pg_dump (php-pgadmin을 통해)을 정기적으로 사용하여 백업을 만들고 백업 파일의 크기는 거의 10-12 MB입니다. 지금 내가 직면하고있는 문제는 데이터베이스를 복원하려고 할 때마다 외래 키 제약 문제가 발생한다는 것입니다. 시나리오는 다음과 같습니다.외래 키 제약없이 백업에서 PostgreSQL db를 복원하십시오.

두 테이블 : 1) users 및 2) zones입니다. users 테이블에 zone의 ID를 저장하여 사용자 영역을 식별하고이를 외부 키로 설정했습니다.

db 덤프를 사용하면 zones 테이블의 항목은 users 테이블의 항목 다음에옵니다. 제 생각 엔 테이블 이름의 첫 글자가 u이고, 뒤에 z이 오기 때문에 데이터베이스를 복원 할 때 외래 키 제약 조건 문제가 발생하고 실행이 중지됩니다. 동일한 문제가 db 구조를 복원하려고 할 때 zones 테이블이 zones의 구조가 덤프 파일의 users 이후에 오는 관계로 데이터베이스에 존재하지 않는다고합니다.

어떤 해결책이 있습니까? 가능한 다른 백업 방법이 있습니까?

+0

사실 나는 phppgadmin 인터페이스 자체를 통해 phppgadmin에서 phpgadmin 인터페이스를 통해 덤프를 전송합니다 ..... –

답변

6

pg_dump의 바이너리 덤프 대신 SQL 덤프가 발생하는 것 같습니다. 그렇게하면 데이터를 다시로드하기 위해 INSERT를 한 번에 맨 뒤에 스키마 (FK 포함)가있는 SQL을 대량으로 얻을 수 있습니다. pg_dump의 바이너리 덤프가 도움이 될 것입니다. pg_dump 인 PhpPgAdmin에 약간의 추가 구성이 필요합니다. 그런 다음 바이너리 덤프를 pg_restorepg_restore으로 보내면 참조 무결성 문제를 피하기 위해 모든 항목을 올바른 순서로 다시 작성합니다 (또는 정확히 말하면 pg_restore은 모든 데이터를 복원 한 다음 제한 조건을 추가합니다).

PhpPgAdmin seems to want to work with plain SQL dumpspg_restore 대신. 나는 이것을 믿기가 어렵다고 생각하지만, 문서에서 pg_restore을 호출하는 것에 대해서는 아무것도 찾을 수 없습니다. 이것이 사실이라면 SQL 덤프를 수작업으로 편집하고 모든 FK를 끝까지 이동해야 할 것입니다.

또한 SQL 덤프 상단에 SET CONSTRAINTS ALL DEFERRED;을 추가 할 수 있습니다. 트랜잭션 종료까지 제약 조건 검사를 지연해야하며 전체 INSERT 블록이 트랜잭션 내에 포함되도록해야합니다.

PhpPgAdmin 정말 pg_restore를 호출 할 수 없습니다 경우에 당신이 떨어져 당신이 당신의 백업 절차에 필요한 통제를 가질 수 있도록 손으로 pg_dumppg_restore를 사용하여 더 낫다. 죄송 합니다만 FK로 데이터베이스 백업을 처리 할 수없는 데이터베이스 관리 도구는 쓸모없는 것보다 나쁩니다. 잘하면 PhpPgAdmin 주위에 자신의 방법을 아는 사람이 나타나서 pg_restore을 PhpPgAdmin과 함께 사용하는 방법을 알려주세요.

+0

예 pg_restore 내가 원했던 .. 지금은 데이터 마이 그 레이션이 잘 작동하지만 새로운 문제가 지금은 .... 내가 DB 구조를 가져올 때, 그리고 사용자 pg_restore 새 데이터베이스를 복원하는 "시퀀스 X와 같은 오류가 이미 존재합니다 "올라와 .. 내가 문제가 자동 증분 필드의 데이터 유형이 db 덤프에 bigserial다는 것을 발견했다. 그래서 postgres는 열 이름을 기반으로 순서를 자동으로 생성하지만 .. create table 문 아래에 덤프가있다. sequence 문은 postgres에 의해 자동 생성 된 것과 같은 이름을 가진 시퀀스를 생성하며 이것은 오류를 던집니다. –

+1

@Midhun : 빈 데이터베이스로 복원해야합니다. 그러면'pg_restore'가 모든 것을 설정합니다. 또는 스키마가 이미 존재하지만 데이터가 없다면'pg_restore'에 데이터를 복원하라는 명령을 내릴 수 있습니다. 스키마가 이미 존재하고 복원이 스키마를 복원하려고하는 것처럼 들립니다. –

1

(PHP-pgadmin을 통해) pgdump

당신이 PhpPgAdmin 백업을 만들 pg_dump의를 사용하고 확신을 사용하고 계십니까? pg_dump가 만든 덤프를 본 적이 없으며 덤프를 복원 할 때 외래 키에 문제가 있습니다.

PhpPgAdmin은 PHP 스크립트 일 뿐이며 대부분의 경우 pg_dump와 같은 프로그램을 시작할 수있는 권한이 없습니다.

+0

나는 PhpPgAdmin이 백업을 만들기 위해 pgdump를 사용한다고 믿었습니다 ... 내가 잘못 생각합니까 ??? [link] http://en.wikipedia.org/wiki/PhpPgAdmin [link]는 pg_dump ..를 사용할 수 있다고 말합니다. 그러나 덤프가 완료되면 인터페이스가 pg_dump를 사용하는지 확실하지 않습니다 ... 누군가 확인해 주시겠습니까? –

0

전 fk 생성을 제거하고 스크립트의 끝에 추가합니다.

3

누군가에게 도움이된다면 : 나중에 덤프 된 데이터를 참조하는 일부 INSERT가 있었고, 바이너리 형식 인 경우 독립적이었으며 일반적인 SQL 쿼리가있었습니다.

내가 한 것 : schemaspy이라는 스크립트를 사용했습니다. 기본 ER 모델의 정말 유용한 HTML 다이어그램과 같은 다른 기능들 - 두 개의 매우 유용한 목록을 생성하는 스크립트 : "삽입 순서"(모든 테이블은 기존 제한 사항 및 종속성을 고려하여 삽입을 수행하기위한 최적의 순서로 나열됩니다) 및 "삭제 순서"(DROP 테이블에 매우 유용합니다).

샘플을 보려면 http://schemaspy.sourceforge.net/sample/을 확인하십시오. 특히 위에서 언급 한 두 가지 샘플 목록 (직접 링크 게시를 시도했지만 스팸 방지 메커니즘을 사용하면 단 2 개의 링크 만 게시 할 수 있음)이 있습니다.

+0

이들은 샘플 목록입니다 !!! http://schemaspy.sourceforge.net/sample/insertionOrder.txt http://schemaspy.sourceforge.net/sample/deletionOrder.txt – jquinter