2014-10-22 3 views
1

PostgreSQL 덤프/복원에 문제가 있습니다. 우리는 PostgreSQL 8.4로 운영되는 제품 appliaction을 보유하고 있습니다. 테스트 환경에서 데이터베이스에 일부 값을 생성 한 다음이 데이터 덩어리를 프로덕션 환경으로 가져와야합니다. 데이터는 애플리케이션에 의해 생성되며, 생산에 들어가기 전에 테스트가 필요하기 때문에이 접근법을 사용해야합니다.새 기본 키 값으로 PostgreSQL 덤프 복원

지금은 환경을 설명하는 것이, 여기에 내 문제입니다 : 테스트 데이터베이스에서

, 나는 프로덕션 데이터베이스로 이동하는 데 필요한 데이터만을 남겨 없습니다. 데이터는 트리와 같이 여러 수준의 외래 키와 연결된 여러 테이블에 분산되어 있습니다. 그런 다음 pg_dump를 사용하여 원하는 테이블을 이진 형식으로 내 보냅니다.

가져 오기를 시도하면 데이터베이스가 새로운 기본 키 값을 사용하여 루트 테이블 항목을 올바르게 가져 오지만 다른 테이블의 데이터는 가져 오지 않습니다. 문제는 자식 테이블의 외래 키가 더 이상 새 기본 키를 인식하지 않는다고 생각합니다.

트리에서 영향을받는 모든 테이블의 모든 기본 키 값을 업데이트하여 직렬 (자동 증가) 값을 자동으로 수정하고 이러한 새 기본 키 값에 따라 모든 외래 키를 업데이트하는 방법이 있습니까? ?

두 데이터베이스에 연결되어있는 동안 프로그래밍 언어를 사용하여이 작업을 수행하는 방법을 알고 있지만 고객 제작 서버에 직접 액세스 할 수 없어 매우 만족 스럽습니다.

미리 감사드립니다.

답변

2

저에게 복잡한 마이그레이션 문제가있는 것 같습니다. 삽입을 사용하여 PL/pgSQL 마이그레이션 스크립트를 생성하고 리턴을 사용하여 연재물을 얻고 트리의 다른 테이블에 대한 외래 키로 사용할 수 있습니다. 나는 당신의 나무의 구조를 모른다. 그러나 어떤 경우에는 복잡성이나 성능상의 이유 때문에 미리 배열 값을 배열로 읽는 것이 필요할 수도있다.

다른 접근법은 생산 시퀀스 값을 검사하고 가까운 미래에 사용되지 않을 시퀀스 값을 추정하는 것입니다. 테스트 환경에서 테스트 데이터를 작성하여 생산 순서 값과 충돌하지 않는 일련의 값을 갖도록하십시오. 그런 다음 해당 데이터를 prod 데이터베이스에로드하고 테스트 환경 값이 사용되지 않도록 prod 환경의 시퀀스 값을 조정합니다. ID 시퀀스에 간격이 생기므로 다른 프로세스와 같은 시퀀스 값이 시퀀스 값에 의존하는지 검사해야합니다.

+0

신속한 답변을 보내 주셔서 감사합니다. 다양한 레코드의 ID가 청구서, 오퍼 등에서 고객에 의해 사용되기 때문에 갭이 문제가 될 수 있습니다.하지만 PL/pgSQL 언어를 살펴 보겠습니다. 나는 그것에 익숙하지 않지만, 내가 할 수있는 것을 본다. – j0hny

+0

테스트 데이터가 순서 값을 차지하므로 어쨌든 갭을 준비하십시오. 물론 테스트 데이터를 삭제하고 시퀀스를 수정할 수는 있지만 테스트 기간에 사용자가 프로덕션 환경을 사용하면 데이터베이스가 엉망이되어 작업을 수행 할 수 없습니다. 데이터베이스 도구는 데이터를 내보내는 시작점 역할을 할 수있는 삽입 문으로 데이터를 내보낼 수 있습니다. ID 값을 가져 오려면 INSERT INTO 테이블 (cols) VALUES (vals) RETURNING idcolumn을 사용할 수 있습니다. 하위 선택과 함께 INSERT를 사용할 수도 있습니다. INSERT WITH은 또한 편리한 도구입니다. 행운을 빈다 :) – Peter

+0

제안에 감사드립니다. 나는 실제로 다른 가능성을 생각해 냈습니다 - 작은 간격을 만들 수는 있지만 더 많은 제어권을 가졌습니다 - 영향을받는 모든 테이블에서 프로덕션 환경의 시퀀스를 삽입하려는 행 수만큼 증가시키는 스크립트를 만들었습니다. 비축. 그런 다음 프로덕션 "gap"의 시작 부분에서 시작 시퀀스를 삽입 할 데이터를 생성 한 다음 간단히 삽입합니다 .-). 이 솔루션은 효과가 있으며 생성 된 간격은 최소화됩니다. 아이디어가 나왔기 때문에 당신의 대답을 받아 들였습니다. 감사. – j0hny