prodution 데이터베이스에서 로컬 테스트 데이터베이스로 tabledata의 서브 세트를 내보내려면 어떻게해야합니까?


10

우리는 비교적 큰 프로덕션 postgres 기반 db를 가지고 있습니다 : ~ 20GB PostgreSQL 데이터베이스는 heroku에서 호스팅됩니다.

테이블 데이터의 작은 하위 집합을 로컬 데이터베이스에 복사하여 프로덕션 작업을하지 않고도 테스트를 실행할 수 있습니다.

샘플 데이터를 직접 생성하지 않고 프로덕션 환경에 이미 존재하는 데이터를 사용합니다.

데이터베이스의 각 테이블에서 ~ 100 행이면 충분합니다. 이것을 달성하는 쉬운 방법이 있습니까?


1
궁금한 점이 있는데 왜 20GB의 디스크 공간이 너무 많은가? DB 스크래치 공간을 위해 VM의 테스트 디스크에 100GB를 할당했습니다.
jcolebrand

때로는 외부 HD를 가지고 다니지 않기 때문에 ssd는 충분한 공간을 제공하지 않습니다. 또한 실제로 전체 DB가 아닌 내 DB의 샘플 데이터 만 필요합니다.
jottr

1
충분하지만 공정하게 창의력을 발휘할 것을 권장합니다. 더 많은 데이터를 갖는 데 문제가 없었기 때문에 SD 슬롯에 맞는 SD 카드를 고려하십시오 :-)하지만 개인 노트북은 마지막 무료 10GB로 떨어졌습니다.
jcolebrand

답변:



1

이 상황에서 교도소가 도움을 줄 수 있습니다. 나는 당신과 같은 일을하고 있는데 (각 테이블의 ~ 100 개의 레코드를 얻으려고 노력 중) 여기에 내가 한 단계가 있습니다 :-루트 엔터티 (거의 테이블과 관련된 것)를 찾아서 루트 행 (예 : 루트는 people이고 people.id = 1 ...에 대한 모든 관련 레코드를 찾습니다.)-1 단계를 마친 후 다른 테이블 (100 개의 레코드를 갖고 싶은 테이블)로 다시 시작하십시오. ) 위의 결과에서 하위 집합을 가져옵니다.


1

또 다른 옵션은 내가 최근에 만난 것입니다 (허가, 아직 사용하지는 않지만 곧 계획) rdbms-subsetter.

Jailer보다 약간 간단하고 가벼우 며 몇 가지 멋진 기능 / 특권이 있습니다.

  • 기존 툴링에 쉽게 연결할 수있는 CLI
  • 오픈 소스
  • 외래 키를 따라 일관된 데이터 하위 집합 을 가져옵니다.
    • 잘 정의 된 외래 키가없는 경우 JSON 구성 파일을 통해 관계 제공 할 수 있습니다. 필자의 경우, 다른 곳에 저장된 스키마 메타 데이터에서이 구성을 생성 할 계획입니다 (감사합니다, Rails : \).
  • 특정 행을 타겟팅하고 모든 관련 레코드를 가져올 수 있습니다 (예 : 특정 고객에게 문제가 발생 했으므로 모든 것을 풀다운하여 계정 작업 데이터를 로컬로 액세스 할 수 있도록 할 수 있음)
  • 테이블 당 일정한 수의 레코드를 가져 오거나 로그를 사용하여 더 큰 테이블에서 더 많은 데이터를 얻지 않아도됩니다.

특히 Heroku 데이터베이스에 대한 다른 옵션을 언급 할 가치가 있습니다.

Heroku는 실제로 미리 쓰기 로그를 먼저 가져 와서 준비하기 위해 기본 DB에 연결 한 다음 따라가는 것을 멈추기 때문에 새로운 스냅 샷 DB를 가져 오는 데 실제로 빠릅니다. 프로덕션에 너무 많은 영향을 미치지 않도록 앱에서 이러한 "포크"를 만들 수 있습니다.

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

그런 다음 해당 스냅 샷을 가리키는 로컬로 앱을 부팅 할 수 있습니다. 나는 이것을 자주 사용하여 데이터 또는 스키마 마이그레이션을 건조하거나 고객 문제를 디버그합니다.

위의 명령에서 DATABASE_URLon으로 your-production-app액세스 할 수있는 DB가 PRODUCTION_SNAPSHOT_URL있으면 --as이름이 다른 다른 앱에서 ( 지정한 경우 ) DB에 액세스 할 수있게됩니다 some-other-app-to-own-forked-database.


0

임의의 행 집합을 얻으려면 다음 과 같이 LIMIT 를 사용할 수 있습니다 .

SELECT * FROM my_table LIMIT 100

이것은 가장 쉬운 방법이며 PostreSQL이 처음 발견 한 100 개의 행을 선택합니다. 마지막으로 삽입 된 100 개이거나 첫 번째 100 개일 수 있습니다. 정말로 무작위가 필요한 경우이 Stackoverflow 답변을보십시오 .


도와 주셔서 감사합니다. 그러나 이것은 내 질문에 대답하지 않습니다.
jottr

선택을 제한하는 방법을 알고 있습니다. 내 문제는 데이터의 하위 집합으로 heroku에서 db를 복제 할 수있는 방법이 필요하다는 것입니다. herokus 매뉴얼에 설명 된대로 전체 db를 덤프하는 것은 옵션이 아닙니다.
jottr

1
@elementz-테이블을 반복하고 'filename'에 복사 (SELECT ... LIMIT 100) 할 수없는 이유가 있습니까? 헤 로쿠에서는 복사 할 수 없습니까?
rfusca

@rfusca-나는 사본이 존재한다는 것을 몰랐다. 다시보고하려고합니다.
jottr

3
@rfusca : 간단한 사용은 LIMITFK 참조를 다루지 않습니다. 예를 들어, orders 테이블의 100 개 행은 customers 테이블에서 100 개의 행을 내보낼 때 존재하지 않는 고객을 포함 할 수 있습니다.
a_horse_with_no_name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.