2013-10-29 3 views
0

postgresql 데이터베이스을 자동으로 가져와 새 데이터베이스에로드 할 수있는 스키마 스키마로 변환하는 자동화 된 방법이 있습니까? postgresql 데이터베이스를 다른 데이터베이스의 postgresql 스키마로 자동 변환하는 방법은 무엇입니까?

나는이 주위에 연주하고 내가하고 싶은 일을하는 두 가지 방법을 찾았지만 모두 내 솔직한 의견에 골치 :

  1. 같이, 일반 옵션을 사용하여 데이터베이스에 pg_dump의 수행 스크립트의 일부를 실행 한 다음 sed tomfoolery를 실행하여 해당 변경 사항을 적용합니다. 그러나 이것은 고통과 벌레를 간청합니다.

  2. 데이터베이스 스키마에서 모든 테이블, 시퀀스, 데이터 등을 psql을 통해 새 스키마 이름으로 전송 한 다음 해당 스키마/데이터 만 덤프/복원합니다.

나는 아마도 옵션 2와 함께 갈 것이지만 누구나 쉽게 할 수있는 방법이 있습니까? 우리가 물건을 처음부터 만들어 내었다면, 이것은 물론 쉬운 일은 아니지만이 방법으로 여러 시스템에서 기존 데이터베이스를 전환해야 할 것입니다.

편집 : 나중에 이것을 읽는 사람들을위한 설명. 나는 기본적으로 데이터베이스 'A'의 공용 스키마를 가져 와서 데이터베이스 'B'의 새로운 명명 스키마로 덤프/복원하려고합니다. 데이터베이스 'B'는 공개 스키마를 다른 용도로 사용하거나 사용하지 않을 수 있으므로 데이터베이스 'B'의 공개 스키마에서 잠재적 인 데이터를 변경하거나 변경하지 않고 전송해야합니다.

답변

0

당신은 당신이 dB A의 공공 스키마를 가지고 DB를 B에 명명 된 스키마에 넣어 원하는 가정하고 중첩 된 스키마를 가질 수 없기 때문에

다음은이 작업을 수행 할 수있는 간단한 방법이 (가 수도 있어요 모든 것이 특히 기능에 대해 정확하게 찾을 수 있도록 search_path에 관한 몇 가지 노력이 필요하지만, 아래의 정보를 참조하십시오.

  1. 를 DB의 A.에서 DB를 덤프 DB를 B

  2. 실행에서 다음 명령으로 복원 DB를 B :

    ALTER SCHEMA public RENAME TO foobar; 
    
  3. 당신은 먼저 foobar와의 관계와 함수를 검색 할 일부 사용자를 변경할 수 있습니다 :

    ALTER USER myuser SET search_path=foobar,public; 
    
  4. 을 당신은 당신이 할 수있는 기능이있는 경우 :

    ALTER FUNCTION foo(bar int) SET search_path=foobar; 
    

기본 사항을 다루는 것으로 생각합니다.

공용 스키마가 사용 중인지 확실하지 않은 경우 pg_class 및 pg_namespace를 참조하여 어떤 스키마가 관련되어 있는지 확인할 수 있습니다. 특정 테이블의 네임 스페이스를 검사하여 하나의 스키마 만 포함되도록 할 수 있습니다. 동일한 스키마 이름이 여러 스키마에서 발생하고이를 사용하여 검색하는 경우, 수동으로 간섭해야합니다.

+0

이제 재미있는 부분이 있습니다.데이터베이스를 공개 스키마를 사용하고 있거나 복원하지 않을 수도 있습니다. 따라서 실수로 다른 사람들이 데이터에 액세스하지 못하게 할 수 있다고 생각하기 때문에 복구 후 이름을 바꾸는 것이 매우 불안합니다. 이 점을 반영하기 위해 질문을 업데이트했습니다. 감사. –

+0

이 문제를 해결하는 방법에 대한 정보를 추가했습니다. 그러나 어떤 시점에서 수동 개입을 요구해야하는 경우를 설명해야합니다. –

관련 문제