AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 3289
Accepted
Tony
Tony
Asked: 2011-06-14 07:02:11 +0800 CST2011-06-14 07:02:11 +0800 CST 2011-06-14 07:02:11 +0800 CST

Existem ferramentas para realizar a comparação de dados entre dois esquemas diferentes?

  • 772

Estamos migrando nosso banco de dados para um novo esquema, mas queremos validar se os dados foram movidos corretamente.

As ferramentas tradicionais de comparação de dados podem comparar dois bancos de dados em busca de diferenças se os esquemas forem os mesmos. No nosso caso, houve alterações nos designs das tabelas, mas todos os dados do esquema antigo estão no novo, apenas foram movidos um pouco e preciso ter certeza de que estão corretos. Temos dezenas de milhões de linhas, portanto a inspeção manual não é uma opção.

Existem ferramentas que possam auxiliar nesse tipo de comparação?

Caso contrário, existem bibliotecas/frameworks que possam ajudar a iniciar o desenvolvimento de uma solução personalizada?

Fico feliz em usar uma solução específica de banco de dados, se necessário, neste caso para o SQL Server 2008.

Minha solução: estou comparando os dois conjuntos de dados criando um VIEWde cada tabela no banco de dados antigo com os mesmos campos da nova tabela do banco de dados.

Em seguida, comparo os dados usando a técnica descrita aqui: A maneira mais curta, rápida e fácil de comparar duas tabelas no SQL Server: UNION !

Tive sorte nessa migração, pois a estrutura geral da tabela é semelhante ao banco de dados antigo, com campos movidos de uma tabela para outra, descartados ou adicionados. No caso dos descartados e adicionados não há o que comparar, para os campos que foram movidos ou agregados eu faço cálculos na view para fornecer as informações corretas para comparação.

A UNIONcomparação me mostra apenas as linhas com diferenças, portanto, assim que os dados estiverem corretos, obtenho um conjunto de resultados vazio.

sql-server sql-server-2008
  • 4 4 respostas
  • 8767 Views

4 respostas

  • Voted
  1. Best Answer
    Andrew Bickerton
    2011-06-16T00:13:50+08:002011-06-16T00:13:50+08:00

    Não é impossível comparar dois esquemas diferentes, é um cálculo de quão confiante você está no resultado. Eu basicamente peguei emprestado das técnicas de reconciliação bancária

    Importante: Esta reconciliação não é para garantir que o destino corresponda exatamente à origem em seu contexto de dados (há um motivo para você estar migrando para um novo sistema), mas você precisa explicar quaisquer discrepâncias!

    Base:

    1. Identifique as métricas que você usará para medir (ou seja: número total de usuários, soma de todas as suas idades, lista de IDs de usuários e seus códigos postais...) Eu tento usar várias métricas de: Totais, Médias e amostras/registros detalhados
    2. Despeje esses dados em um local comum (por meio de visualizações/relatórios/o que for razoável)
    3. Compare seus dados e certifique-se de que qualquer discrepância pode ser explicada

    Eu geralmente divido a comparação em vários métodos (em particular para as métricas detalhadas):

    • Por tabela: geralmente usando a tabela de origem como definição, criando um conjunto de visualizações no banco de dados de destino para tentar reproduzir os dados da tabela de origem
    • Por objeto: dependendo do banco de dados e do que você está armazenando, pode fazer mais sentido criar uma visão holística dos objetos (ou seja: o usuário) em várias tabelas, semelhante à criação acima de um conjunto de visualizações para retornar esse objeto como um conjunto de resultados
    • Por relatórios: se o banco de dados de origem tiver um bom conjunto abrangente de relatórios gerenciais, outra técnica é reproduzir esses relatórios exatamente com a mesma formatação

    Técnicas:

    Não importa qual método eu usei para produzir o que será comparado, eu acabo com um conjunto de arquivos/views/dbs que contém os dados conciliáveis ​​de Origem e Destino, dependendo da mídia, posso usar uma das ferramentas comumente disponíveis para compará-los. Minhas próprias preferências são:

    1. Comparação de arquivos
      Crie duas pastas diferentes para SourceDB e DestinationDB (hora/versão marcada para que eu saiba quando fiz a reconciliação) e despeje a saída de minhas métricas como arquivos com nomes relevantes e, em seguida, use uma ferramenta de comparação (como CSDiff ) para identificar as diferenças

    2. Comparação do Excel
      Em particular ao lidar com relatórios de gerenciamento, criarei um conjunto de pastas de trabalho do Excel para comparar os relatórios (em essência, usando VLookups e comparando totais)

    3. Comparação de dados
      Em vez de enviar os dados de reconciliação para arquivos ou relatórios, envie-os para bancos de dados separados e use algo como Redgate SQL Data Compare para comparar os bancos de dados

    Outras ferramentas:

    Não tentei nenhum desses, mas uma rápida pesquisa no Google em 'Ferramentas de reconciliação de dados' fornece:

    • Software de reconciliação de dados n-Tierfs
    • Testando a reconciliação de dados de desempenho

    Há outros, mas esses foram os que pareciam razoáveis

    • 7
  2. gbn
    2011-06-14T07:38:13+08:002011-06-14T07:38:13+08:00

    Se você quiser comparar dados em dois designs de banco de dados diferentes, precisará escrever SQL codificado à mão para comparar dados.

    • E se uma mesa tiver sido dividida ou combinada, etc.?
    • E se você tivesse datetime, agora você tem smalldatetime = os dados serão diferentes
    • ...

    Não existe uma biblioteca de estrutura para verificar se os dados são os mesmos em dois bancos de dados diferentes.

    Só você sabe o que mudou ou modificou

    • 6
  3. SqlSandwiches
    2011-06-15T13:40:35+08:002011-06-15T13:40:35+08:00

    Vai ser impossível para você comparar esquemas diferentes. Para resolver seu problema, eu descobriria quais dados você precisa comparar. Em seguida, criaria uma exibição em cada servidor que recuperaria os dados que desejava comparar (leve em consideração os tipos de dados e outros).

    Uma vez que ambas as exibições são iguais, eu usaria uma ferramenta de terceiros como o Red Gate Data Compare para ver quais linhas são diferentes.

    Parece uma dor. Boa sorte!

    • 5
  4. Dariusz Dziewialtowski-Gintowt
    2011-06-14T17:09:13+08:002011-06-14T17:09:13+08:00

    Alguns anos atrás, escrevi uma ferramenta para fazer exatamente isso - uma comparação de dados entre dois bancos de dados. Desde então eu o converti para um software comercial e publiquei em

    www.sql-server-tool.com

    • uma única licença custa 99$, mas você pode experimentá-la gratuitamente por 30 dias.

    O programa - chamado SCT para "SQL Server Comparison Tool" (nunca fui bom em nomear coisas :) - tem muitas opções de ajuste fino, como: ignorar colunas selecionadas ou especificar o método de comparação (registro por registro ou chave primária/ comparação de índices). As "sessões" de comparação podem ser salvas e reproduzidas posteriormente sem a necessidade de reinserir os parâmetros. O parâmetro de linha de comando pode ser usado para automatizar totalmente as comparações.

    Para dezenas de milhões de linhas, pode ser um pouco lento - nesse caso, recomendo começar com um subconjunto menor de dados - digamos comparar apenas as primeiras 1.000 linhas - e ver se é necessário algum ajuste fino do processo.

    Dariusz Dziewialtowski-Gintowt

    • 2

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve