¿Cómo comparar datos entre dos bases de datos en PostgreSQL?


93

¿Es posible comparar dos bases de datos con estructura idéntica? Digamos que tengo dos bases de datos DB1 y DB2 y quiero verificar si hay una diferencia en los datos entre ellas.



dbForge Data Compare para PostgreSQL resuelve estos problemas.
Devart

Respuestas:


85

Hay varias herramientas disponibles:

(tenga en cuenta que la mayoría de estas herramientas solo pueden comparar la estructura, pero no los datos)

Gratis:

Comercial:


17
Solo liquibase.org y Aqua Data Studio parecen comparar datos, otros solo comparan el esquema.
Amir Ali Akbari

@AmirAliAkbari Liquibase hace de soporte diff esquema
a_horse_with_no_name

2
Parece que apgdiffno admite bien las tablas heredadas, y la excepción se lanza inmediatamente cuando intento usarlo. WbSchemaDifffunciona muy bien, sorpresa!
smartwjw

1
@AmirAliAkbari liquibase no parece comparar datos cuando las tablas existen y tienen la misma estructura.
aditsu renunció porque SE es MALO

14
-1. OP estaba preguntando sobre la comparación de datos (registros / filas) y en su mayoría ha enumerado herramientas que comparan la estructura , que OP declaró explícitamente que era idéntica entre las bases de datos de destino, ergo no hay razón para compararlas. Aclare cuáles realmente hacen lo solicitado.
Rara vez se necesita '¿Dónde está Monica?

39

Intente usar pg_dumpambas bases de datos y diferenciar los archivos.


23
+1 para simple y directo. Pero, ¿sabemos con certeza que pg_dump volcará datos de bases de datos idénticas en el mismo orden si, por ejemplo, las tablas se crearon en diferentes órdenes? (Espero que el orden se base en dependencias de restricciones, sin preocuparse en absoluto por el momento de la creación, pero la esperanza no escala bien)
Mike Sherrill 'Cat Recall'

10
puede utilizar -a -d y | ordenar. Pero es posible que estos datos no se puedan importar, sin embargo, estaría bien para una verificación básica.
Cem Güler

Para ser honesto, esto debería estar más arriba en los resultados. Uno no debería tener que depender de una diferencia para salvar el día, por lo que estas soluciones completas y pesadas basadas en Java parecen excesivas. Sin embargo, tiene sentido verificar la cordura de sus migraciones y pg_dumpestá bien para eso. Si ve diferencias significativas con pg_dumpprobablemente esté tratando de comparar cosas que están más allá de ser comparables. Al menos para comparar PG dbs.
sas

1
Lamentablemente, esto solo funciona en bases de datos más pequeñas, ya que diff no puede manejar algunos volcados grandes que tengo. De lo contrario, es (¡todavía!) Realmente la única solución viable que encontré. Aunque estoy usando en psql -c '\x' -c 'SELECT... ORDER BY...'lugar de pg_dump.
nyov

11

Otra aplicación gratuita (que solo puede comparar estructura, pero no datos ):

DBeaver : puede seleccionar bases de datos, tablas, etc. para comparar entre sí


1
¿Podría explicar mejor cómo comparar datos de 2 bases de datos con DBeaver?
Nicola

1
Hasta donde yo sé, DBeaver solo permite la comparación de metadatos, no la comparación de datos.
nicola

Muy buena herramienta. Es cierto que al principio no es muy intuitivo cómo hacerlo. Primero debe seleccionar 2 o más objetos para que pueda ver esta opción.
ihebiheb

8

He evaluado muchas de las herramientas y he encontrado la siguiente solución:

Comparación de esquemas :

Los más interesantes fueron Liquibase, Persyas y PgCodeKeeper:

( problema ) Liquebase convierte:

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

dentro

BIGSERIAL

Entonces fue rechazado usar

( problema ) Persyas funcionó bien hasta que agregué un esquema adicional y comienza a arrojar lo siguiente:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Entonces encontré que PgCodeKeeper funciona perfectamente y está vivo (puede verificar las versiones). Yo uso el siguiente comando:

./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

Comparación de datos: he intentado usar Liquebase y simplemente no funciona, puede ver los pasos que probé en mi pregunta sin respuesta sobre la diferencia de datos de dos bases de datos con Liquebase

Así que encontré otro proyecto SQL Workbench / J Funciona muy bien y genera diferencias reales en sql. Yo uso el siguiente comando:

  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 ;'"

Ambas herramientas soportan la filtración de objetos. Es realmente conveniente.

Migraciones

Y finalmente uso Liquebase solo para la migración / seguimiento de versiones.


6

Estoy trabajando en una herramienta de comparación integral para Postgres. Será gratis mientras esté en beta.

PostgresCompare

Inicialmente, esto es solo una comparación de esquema (DDL), pero probablemente también ampliaremos los datos. Creo que esta es una herramienta que muchas tiendas necesitan para pasar de su RDBMS actual sin tener que cambiar también cómo funcionan sus entornos de desarrollo, operaciones, etc.


1
Los datos también son muy importantes. El esquema por sí solo no es suficiente.
Houman

1
Hola @Houman. Lo siento por la respuesta tardía. Tienes razón, los datos serán el siguiente paso. Lo mejor de crear primero la herramienta de comparación de esquemas es que todo el código para descubrir tablas, etc. se puede compartir entre ellos.
Neil Anderson

Encontré esta respuesta mientras construía una herramienta simple de comparación de esquemas yo mismo. Revisé su sitio web y la herramienta parece muy prometedora. No puedo esperar para probar la versión beta
Avantika Saini

El alfa está disponible ahora mismo @AvantikaSaini y si lo intentas, házmelo saber cómo va para que pueda mejorarlo para todos.
Neil Anderson

Debe crear una versión educativa de la licencia. El precio es demasiado alto para fines educativos.
reinaldoluckman

2

La mejor herramienta que he visto en mi vida https://pythonhosted.org/Pyrseas/

  1. Obtener volcado de la base de datos A dbtoyaml ...

  2. Genere la migración desde A => B yamltodb ... [archivo generado en el paso 1]


Esta parece ser la única herramienta que genera scripts de diferencias comparando una base de datos y un archivo de volcado. Normalmente, otras herramientas comparan dos bases de datos. Gracias a esta característica, los desarrolladores pueden trabajar en una base de datos de desarrollo local, luego confirmar y distribuir sus modificaciones por vcs sin crear scripts de migración, simplemente ejecutando dbtoyaml. Los desarrolladores de otros equipos pueden actualizar sus bases de datos locales con un solo comando (yamltodb). Este flujo de trabajo funciona un poco como un proyecto de base de datos de Visual Studio.
andreav


0

Creé una herramienta para comparar 2 bases de datos PostgreSQL en vivo (no volcados), datos de tablas y secuencias. Bastante temprano, pero logré lo que quería que hiciera, tal vez también pueda ayudarte.

https://github.com/dmarkey/pgdatadiff


0

En mi opinión, Dbforge es la herramienta más poderosa para los datos de comapring en postgresql. Es un producto de la empresa Devart. Puede descargarlo aquí .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.