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.