Zrzut postgres tylko części tabel dla migawki dewelopera

95

Na produkcji nasza baza danych ma kilkaset gigabajtów. Na potrzeby programowania i testowania musimy tworzyć migawki tej bazy danych, które są funkcjonalnie równoważne, ale mają tylko 10 lub 20 gigabajtów.

Wyzwanie polega na tym, że dane naszych podmiotów gospodarczych są rozproszone w wielu tabelach. Chcemy stworzyć jakąś przefiltrowaną migawkę, tak aby tylko niektóre encje były uwzględnione w zrzucie. W ten sposób możemy co miesiąc otrzymywać nowe migawki do tworzenia i testowania.

Na przykład załóżmy, że mamy byty, które mają te relacje wiele do wielu:

  • Firma ma N dywizji
  • Oddział ma N pracowników
  • Pracownik ma N rekordów obecności

Istnieje może 1000 firm, 2500 oddziałów, 175000 pracowników i dziesiątki milionów rekordów obecności. Chcemy powtarzalnego sposobu pobierania, powiedzmy, pierwszych 100 firm i wszystkich ich oddziałów, pracowników i rejestrów obecności .

Obecnie używamy pg_dump jako schematu, a następnie uruchamiamy pg_dump z opcjami --disable-triggers i --data-only, aby uzyskać wszystkie dane z mniejszych tabel. Nie chcemy pisać niestandardowych skryptów, aby wyciągnąć część danych, ponieważ mamy szybki cykl rozwoju i obawiamy się, że niestandardowe skrypty byłyby kruche i prawdopodobnie byłyby nieaktualne.

Jak możemy to zrobić? Czy istnieją narzędzia innych firm, które mogą pomóc w wyciągnięciu partycji logicznych z bazy danych? Jak nazywają się te narzędzia?

Wszelkie ogólne rady również mile widziane!

Jonathan Peterson
źródło

Odpowiedzi:

108

Na większych stołach możesz użyć polecenia KOPIUJ, aby wyciągnąć podzbiory ...

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

COPY mytable FROM 'myfile.tsv'

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

Należy rozważyć utrzymywanie zestawu danych programistycznych, a nie tylko pobieranie podzbioru produkcji. W przypadku, gdy piszesz testy jednostkowe, możesz użyć tych samych danych, które są wymagane do testów, próbując trafić we wszystkie możliwe przypadki użycia.

Ben
źródło
1
Użyłem tej techniki z wielkim sukcesem, aby zrobić to samo, co OP. W przypadku testów załadowałem COPY (SELECT ..) TO .. ​​ograniczone dane do bazy danych „template” i użyłem CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Oczywiście rozszerzyłem dane do absolutnego minimum, aby załadowana migawka produktu i operacje testowania bazy danych były wystarczająco szybkie, aby nie stanowić przeszkody dla zespołu.
Trey
5
Czy jest jakiś sposób, aby to zadziałało, jeśli masz wiele połączonych tabel, z których chcesz uzyskać migawki? COPY FROM nie obsługuje importowania wielu tabel.
mlissner
1
Jesteś mężczyzną ... To sprawia, że ​​wszystko jest dla mnie takie łatwe, ale w innym celu. Użyłem go do przenoszenia danych ze schematu publicznego do schematu specyficznego dla użytkownika w aplikacji wielodostępnej. Dzięki !
Jeremy F.
5
Należy zauważyć, że ta metoda nie aktualizuje sekwencji w skopiowanych tabelach, więc dalsze wstawienia mogą naruszyć ograniczenia klucza podstawowego.
user2859458
1
Musiałem użyć \copyzamiast tego COPY, ponieważ ten ostatni był tylko superużytkownikiem. Na szczęście wszystko inne działało idealnie, bez żadnych innych zmian w 9.1.
PJSCopeland
8

Nie znam żadnego oprogramowania, które już to robi, ale przychodzą mi do głowy 3 alternatywne rozwiązania. Niestety, wszystkie wymagają niestandardowego kodowania.

  1. Utwórz ponownie wszystkie tabele w oddzielnym schemacie, a następnie skopiuj do tych tabel tylko podzbiór danych, które chcesz zrzucić, używając INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...i zrzuć to.

  2. Napisz własny skrypt do zrzucania danych jako instrukcji SQL. Używałem tego podejścia w przeszłości i wymagało to tylko około 20-30 linii PHP.

  3. Zmodyfikuj pg_dump tak, aby akceptował warunek wraz z przełącznikiem -t podczas zrzucania pojedynczej tabeli.

Aleksander Kmetec
źródło
5

http://jailer.sourceforge.net/ robi to.

Paul Legato
źródło
13
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
talonmies
3
To nie ma tu sensu. Program operacyjny poprosił konkretnie o nazwy narzędzi stron trzecich, które to robią. Istota odpowiedzi brzmi zatem tylko: „Pod tym adresem URL istnieje narzędzie innej firmy o nazwie„ Jailer ”, które to robi”. Sam ten link dostarcza wszystkich niezbędnych informacji; nie ma nic więcej do dodania. Jeśli to łącze przestanie działać, z adresu URL można łatwo wywnioskować, że „program nazywa się Jailer”, więc dodawanie tego byłoby zbędne.
Paul Legato
2
Oczywiście link jest teraz uszkodzony, a Google nie ma alternatywy.
owensmartin
1
Obecnie łącze działa dla mnie, a wyszukiwanie w Google dla „jailer postgres” pojawiło się również na github.com/Wisser/Jailer .
Paul Legato,
8
Może jeśli dodano pomocny opis howużyć tego narzędzia, możemy być w stanie zrozumieć, w jaki sposób osiąga cel
Bryan Ash