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.
fonte
Achei este artigo particularmente interessante: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/
"Se você precisar de velocidade acima da precisão - use CHECKSUM, não BINARY_CHECKSUM.
Se você precisar de precisão sobre a velocidade, use HASHBYTES ".
fonte
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
HASHBYTES
em vez daCHECKSUM
famí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 (ouSELECT 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.fonte
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)
fonte
except
:select id, name from Table1 except select id, name from Table2
vai lhe dar tudo na Tabela 1, mas não em Tabela2