개발 스냅 샷에 대한 테이블의 일부만 Postgres 덤프


95

프로덕션 환경에서 데이터베이스의 크기는 수백 기가 바이트입니다. 개발 및 테스트를 위해 기능적으로는 동일하지만 크기가 10GB 또는 20GB에 불과한이 데이터베이스의 스냅 샷을 생성해야합니다.

문제는 비즈니스 엔터티의 데이터가 여러 테이블에 분산되어 있다는 것입니다. 일부 엔티티 만 덤프에 포함 되도록 일종의 필터링 된 스냅 샷을 생성하려고합니다 . 이렇게하면 개발 및 테스트를 위해 매월 새로운 스냅 샷을 얻을 수 있습니다.

예를 들어 다음과 같은 다 대다 관계를 가진 항목이 있다고 가정 해 보겠습니다.

  • 회사에는 N 개의 부서가 있습니다.
  • 부서에는 N 명의 직원이 있습니다.
  • 직원이 N 개의 출석 기록을 가지고 있습니다.

1000 개의 회사, 2500 개의 부서, 175000 명의 직원, 수천만 개의 출석 기록이있을 수 있습니다. 우리는 예를 들어 처음 100 개 회사 와 모든 구성 부서, 직원 및 출석 기록 을 가져 오는 복제 가능한 방법을 원합니다 .

현재 스키마에 pg_dump를 사용하고 --disable-triggers 및 --data-only와 함께 pg_dump를 실행하여 더 작은 테이블에서 모든 데이터를 가져옵니다. 우리는 빠른 개발주기를 가지고 있고 사용자 지정 스크립트가 깨지기 쉽고 오래 될 가능성이 있기 때문에 데이터의 일부를 추출하기 위해 사용자 지정 스크립트를 작성하고 싶지 않습니다.

어떻게 할 수 있습니까? 데이터베이스에서 논리 파티션을 가져 오는 데 도움이되는 타사 도구가 있습니까? 이러한 도구를 무엇이라고합니까?

일반적인 조언도 감사합니다!

답변:


108

더 큰 테이블에서 COPY 명령을 사용하여 하위 집합을 가져올 수 있습니다.

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

프로덕션의 하위 집합을 가져 오는 것보다 개발 데이터 집합을 유지하는 것을 고려해야합니다. 단위 테스트를 작성하는 경우 테스트에 필요한 것과 동일한 데이터를 사용하여 가능한 모든 사용 사례에 도달하려고 할 수 있습니다.


이 기술을 사용하여 OP와 동일한 작업을 수행했습니다. 테스트 실행을 위해 COPY (SELECT ..) TO .. ​​제한된 데이터를 "템플릿"데이터베이스에로드하고 CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX를 사용했습니다. 물론 제품 스냅 샷로드 및 테스트 db 생성 작업이 팀에 방해가되지 않을만큼 충분히 빠르도록 데이터를 최소한으로 정리했습니다.
Trey

5
스냅 샷을 원하는 조인 된 테이블이 여러 개있는 경우이 작업을 수행 할 수있는 방법이 있습니까? COPY FROM은 여러 테이블 가져 오기를 지원하지 않습니다.
mlissner 2013 년

1
당신은 남자예요. 이건 제게는 쉬운 일이지만 목적은 다릅니다. 다중 테넌트 앱에서 공용 스키마의 데이터를 사용자 별 스키마로 이동하는 데 사용했습니다. 감사 !
Jeremy F.

5
이 메서드는 복사 된 테이블의 시퀀스를 업데이트하지 않으므로 추가 삽입이 기본 키 제약 조건을 위반할 수 있습니다.
user2859458

1
후자는 수퍼 유저 전용이기 때문에 \copy대신 대신 사용해야 했습니다 COPY. 다행히 9.1에서는 다른 변경 사항없이 다른 모든 것이 완벽하게 작동했습니다.
PJSCopeland

8

이미이 작업을 수행하는 소프트웨어에 대해서는 잘 모르지만 3 가지 대안 솔루션을 생각할 수 있습니다. 안타깝게도 모두 사용자 지정 코딩이 필요합니다.

  1. 별도의 스키마에서 모든 테이블을 다시 만든 다음 덤프 할 데이터의 하위 집합 만 해당 테이블에 복사하여 사용 INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...하고 덤프합니다.

  2. 데이터를 SQL 문으로 덤프하기위한 스크립트를 작성하십시오. 나는 과거에이 접근 방식을 사용해 왔으며 20-30 줄의 PHP 만 사용했습니다.

  3. 단일 테이블을 덤프 할 때 -t 스위치와 함께 조건을 허용하도록 pg_dump를 수정하십시오.


6

http://jailer.sourceforge.net/ 이 수행합니다.


12
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다.
talonmies

3
여기서는 말이 안됩니다. OP는이를 수행하는 타사 도구의 이름을 구체적으로 요청했습니다. 따라서 대답의 본질은 "이 URL에이를 수행하는 'Jailer'라는 타사 도구가 있습니다."입니다. 링크 자체는 모든 필수 정보를 제공합니다. 추가 할 다른 항목이 없습니다. 해당 링크가 작동을 멈춘 경우 URL에서 "프로그램을 Jailer라고합니다"라고 쉽게 추론 할 수 있으므로 추가하는 것이 중복됩니다.
Paul Legato 2012

2
물론 링크가 끊어졌고 Google은 대안을 찾지 못했습니다.
owensmartin 2014

1
이 링크는 현재 나를 위해 작동하고 " jailer postgres"에 대한 인터넷 검색 도 github.com/Wisser/Jailer 로 나타났습니다 .
Paul Legato

8
당신이 도움이되는 설명을 추가 어쩌면 경우의 how당신이이 도구를 사용하여, 우리는 목표를 달성하는 방법을 이해 할 수있을 것
브라이언 애쉬
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.