Comment comparer des données entre deux bases de données dans PostgreSQL?


93

Est-il possible de comparer deux bases de données de structure identique? Disons que j'ai deux bases de données DB1 et DB2 et que je veux vérifier s'il existe une différence de données entre elles.




postgrescompare.com/downloads compare les données maintenant aussi
Neil Anderson

Réponses:


85

Il existe plusieurs outils:

(notez que la plupart de ces outils ne peuvent comparer que la structure, mais pas les données)

Gratuits:

Commercial:


17
Seuls liquibase.org et Aqua Data Studio semblent comparer les données, d'autres comparent simplement le schéma.
Amir Ali Akbari

@AmirAliAkbari Liquibase prend en charge les différences de schéma
a_horse_with_no_name

2
Il semble que apgdiffcela ne supporte pas bien les tables d'héritage, et une exception se déclenche immédiatement lorsque j'essaie de l'utiliser. WbSchemaDifffonctionne très bien, surprise!
smartwjw

1
@AmirAliAkbari liquibase ne semble pas comparer les données lorsque les tables existent et ont la même structure.
aditsu quitte car SE est EVIL

14
-1. OP posait des questions sur la comparaison des données (enregistrements / lignes) et vous avez principalement répertorié les outils qui comparent la structure , qui OP a explicitement déclaré être identique entre les bases de données cibles, donc aucune raison de les comparer. Veuillez préciser lesquels font réellement la chose demandée.
Rarement 'Where's Monica' Needy

39

Essayez d'utiliser pg_dumpsur les deux bases de données et en différant les fichiers.


23
+1 pour simple et direct. Mais savons-nous avec certitude que pg_dump videra les données de bases de données identiques dans le même ordre si, par exemple, les tables ont été construites dans des ordres différents? (J'espère que l'ordre est basé sur des dépendances de contraintes, ne se souciant pas du tout du moment de la création, mais l'espoir ne s'adapte pas bien.)
Mike Sherrill 'Cat Recall'

10
vous pouvez utiliser -a -d et | Trier . Mais ces données peuvent ne pas être importables, mais elles conviendraient pour une vérification de base.
Cem Güler

Cela devrait être plus élevé dans les résultats, pour être honnête. On ne devrait pas avoir à compter sur un diff pour sauver la situation, donc ces solutions complètes et lourdes basées sur Java semblent exagérées. Cependant, il est logique de vérifier la cohérence de vos migrations et pg_dumpc'est bien pour cela. Si vous voyez des différences significatives avec pg_dumpvous essayez probablement de comparer des choses qui ne sont pas comparables. Au moins pour comparer les dbs PG.
sas

1
Malheureusement, cela ne fonctionne que sur des bases de données plus petites, car diff ne peut pas gérer certains gros vidages que j'ai. Sinon, c'est (toujours!) Vraiment la seule solution viable que j'ai trouvée. Bien que j'utilise psql -c '\x' -c 'SELECT... ORDER BY...'au lieu de pg_dump.
nyov

11

Une autre application gratuite (qui ne peut comparer que la structure, mais pas les données ):

DBeaver - vous pouvez sélectionner des bases de données, des tables, etc. à comparer les unes avec les autres


1
Pourriez-vous s'il vous plaît expliquer comment comparer les données de 2 bases de données avec DBeaver?
nicola

1
Autant que je sache, DBeaver ne permet que la comparaison de métadonnées, pas la comparaison de données.
nicola

Très bel outil. C'est vrai que ce n'est pas très intuitif de le faire au début. Vous devez d'abord sélectionner 2 objets ou plus pour voir cette option.
ihebiheb

8

J'ai évalué de nombreux outils et trouvé la solution suivante:

Comparaison de schéma :

Les plus intéressants étaient Liquibase, Persyas et PgCodeKeeper:

( problème ) Liquebase convertit:

 SET DEFAULT nextval('myschema.name_id_seq'::regclass)

dans

BIGSERIAL

Il a donc été refusé d'utiliser

