Wie kann ich eine Teilmenge der Tabellendaten aus einer Produktdatenbank in meine lokale Testdatenbank exportieren?

10

Wir haben eine relativ große Produktions-Postgres-basierte Datenbank: ~ 20 GB. Die PostgreSQL-Datenbank wird auf Heroku gehostet.

Ich möchte eine kleine Teilmenge der Tabellendaten in meine lokale Datenbank kopieren, damit ich einige Tests mit ihnen durchführen kann, ohne an der Produktion arbeiten zu müssen.

Ich möchte keine Beispieldaten selbst generieren, sondern die Daten verwenden, die bereits in der Produktionsumgebung vorhanden sind.

~ 100 Zeilen aus jeder Tabelle in der Datenbank wären ausreichend. Gibt es eine einfache Möglichkeit, dies zu erreichen?

jottr
quelle
1
Warum sind 20 GB aus Neugier zu viel Speicherplatz? Ich habe 100 GB auf meiner Testdiskette auf meiner VM für nur DB-Arbeitsbereich zugewiesen.
Jcolebrand
Da ich meine externe Festplatte manchmal nicht bei mir habe, bietet meine SSD einfach nicht genügend Speicherplatz. Außerdem brauche ich wirklich nur Beispieldaten von meiner Datenbank und nicht die gesamte Datenbank.
Jottr
1
Fair genug, aber ich ermutige Sie trotzdem, kreativ zu werden. Stellen Sie sich eine SD-Karte vor, die in den SD-Steckplatz passt, da ich noch nie Probleme mit mehr Daten hatte :-), aber das ist scheiße: - \ Mein persönlicher Laptop hat nur noch die letzten 10 GB frei.
Jcolebrand

Antworten:

3

Ich habe dieses Tool nicht verwendet, aber Jailer verspricht, genau das zu tun

Tool zum Unter- und Durchsuchen von Datenbanken. Exportiert konsistente, referenziell intakte Zeilensätze aus relationalen Datenbanken (JDBC)

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

ein Pferd ohne Name
quelle
1

Jailer kann in dieser Situation helfen. Ich arbeite an derselben wie Ihrer (versuche ~ 100 Datensätze für jede Tabelle abzurufen) und habe folgende Schritte ausgeführt: - Suchen Sie die Stammentität (die mit fast Tabellen verknüpft ist) und rufen Sie eine Teilmenge der Datensätze von a ab root row (zB root is people, dann suche ich nach allen zugehörigen Datensätzen für people.id = 1 ...) - Beginnen Sie nach Abschluss von Schritt 1 erneut mit einer anderen Tabelle (der, für die Sie 100 Datensätze haben möchten ) und erhalten Sie die Teilmenge aus dem obigen Ergebnis.

Tulh
quelle
1

Eine andere Option ist etwas, auf das ich erst kürzlich gestoßen bin (zugegeben, ich muss sie noch verwenden, aber ich plane es bald) : rdbms-subsetter.

Es ist ein bisschen einfacher und leichter als Jailer, mit ein paar netten Funktionen / Vorteilen:

  • CLI so einfach an vorhandene Werkzeuge anzuschließen
  • Open Source
  • Folgt Fremdschlüsseln, um eine zusammenhängende Teilmenge von Daten abzurufen
    • Wenn Sie nicht gut definierte Fremdschlüssel haben, die Beziehungen können über eine JSON - Konfigurationsdatei zur Verfügung gestellt werden. In meinem Fall plane ich, diese Konfiguration aus Schema-Metadaten zu generieren, die an anderer Stelle gespeichert sind (danke, Rails: \).
  • Sie können auf eine bestimmte Zeile abzielen und alle zugehörigen Datensätze abrufen (z. B. hat ein bestimmter Kunde Probleme, sodass Sie alles abrufen können, um die Kontodaten lokal verfügbar zu machen).
  • Es kann entweder eine konstante Anzahl von Datensätzen pro Tabelle oder ein Logarithmus erforderlich sein, um mehr Daten aus größeren Tabellen zu erhalten, ohne über Bord zu gehen.

Erwähnenswert ist eine weitere Option für Heroku-Datenbanken, die ich häufig verwendet habe (da ich dort früher gearbeitet habe).

Heroku ist tatsächlich ziemlich schnell darin, eine neue Snapshot-Datenbank aufzurufen, da es zuerst die Write-Ahead-Protokolle zur Vorbereitung abruft, dann eine Verbindung zur primären Datenbank herstellt, um sie einzuholen, und dann aufhört, ihr zu folgen. Sie können diese "Gabeln" über Apps hinweg erstellen, um die Produktion nicht zu stark zu beeinträchtigen:

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

Anschließend können Sie Ihre App lokal starten, die auf diesen Snapshot verweist. Ich verwende dies häufig, um einen Trockenlauf von Daten- oder Schemamigrationen durchzuführen oder Kundenprobleme zu beheben.

Wenn Sie in diesem Befehl oben eine Datenbank haben, auf die mit DATABASE_URLon your-production-appzugegriffen werden kann, erhalten Sie eine DB, auf die mit PRODUCTION_SNAPSHOT_URL(sofern angegeben --as) in einer anderen App mit dem Namen zugegriffen werden kann some-other-app-to-own-forked-database.

Bo Jeanes
quelle
0

Um einen zufälligen Satz von Zeilen zu erhalten, können Sie LIMIT wie folgt verwenden :

SELECT * FROM my_table LIMIT 100

Dies ist die einfachste und wählt nur die 100 ersten Zeilen aus, auf die PostreSQL gestoßen ist. Es kann die zuletzt eingefügte 100 oder die erste 100 sein. Wenn Sie etwas wirklich Zufälliges benötigen, schauen Sie sich diese Stackoverflow-Antwort an .

Trygve Laugstøl
quelle
Vielen Dank, dass Sie versucht haben zu helfen, aber dies beantwortet meine Frage nicht.
Jottr
Ich weiß, wie ich meine Auswahl einschränken kann. Mein Problem ist, dass ich eine Möglichkeit brauche, die Datenbank von Heroku mit einer Teilmenge ihrer Daten zu klonen. Es ist keine Option, die gesamte Datenbank wie im Herokus-Handbuch beschrieben zu entleeren .
Jottr
1
@elementz - Gibt es einen Grund, warum Sie nicht einfach die Tabellen durchlaufen und COPY (SELECT ... LIMIT 100) TO 'filename' ...? Können Sie nicht in Heroku kopieren?
Rfusca
@rfusca - Ich wusste nicht, dass COPY TO existiert. Ich werde versuchen, mich zu melden.
Jottr
3
@rfusca: Die Verwendung eines einfachen LIMITwird nicht mit FK-Referenzen umgehen. Beispiel: 100 Zeilen aus der Auftragstabelle enthalten möglicherweise Kunden, die beim Exportieren von 100 Zeilen aus der Kundentabelle nicht vorhanden sind.
a_horse_with_no_name