Come posso esportare un sottoinsieme di tabledata da un database di produzione nel mio database di test locale?


10

Abbiamo una produzione postgres relativamente grande basata su db: ~ 20GB. Il database PostgreSQL è ospitato su heroku.

Vorrei copiare un piccolo sottoinsieme dei dati della tabella nel mio database locale in modo da poter eseguire alcuni test su di essi senza dover lavorare sulla produzione.

Non voglio generare dati di esempio da solo, ma piuttosto utilizzare i dati che già esistono nell'ambiente di produzione.

~ 100 righe da ogni tabella nel database sarebbero sufficienti. C'è un modo semplice per raggiungere questo obiettivo?


1
Solo per curiosità, perché 20 GB di spazio su disco sono eccessivi? Ho allocato 100 GB sul mio disco di test sulla mia macchina virtuale solo per lo spazio di memoria virtuale di DB.
jcolebrand

Dato che a volte non porto il mio hd esterno con me, il mio ssd semplicemente non fornisce abbastanza spazio. Inoltre ho davvero bisogno solo dei dati di esempio dal mio db e non dell'intero db.
jottr,

1
Abbastanza giusto, ma ti incoraggio comunque a diventare creativo. Considera una scheda SD che si adatti allo slot SD, poiché non ho mai avuto problemi con avere più dati :-) ma questo fa schifo: - \ il mio laptop personale è fino all'ultimo 10 GB gratuito.
jcolebrand

Risposte:



1

Il carceriere può aiutare in questa situazione. Sto lavorando sullo stesso del tuo (cercando di ottenere ~ 100 record di ogni tabella) ed ecco i passaggi che ho fatto: - Trova l'entità radice (quella associata a quasi tabelle) e ottieni un sottoinsieme dei record di un riga di root (ad es. root è people, quindi cercherò tutti i record relativi a people.id = 1 ...) - Dopo aver completato il passaggio 1, ricominciare con un'altra tabella (quella in cui si desidera avere 100 record ) e ottenere il suo sottoinsieme dal risultato precedente.


1

Un'altra opzione è una cosa che ho da poco incontrato (concesso, io sono ancora usarlo, ma piano per presto): rdbms-subsetter.

È un po 'più semplice e leggero di Jailer, con alcune belle caratteristiche / vantaggi:

  • CLI così facile da collegare agli strumenti esistenti
  • Open source
  • Seguirà le chiavi esterne per recuperare un sottoinsieme coerente di dati
    • Se non si dispone di chiavi esterne ben definite, le relazioni possono essere fornite tramite un file di configurazione JSON. Nel mio caso, ho intenzione di generare questa configurazione dai metadati dello schema memorizzati altrove (grazie, Rails: \)
  • Puoi scegliere come target una riga specifica e ottenere tutti i record correlati (ad es. Un cliente specifico sta riscontrando problemi, in modo da poter ridurre tutto per rendere accessibili i dati di lavoro del suo account localmente)
  • Può richiedere un numero costante di record per tabella o un logaritmo per ottenere più dati da tabelle più grandi senza esagerare.

Vale la pena menzionare un'altra opzione per i database Heroku in particolare, che ho usato molto (come un tempo lavoravo lì).

Heroku è in realtà piuttosto veloce nel richiamare un nuovo DB di snapshot in quanto estrae prima i registri write-ahead per prepararsi, quindi si collega al DB primario per recuperarlo, quindi smette di seguirlo. Puoi creare queste "forcelle" tra le app per evitare di influenzare troppo la produzione:

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

Quindi, puoi avviare la tua app localmente puntata su quella istantanea. Lo uso spesso per eseguire una serie di migrazioni di dati o schemi o eseguire il debug di problemi con i clienti.

In quel comando sopra, se hai un DB accessibile con DATABASE_URLon your-production-app, finirai con un DB accessibile con PRODUCTION_SNAPSHOT_URL(se specificato --as) su un'altra app denominata some-other-app-to-own-forked-database.


0

Per ottenere un set casuale di righe puoi usare LIMIT in questo modo:

SELECT * FROM my_table LIMIT 100

Questo è il più semplice e sceglierà solo le prime 100 righe che PostreSQL ha incontrato. Potrebbero essere gli ultimi 100 inseriti o forse i primi 100. Se hai bisogno di qualcosa di veramente casuale, guarda questa risposta StackOverflow .


Grazie per aver cercato di aiutare, ma questo non risponde alla mia domanda.
jottr,

So limitare la mia selezione. Il mio problema è che ho bisogno di un modo per clonare il db da heroku con un sottoinsieme dei suoi dati; Scaricare l'intero db come descritto nel manuale di herokus non è un'opzione.
jottr,

1
@elementz - C'è un motivo per cui non puoi semplicemente passare in rassegna le tabelle e COPIA (SELEZIONA ... LIMIT 100) SU 'nome file' ...? Non puoi COPIARE A Heroku?
rfusca,

@rfusca - Non sapevo che esistesse COPY TO. Proverò a riferire.
jottr,

3
@rfusca: l'utilizzo di un semplice LIMITnon tratterà i riferimenti FK. Ad esempio: 100 righe dalla tabella degli ordini potrebbero contenere clienti che non sono presenti durante l'esportazione di 100 righe dalla tabella dei clienti.
a_horse_with_no_name il
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.