Como comparar dados entre dois bancos de dados no PostgreSQL?


Respostas:


85

Existem várias ferramentas por aí:

(observe que a maioria dessas ferramentas só pode comparar a estrutura, mas não os dados)

Grátis:

Comercial:


17
Apenas liquibase.org e Aqua Data Studio parecem comparar dados, outros apenas comparar esquema.
Amir Ali Akbari

@AmirAliAkbari Liquibase oferece suporte a diffs de esquema
a_horse_with_no_name

2
Parece que apgdiffnão oferece suporte a tabelas herdadas bem e uma exceção é lançada imediatamente quando tento usá-la. WbSchemaDifffunciona muito bem, surpresa!
smartwjw

1
@AmirAliAkbari liquibase não parece comparar dados quando as tabelas existem e têm a mesma estrutura.
aditsu saiu porque SE é EVIL

14
-1. O OP estava perguntando sobre a comparação de dados (registros / linhas) e você listou principalmente ferramentas que comparam a estrutura , que o OP declarou explicitamente como idêntica entre os bancos de dados de destino, portanto, não há motivo para compará-los. Por favor, esclareça quais realmente fazem a coisa solicitada.
Raramente 'Cadê a Monica' Carente

39

Tente usar pg_dumpem ambos os bancos de dados e comparar os arquivos.


23
1 para simples e direto. Mas sabemos com certeza que o pg_dump fará dump de dados de bancos de dados idênticos na mesma ordem se, digamos, as tabelas foram construídas em ordens diferentes? (Espero que a ordem seja baseada em dependências de restrição, sem se importar com o tempo de criação, mas espero que não seja bem dimensionado.)
Mike Sherrill 'Cat Recall'

10
você pode usar -a -d e | ordenar . Mas esses dados podem não ser importáveis, no entanto, seria bom para uma verificação básica.
Cem Güler

Isso deve ser mais alto nos resultados, para ser honesto. Não se deve depender de um diff para salvar o dia, então essas soluções completas e pesadas baseadas em java parecem um exagero. No entanto, faz sentido verificar a sanidade de suas migrações e isso pg_dumpé adequado. Se você vê diferenças significativas com pg_dumpvocê provavelmente está tentando comparar coisas que estão além de serem comparáveis. Pelo menos para comparar DBS PG.
sas

1
Infelizmente, isso só funciona em bancos de dados menores, pois o diff não pode lidar com alguns grandes dumps que tenho. Caso contrário, é (ainda!) A única solução viável que encontrei. Embora eu esteja usando em psql -c '\x' -c 'SELECT... ORDER BY...'vez de pg_dump.
nyov 01 de

11

Outro aplicativo gratuito (que só pode comparar a estrutura, mas não os dados ):

DBeaver - você pode selecionar bancos de dados, tabelas, etc. para comparar uns com os outros


1
Você poderia explicar melhor como comparar dados de 2 bancos de dados com o DBeaver?
Nicola

1
Pelo que eu sei, o DBeaver só permite a comparação de metadados, não a comparação de dados.
nicola

Ferramenta muito boa. É verdade que não é muito intuitivo como fazê-lo no início. Você deve primeiro selecionar 2 ou mais objetos para que possa ver esta opção.
ihebiheb

8

Eu avaliei muitas das ferramentas e encontrei a seguinte solução:

Comparação de esquema :

Os mais interessantes foram Liquibase, Persyas e PgCodeKeeper:

( edição ) Liquebase converte:

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

para dentro

BIGSERIAL

Portanto, foi rejeitado para usar

( problema ) Persyas funcionou bem até que eu adicionei algum esquema adicional e ele começou a apresentar o seguinte:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Então eu descobri que o PgCodeKeeper funciona perfeitamente e está vivo (você pode verificar as versões). Eu uso o seguinte 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

Comparação de dados: Eu tentei usar o Liquebase e ele simplesmente não funciona, você pode ver as etapas que tentei na minha pergunta não respondida sobre a diferença de dados de dois bancos de dados com o Liquebase

Então eu encontrei outro projeto SQL Workbench / J Ele funciona muito bem e gera diff real em sql. Eu uso o seguinte 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 as ferramentas suportam a filtragem de objetos. É muito conveniente.

Migrações

E, finalmente, uso o Liquebase apenas para rastreamento de migração / versão.


6

Estou trabalhando em uma ferramenta de comparação abrangente para Postgres. Será gratuito enquanto estiver em beta.

PostgresCompare

Inicialmente, esta é apenas uma comparação de esquema (DDL), mas provavelmente iremos expandir para dados também. Eu acredito que esta é uma ferramenta que muitas lojas precisam para mudar de seu RDBMS atual sem ter que mudar também como seus ambientes de desenvolvimento, operações, etc. funcionam.


1
Os dados também são muito importantes. O esquema sozinho não é suficiente.
Houman

1
Olá @Houman. Desculpe pelo atraso na resposta. Você está certo, os dados serão o próximo passo. A grande vantagem de construir primeiro a ferramenta de comparação de esquema é que todo o código para descobrir tabelas, etc., pode ser compartilhado entre eles.
Neil Anderson

Eu encontrei esta resposta enquanto construía uma ferramenta simples de comparação de esquema. Visitei seu site e a ferramenta parece muito promissora. Mal posso esperar para testar a versão beta
Avantika Saini

O alfa está disponível agora em @AvantikaSaini e se você tentar, por favor me diga como está indo para que eu possa melhorá-lo para todos.
Neil Anderson

Você deve fazer uma versão educacional da licença. O preço é muito alto para fins educacionais.
reinaldoluckman

2

A melhor ferramenta que já vi https://pythonhosted.org/Pyrseas/

  1. Obter despejo do banco de dados A dbtoyaml ...

  2. Gerar migração de A => B yamltodb ... [arquivo gerado na etapa 1]


Esta parece ser a única ferramenta que gera scripts diff comparando um banco de dados e um arquivo de despejo. Normalmente, outras ferramentas comparam dois bancos de dados. Graças a esse recurso, os desenvolvedores podem trabalhar em um banco de dados de desenvolvimento local e, em seguida, comprometer e distribuir suas modificações por vcs sem criar scripts de migração, apenas executando dbtoyaml. Outros desenvolvedores de equipe podem atualizar seus bancos de dados locais com um único comando (yamltodb). Este fluxo de trabalho funciona um pouco como o projeto de banco de dados do Visual Studio.
andreav



0

Na minha opinião, Dbforge é a ferramenta mais poderosa para dados de comapring no postgresql. É um produto da empresa Devart. Você pode baixar aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.