( problème ) Persyas a bien fonctionné jusqu'à ce que j'aie ajouté un schéma supplémentaire et qu'il commence à lancer ce qui suit:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

J'ai donc trouvé PgCodeKeeper qu'il fonctionne parfaitement et qu'il est vivant (vous pouvez vérifier les versions). J'utilise la commande suivante:

./pgcodekeeper-cli.sh -E -I ./ignore.txt \
-s "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-t "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-o /result/schema-diff-$(date +'%m%d%y_%H%M%S').sql

Comparaison de données: j'ai essayé d'utiliser Liquebase et cela ne fonctionne tout simplement pas, vous pouvez voir les étapes que j'ai essayées dans ma question sans réponse sur la différence de données de deux bases de données avec Liquebase

J'ai donc trouvé un autre projet SQL Workbench / J. Cela fonctionne vraiment bien et génère des différences réelles dans SQL. J'utilise la commande suivante:

  java -jar /sqlworkbench.jar -command="'WbDataDiff -excludeTables=$EXCLUDE_TABLES \
-referenceConnection=$REFERENCE_CONNECTION \ 
-targetConnection=$TARGET_CONNECTION -referenceSchema=$1 \
-targetSchema=$1  -file=$DIFF_RESULT_FILE -singleFile=true \
-includeDelete=true -ignoreMissingTarget=true ;'"

Les deux outils prennent en charge la filtration d'objets. C'est vraiment pratique.

Migrations

Et enfin j'utilise Liquebase uniquement pour le suivi de la migration / version.


6

Je travaille sur un outil de comparaison complet pour Postgres. Ce sera gratuit en version bêta.

PostgresComparer

Au départ, il ne s'agit que d'une comparaison de schéma (DDL), mais nous allons probablement étendre également aux données. Je crois que c'est un outil dont beaucoup de magasins ont besoin pour quitter leur SGBDR actuel sans avoir à changer également le fonctionnement de leurs environnements de développement, de leurs opérations, etc.


1
Les données sont également très importantes. Le schéma seul ne suffit pas.
Houman

1
Salut @Houman. Désolé pour la réponse tardive. Vous avez raison, les données seront la prochaine étape. L'avantage de créer d'abord l'outil de comparaison de schémas est que tout le code de découverte des tables, etc. peut être partagé entre elles.
Neil Anderson

Je suis tombé sur cette réponse en créant moi-même un outil de comparaison de schéma simple. J'ai parcouru votre site Web et l'outil semble très prometteur. J'ai hâte d'essayer la version bêta
Avantika Saini

L'alpha est disponible dès maintenant @AvantikaSaini et si vous essayez, faites-moi savoir comment cela se passe afin que je puisse l'améliorer pour tout le monde.
Neil Anderson

Vous devez créer une version éducative de la licence. Le prix est trop élevé à des fins éducatives.
reinaldoluckman

2

Le meilleur outil que j'ai jamais vu https://pythonhosted.org/Pyrseas/

  1. Obtenir un vidage de la base de données A dbtoyaml ...

  2. Générer la migration de A => B yamltodb ... [fichier généré à l'étape 1]


Cela semble être le seul outil générant des scripts diff comparant une base de données et un fichier de vidage. Habituellement, d'autres outils comparent deux bases de données. Grâce à cette fonctionnalité, les développeurs peuvent travailler sur une base de données de développement locale, puis valider et distribuer leurs modifications par vcs sans créer de scripts de migration, en exécutant simplement dbtoyaml. Les développeurs des autres équipes peuvent mettre à jour leurs bases de données locales avec une seule commande (yamltodb). Ce workflow fonctionne un peu comme un projet de base de données Visual Studio.
andreav


0

J'ai créé un outil pour comparer 2 bases de données PostgreSQL en direct (pas de vidages), des données de table et des séquences. Assez tôt mais j'ai réalisé ce que je voulais, peut-être que cela peut vous aider aussi.

https://github.com/dmarkey/pgdatadiff


0

À mon avis, Dbforge est l'outil le plus puissant pour la compilation de données dans postgresql. C'est un produit de la société Devart que vous pouvez télécharger ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.