Verificando se 2 tabelas (em servidores diferentes) têm os mesmos dados exatos

10

Parece que a empresa que está hospedando nossos servidores SQL está tendo problemas com a replicação do servidor de produção para o servidor de backup ... Eu acredito que algumas das tabelas foram replicadas corretamente. A replicação é feita diariamente (após o expediente).

Existe uma maneira de comparar 2 das mesmas tabelas, 1 do backup e 1 do servidor de produção para ver se a replicação das noites anteriores funcionou?

A única maneira que eu pude encontrar foi executar a seguinte consulta nos dois servidores e ver se o resultado correspondia a "que" poderia significar que 2 tabelas contêm as mesmas informações.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

usando o código acima, parece que a tabela foi replicada com êxito, pois os valores da soma de verificação são os mesmos, mas não tenho certeza de quão confiável é esse método.

Alguém sabe de um método melhor para verificar isso ou se este é um bom caminho?

Estou executando o SQL Server 2008 em um computador Windows Server 2008.

Obrigado.

Juan Velez
fonte

Respostas:

11

Acredito que você esteja procurando a ferramenta tablediff, que permite fazer exatamente isso - compare duas tabelas replicadas quanto às diferenças. Você pode achar este artigo útil para começar.

Aqui está uma GUI para tablediff

RK Kuppala
fonte
Impressionante, obrigado. Eu tenho algumas leituras para fazer sobre isso. Também obrigado pelo link para a GUI, isso deve facilitar muito as coisas, realmente aprecio isso!
Juan Velez
4

Qual é o tamanho dos dados e a rapidez com que os links entre os bancos de dados e entre si (e você)? Há várias idéias:

Se os dados forem pequenos o suficiente para serem práticos, execute SELECT * FROM <table> ORDER BY <pk>em cada banco de dados, salve os resultados em um arquivo delimitado por vírgula ou tabulação (sem espaço alinhado, pois isso aumenta o tamanho do arquivo resultante maciçamente) e compare a saída resultante com o tipo de diff preferido utilitário como o winmerge. Dessa forma, você está comparando absolutamente todos os dados.

Se os bancos de dados puderem se ver (provavelmente como eles podem operar como parceiros de replicação) e o link entre eles tiver largura de banda alta o suficiente e latência baixa o suficiente, você poderá usar a funcionalidade do servidor vinculado (consulte http://msdn.microsoft .com / pt-br / library / ms190479.aspx e documentação relacionada) e compara o conteúdo das tabelas em algumas instruções SQL (listando as linhas <table>que não possuem linhas idênticas <linked_server>.<db>..<table>e vice-versa), assim como você compararia o conteúdo de duas tabelas locais. Esta é uma opção relativamente lenta, mas pode ser uma verificação bastante poderosa para automatizar.

Se você estiver precisando usar somas de verificação porque deseja reduzir bastante a quantidade de dados que precisam ser transferidos, use HASHBYTESem vez da CHECKSUMfamília de funções, pois você pode usar hashes de melhor qualidade para ter mais certeza de que serão iguais. Isso consome mais CPU, mas para grandes quantidades de dados, você estará ligado à E / S e não à CPU, de modo que haverá muitos ciclos de reserva (e para pequenas quantidades simplesmente não importa).

Como um meio termo entre comparar todos os dados caractere por caractere e comparar uma única soma de verificação que abrange todos os dados, você pode exportar SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>de cada banco de dados e comparar esses resultados para ver se eles são idênticos (ou SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>para reduzir a quantidade de dados fluindo, mas ter a PK na saída significa que você pode identificar as linhas que diferem, se houver, com menos consultas adicionais). Obviamente, essa última opção não faz sentido se os dados na linha média forem menores que o hash resultante; nesse caso, a opção "comparar tudo " será mais eficiente.

David Spillett
fonte
2

Enquanto tablediff compara apenas tabelas em bancos de dados ativos, existem muitas ferramentas de terceiros que podem comparar um backup de banco de dados a um banco de dados ativo.

Você também pode executar o script a seguir para ver os dados que existem em uma tabela e não em outra, mas somente em 2 bancos de dados ativos:

SELECT * FROM MyTest.dbo.testtable WHERE NOT EXISTS (SELECT * FROM MyTest2.dbo.TestTable WHERE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)

Carol Baker West
fonte
Obrigado pela informação! Eu vou investigar isso. Esse script será útil!
Juan Velez
algo que eu tenho usado com freqüência é except: select id, name from Table1 except select id, name from Table2vai lhe dar tudo na Tabela 1, mas não em Tabela2
Adam