Jak mogę wyeksportować podzbiór tabledata z bazy danych produkcji do mojej lokalnej testowej bazy danych?

10

Mamy relatywnie dużą bazę danych opartą na postgresie: ~ 20 GB. Baza danych PostgreSQL jest hostowana na heroku.

Chciałbym skopiować mały podzbiór danych tabeli do mojej lokalnej bazy danych, aby móc na nich przeprowadzać niektóre testy bez konieczności pracy nad produkcją.

Nie chcę sam generować przykładowych danych, ale raczej korzystam z danych, które już istnieją w środowisku produkcyjnym.

Wystarczy około 100 wierszy z każdej tabeli w bazie danych. Czy istnieje prosty sposób na osiągnięcie tego?

jottr
źródło
1
Z ciekawości, dlaczego 20 GB jest za dużo miejsca na dysku? Mam 100 GB przydzielone na moim dysku testowym na mojej maszynie wirtualnej tylko na miejsce na DB.
jcolebrand
Ponieważ czasami nie noszę zewnętrznego dysku twardego, mój ssd po prostu nie zapewnia wystarczającej ilości miejsca. Ponadto naprawdę potrzebuję tylko przykładowych danych z mojej bazy danych, a nie całej bazy danych.
jottr
1
W porządku, ale mimo wszystko zachęcam do kreatywności. Rozważ kartę SD, która zmieści się w gnieździe SD, ponieważ nigdy nie miałem problemu z posiadaniem większej ilości danych :-), ale to jest do bani: - \ Mój osobisty laptop ma ostatnie wolne 10 GB.
jcolebrand

Odpowiedzi:

3

Nie korzystałem z tego narzędzia, ale Jailer obiecuje to zrobić

Narzędzie do tworzenia i przeglądania baz danych. Eksportuje spójne, referencyjnie nienaruszone zestawy wierszy z relacyjnych baz danych (JDBC)

http://sourceforge.net/projects/jailer/

koń bez imienia
źródło
1

Jailer może w tej sytuacji pomóc. Pracuję nad tym samym, co twój (próbuję uzyskać ~ 100 rekordów z każdej tabeli), a oto kroki, które zrobiłem: - Znajdź element główny (ten, który jest powiązany z prawie tabelami) i uzyskaj podzbiór rekordów wiersz główny (np. root to ludzie, wtedy sprawdzę wszystkie powiązane rekordy dla people.id = 1 ...) - Po zakończeniu kroku 1 zacznij od innej tabeli (tej, w której chciałbyś mieć 100 rekordów ) i pobierz jego podzbiór z powyższego wyniku.

tulh
źródło
1

Inną opcją jest coś, co ja właśnie niedawno natknąć (przyznane, jestem jeszcze go używać, ale plan wkrótce) rdbms-subsetter.

Jest trochę prostszy i lżejszy niż Jailer, z kilkoma fajnymi funkcjami / dodatkami:

  • Interfejs CLI jest tak łatwy do podłączenia do istniejących narzędzi
  • Otwarte źródło
  • Podąży za kluczami obcymi, aby pobrać spójny podzbiór danych
    • Jeśli nie masz dobrze zdefiniowanych kluczy obcych, relacje można zapewnić za pomocą pliku konfiguracyjnego JSON. W moim przypadku planuję wygenerować tę konfigurację na podstawie metadanych schematu przechowywanych w innym miejscu (dzięki, Rails: \)
  • Możesz kierować reklamy na konkretny wiersz i uzyskać wszystkie powiązane rekordy (np. Konkretny klient ma problemy, więc możesz wyciągnąć wszystko, aby dane jego konta były dostępne lokalnie)
  • Może to zająć stałą liczbę rekordów na tabelę lub logarytm, aby uzyskać więcej danych z większych tabel bez przesadzania.

Warto wspomnieć o innej opcji dla baz danych Heroku, z której często korzystałem (ponieważ tam pracowałem).

Heroku jest naprawdę dość szybki w tworzeniu nowej migawkowej bazy danych, ponieważ najpierw przygotowuje dzienniki z wyprzedzeniem zapisu, a następnie łączy się z podstawową bazą danych, aby nadrobić zaległości, a następnie przestaje ją śledzić. Możesz tworzyć te „widelce” w różnych aplikacjach, aby uniknąć nadmiernego wpływu na produkcję:

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

Następnie możesz uruchomić aplikację lokalnie wskazaną na tej migawce. Używam tego często do suchego uruchamiania migracji danych lub schematów lub debugowania problemów klientów.

W powyższym poleceniu, jeśli masz dostęp do DB z DATABASE_URLwłączonym your-production-app, skończysz z DB dostępnym z PRODUCTION_SNAPSHOT_URL(jeśli określono --as) w innej aplikacji o nazwie some-other-app-to-own-forked-database.

Bo Jeanes
źródło
0

Aby uzyskać losowy zestaw wierszy, możesz użyć LIMIT w następujący sposób:

SELECT * FROM my_table LIMIT 100

Jest to najłatwiejsze i po prostu wybierze 100 pierwszych wierszy, na które natknął się PostreSQL. Może to być 100 ostatnio wstawionych lub być może 100 pierwszych. Jeśli potrzebujesz czegoś naprawdę losowego, spójrz na tę odpowiedź Stackoverflow .

Trygve Laugstøl
źródło
Dziękuję za próbę pomocy, ale to nie odpowiada na moje pytanie.
jottr
Wiem, jak ograniczyć mój wybór. Mój problem polega na tym, że potrzebuję jakiegoś sposobu sklonowania bazy danych z heroku z podzbiorem jej danych; Zrzucanie całej bazy danych zgodnie z opisem w instrukcji Herokus nie jest opcją.
jottr
1
@elementz - Czy istnieje powód, dla którego nie można po prostu zapętlić tabel i KOPIOWAĆ (WYBIERZ ... LIMIT 100) NA „nazwę pliku” ...? Czy nie możesz KOPIOWAĆ w Heroku?
rfusca
@rfusca - Nie wiedziałem, że istnieje. Spróbuję złożyć raport.
jottr
3
@rfusca: użycie prostego LIMITnie poradzi sobie z referencjami FK. Na przykład: 100 wierszy z tabeli zamówień może zawierać klientów, którzy nie są obecni podczas eksportowania 100 wierszy z tabeli klientów.
a_horse_w_no_name