Postgres dump solo di parti di tabelle per un'istantanea dello sviluppo


95

In produzione il nostro database ha una dimensione di poche centinaia di gigabyte. Per lo sviluppo e il test, abbiamo bisogno di creare istantanee di questo database che siano funzionalmente equivalenti, ma che abbiano una dimensione di soli 10 o 20 GB.

La sfida è che i dati per le nostre entità aziendali sono sparsi su molte tabelle. Vogliamo creare una sorta di istantanea filtrata in modo che solo alcune delle entità siano incluse nel dump. In questo modo possiamo ottenere nuove istantanee ogni mese circa per lo sviluppo e il test.

Ad esempio, supponiamo di avere entità che hanno queste relazioni molti-a-molti:

  • L'azienda ha N divisioni
  • La divisione ha N dipendenti
  • Il dipendente ha N record di presenze

Ci sono forse 1000 aziende, 2500 divisioni, 175000 dipendenti e decine di milioni di record di presenze. Vogliamo un modo replicabile per estrarre, ad esempio, le prime 100 società e tutte le divisioni, i dipendenti e i record di presenze che lo compongono .

Attualmente utilizziamo pg_dump per lo schema, quindi eseguiamo pg_dump con --disable-triggers e --data-only per estrarre tutti i dati dalle tabelle più piccole. Non vogliamo dover scrivere script personalizzati per estrarre parte dei dati perché abbiamo un ciclo di sviluppo veloce e siamo preoccupati che gli script personalizzati sarebbero fragili e probabilmente non aggiornati.

Come possiamo farlo? Esistono strumenti di terze parti che possono aiutare a estrarre le partizioni logiche dal database? Come si chiamano questi strumenti?

Apprezzato anche qualsiasi consiglio generale!

Risposte:


108

Sulle tue tabelle più grandi puoi usare il comando COPY per estrarre i sottoinsiemi ...

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

COPY mytable FROM 'myfile.tsv'

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

Dovresti considerare di mantenere un set di dati di sviluppo piuttosto che estrarre solo un sottoinsieme della tua produzione. Nel caso in cui stiate scrivendo unit test, potreste utilizzare gli stessi dati richiesti per i test, cercando di raggiungere tutti i possibili casi d'uso.


1
Ho usato questa tecnica con grande successo per fare la stessa cosa dell'OP. Per le esecuzioni di prova ho caricato COPY (SELECT ..) TO .. ​​dati vincolati in un database "modello" e ho utilizzato CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Ovviamente ho ridotto i dati al minimo indispensabile in modo che l'istantanea del prodotto caricata e le operazioni di creazione del database di prova siano abbastanza veloci da non essere un ostacolo per il team.
Trey

5
C'è un modo per farlo funzionare se hai più tabelle unite di cui desideri istantanee? COPY FROM non supporta l'importazione di più tabelle.
mlissner

1
Sei l'uomo ... Questo mi rende le cose così facili, ma per uno scopo diverso. L'ho usato per spostare i dati dallo schema pubblico allo schema specifico dell'utente in un'app multi-tenant. Grazie !
Jeremy F.

5
Si noti che questo metodo non aggiorna le sequenze sulle tabelle copiate, quindi ulteriori inserimenti potrebbero violare i vincoli della chiave primaria.
user2859458

1
Ho dovuto usare anche io al \copyposto di COPY, perché quest'ultimo era solo per superutente. Fortunatamente tutto il resto ha funzionato perfettamente senza altre modifiche nella 9.1.
PJSCopeland

8

Non conosco alcun software che lo faccia già, ma posso pensare a 3 soluzioni alternative. Sfortunatamente, richiedono tutti una codifica personalizzata.

  1. Ricreare tutte le tabelle in uno schema separato, quindi copiare in quelle tabelle solo il sottoinsieme di dati che si desidera scaricare, utilizzarlo INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...e scaricarlo.

  2. Scrivi il tuo script per scaricare i dati come istruzioni SQL. Ho utilizzato questo approccio in passato e ci sono voluti solo qualcosa come 20-30 righe di PHP.

  3. Modificare pg_dump in modo che accetti una condizione insieme all'opzione -t quando si esegue il dump di una singola tabella.


6

12
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
talonmies

3
Non ha davvero senso qui. L'OP ha chiesto specificamente i nomi degli strumenti di terze parti che lo fanno. L'essenza della risposta è quindi solo: "C'è uno strumento di terze parti chiamato 'Jailer' che fa questo, a questo URL." Quel collegamento stesso fornisce tutte quelle informazioni essenziali; non c'è nient'altro da aggiungere. Se quel collegamento smette di funzionare, si può facilmente dedurre dall'URL che "il programma si chiama Jailer", quindi sarebbe ridondante aggiungerlo.
Paul Legato

2
Ovviamente il collegamento ora è interrotto e Google non presenta alternative.
owensmartin

1
Il collegamento attualmente funziona per me, e su Google per "jailer postgres" è stato trovato anche github.com/Wisser/Jailer .
Paul Legato

8
Forse se hai aggiunto una descrizione utile del howtuo utilizzo di questo strumento, potremmo essere in grado di capire come raggiunge l'obiettivo
Bryan Ash,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.