2009-11-16 2 views
68

En production, notre base de données a une taille de quelques centaines de gigaoctets. Pour le développement et les tests, nous devons créer des instantanés de cette base de données qui sont fonctionnellement équivalents, mais qui n'ont que 10 ou 20 Go de taille.Postgres vidage de parties de tables seulement pour un instantané de développement

Le défi réside dans le fait que les données de nos entités métier sont réparties sur plusieurs tables. Nous voulons créer une sorte d'instantané filtré afin que seulement certains des entités soient inclus dans la sauvegarde. De cette façon, nous pouvons obtenir de nouveaux snapshots tous les mois pour le développement et les tests.

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

  • Société a N Divisions
  • Division a N employés
  • employé a N présence enregistrements

Il y a peut-être 1000 entreprises, 2500 divisions, 175000 employés et des dizaines de millions d'enregistrements de présence. Nous voulons une façon réplicable de tirer, disons, les 100 premières entreprises et toutes ses divisions constituantes, les employés et les registres de présence.

Nous utilisons actuellement pg_dump pour le schéma, puis exécutez pg_dump avec --disable-triggers et --data-only pour extraire toutes les données des tables plus petites. Nous ne voulons pas avoir à écrire des scripts personnalisés pour extraire une partie des données car nous avons un cycle de développement rapide et nous craignons que les scripts personnalisés soient fragiles et susceptibles d'être périmés.

Comment pouvons-nous faire cela? Existe-t-il des outils tiers permettant de retirer des partitions logiques de la base de données? Comment s'appellent ces outils?

Un conseil général a également apprécié!

Répondre

69

Sur vos tables plus grandes que vous pouvez utiliser la commande Copier pour retirer des sous-ensembles ...

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

COPY mytable FROM 'myfile.tsv' 

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

Vous devriez envisager de maintenir un ensemble de données de développement plutôt que de simplement tirer un sous-ensemble de votre production. Dans le cas où vous écrivez des tests unitaires, vous pouvez utiliser les mêmes données que celles requises pour les tests, en essayant d'atteindre tous les cas d'utilisation possibles.

+0

J'ai utilisé cette technique avec beaucoup de succès pour faire la même chose que l'OP. Pour les tests, j'ai chargé COPY (SELECT ..) TO .. ​​données contraintes dans une base de données "template" et utilisé CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Bien sûr, j'ai réduit les données au strict minimum pour que l'instantané du produit soit chargé et que les opérations de création de tests de base de données soient suffisamment rapides pour ne pas constituer un obstacle pour l'équipe. – Trey

+1

Y at-il un moyen de rendre ce travail si vous avez plusieurs tables jointes dont vous voulez des instantanés? COPY FROM ne prend pas en charge l'importation de plusieurs tables. – mlissner

+1

Merci @Ben, c'est vraiment utile :) –

3

Je ne connais aucun logiciel qui le fait déjà, mais je peux penser à 3 solutions alternatives. Malheureusement, ils nécessitent tous un codage personnalisé.

  1. Recréez toutes les tables dans un schéma distinct, puis copiez dans ces tableaux que le sous-ensemble de données que vous souhaitez vider, en utilisant INSERT INTO copy.tablename SELECT * FROM tablename WHERE ... et vidage.

  2. Ecrivez votre propre script pour le vidage de données sous forme d'instructions SQL. J'ai utilisé cette approche dans le passé et cela n'a pris que quelque chose comme 20-30 lignes de PHP.

  3. Modifier pg_dump afin qu'il accepte une condition avec le commutateur -t lors du vidage d'une seule table.

2
+3

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – talonmies

+3

Cela n'a pas vraiment de sens ici. Le PO a demandé spécifiquement les noms des outils tiers qui font cela. L'essence de la réponse est donc seulement, "Il y a un outil tiers appelé" Jailer "qui fait cela, à cette URL." Ce lien lui-même fournit toutes ces informations essentielles; il n'y a rien d'autre à ajouter. Si ce lien cesse de fonctionner, il est facile de déduire de l'URL que "le programme s'appelle Jailer", il serait donc redondant d'ajouter cela. –

+0

Bien sûr, le lien est maintenant rompu, et Google ne propose aucune alternative. – owensmartin

Questions connexes