90 votes

Postgres dump de seulement des parties de tables pour un instantané dev

Sur la production de notre base de données est à quelques centaines de gigaoctets. De développement et de test, nous avons besoin de créer des instantanés de cette base de données qui sont fonctionnellement équivalents, mais qui ne sont qu'à 10 ou 20 concerts de la taille.

Le défi est que les données de nos entités commerciales sont dispersés à travers de nombreux tableaux. Nous voulons créer une sorte de filtre de capture instantanée de sorte que seules certaines de ces entités sont inclus dans l'image. De cette façon, nous pouvons obtenir de nouvelles captures instantanées de chaque mois pour les dev et les tests.

Par exemple, disons que nous avons des entités qui ont ces plusieurs-à-plusieurs liens:

  • L'entreprise a N Divisions
  • La Division a N Employés
  • Employé-e a N Records de Fréquentation

Il y a peut-être 1000 entreprises, 2500 divisions, 175000 employés, et des dizaines de millions de records de fréquentation. Nous voulons un reproductibles façon de s'en sortir, disons, le premier de 100 entreprises et l'ensemble de ses divisions, les employés et les records de fréquentation.

Nous utilisons actuellement de pg_dump pour le schéma, puis exécutez pg_dump avec l'option --disable-triggers et --données uniquement à obtenir toutes les données des tableaux plus petits. Nous ne voulons pas avoir à écrire des scripts personnalisés pour tirer partie des données que nous avons un cycle de développement rapide et l'scripts personnalisés serait fragile et susceptible d'être obsolète.

Comment pouvons-nous faire cela? Existe-il des outils de tiers, qui peuvent aider à sortir des partitions logiques à partir de la base de données? Ce que ces outils sont-ils appelés?

Tout les conseils généraux ont également apprécié!

102voto

Ben Points 501

Sur vos plus grandes tables vous pouvez utiliser la commande COPY pour sortir des sous-ensembles...

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

COPY mytable FROM 'myfile.tsv'

http://www.postgresql.org/docs/8.4/interactive/sql-copy.html

Vous devriez envisager de maintenir un ensemble de données sur le développement plutôt que de simplement en tirant un sous-ensemble de votre production. Dans le cas que vous êtes à l'écriture de tests unitaires, vous pouvez utiliser les mêmes données qui est nécessaire pour les tests, en essayant de toucher tous les cas d'utilisation possibles.

7voto

Paul Legato Points 714

6voto

Aleksander Kmetec Points 1260

Je ne sais pas à propos de tout logiciel qui fait déjà cela, mais je pense que 3 solutions alternatives. Malheureusement, ils ont tous besoin certain codage personnalisé.

  1. Re-créer les tables dans un schéma distinct, puis les copier dans ces tableaux que le sous-ensemble de données que vous souhaitez vidage, à l'aide de INSERT INTO copy.tablename SELECT * FROM tablename WHERE ... et de vidage qui.

  2. Écrire votre propre script pour vider des données comme SQL. J'ai utilisé cette méthode dans le passé et il n'a fallu que quelque chose comme 20 à 30 lignes de PHP.

  3. Modifier pg_dump de sorte qu'il accepte une condition avec le commutateur-t lorsque le dumping d'une seule table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X