En production, notre base de données fait 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 ne font que 10 ou 20 Go.
Le défi est que les données de nos entités commerciales sont dispersées dans de nombreux tableaux. Nous voulons créer une sorte d'instantané filtré afin que seuls certains des entités soient incluses dans le vidage. De cette façon, nous pouvons obtenir de nouveaux instantanés tous les mois environ pour le développement et les tests.
Par exemple, disons que nous avons des entités qui ont ces relations plusieurs-à-plusieurs:
- L'entreprise compte N divisions
- La division compte N employés
- L'employé a N enregistrements de présence
Il y a peut-être 1 000 entreprises, 2 500 divisions, 175 000 employés et des dizaines de millions de fiches de présence. Nous voulons un moyen reproductible d'extraire, par exemple, les 100 premières entreprises et toutes ses divisions, employés et registres de présence. .
Nous utilisons actuellement pg_dump pour le schéma, puis exécutons pg_dump avec --disable-triggers et --data-only pour extraire toutes les données des petites tables. 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 craignons que les scripts personnalisés soient fragiles et susceptibles d'être obsolètes.
Comment peut-on le faire? Existe-t-il des outils tiers qui peuvent aider à extraire des partitions logiques de la base de données? Comment s'appellent ces outils?
Tout conseil général également apprécié!
la source
\copy
place deCOPY
aussi, car ce dernier était uniquement super-utilisateur. Heureusement, tout le reste a parfaitement fonctionné sans autres changements dans la version 9.1.Je ne connais aucun logiciel qui le fasse déjà, mais je peux penser à 3 solutions alternatives. Malheureusement, ils nécessitent tous un codage personnalisé.
Recréez toutes les tables dans un schéma séparé, puis copiez dans ces tables uniquement le sous-ensemble de données que vous souhaitez vider, utiliser
INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...
et vider cela.Écrivez votre propre script pour vider les données sous forme d'instructions SQL. J'ai utilisé cette approche dans le passé et cela n'a pris que 20 à 30 lignes de PHP.
Modifiez pg_dump pour qu'il accepte une condition avec l'option -t lors du vidage d'une seule table.
la source
http://jailer.sourceforge.net/ le fait.
la source
how
votre utilisation de cet outil, nous pourrions peut-être comprendre comment il atteint l'objectif