Comprobando si 2 tablas (en diferentes servidores) tienen los mismos datos exactos

10

Parece que la compañía que aloja nuestros servidores SQL ha tenido algunos problemas con la replicación del servidor de producción al servidor de respaldo ... Sin embargo, creo que algunas de las tablas se han replicado correctamente. La replicación se realiza diariamente (después de las horas).

¿Hay alguna forma de comparar 2 de las mismas tablas, 1 de la copia de seguridad frente a 1 del servidor de producción para ver si la replicación de anoche funcionó?

La única forma que pude encontrar fue ejecutar la siguiente consulta en ambos servidores y ver si el resultado coincidía, lo que "podría" significar que 2 tablas contienen la misma información.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

usando el código anterior, parece que la tabla se replicó con éxito ya que los valores de la suma de verificación son los mismos, pero no estoy seguro de cuán confiable es este método.

¿Alguien sabe de un mejor método para comprobar esto o si esta es una buena manera?

Estoy ejecutando SQL Server 2008 en una computadora con Windows Server 2008.

Gracias.

Juan velez
fuente

Respuestas:

11

Creo que está buscando la herramienta tablediff que le permite hacer exactamente eso: comparar dos tablas replicadas para ver las diferencias. Puede que le resulte útil este artículo para comenzar.

Aquí hay una GUI para tablediff

RK Kuppala
fuente
Impresionante, gracias. Tengo que leer sobre esto. También gracias por el enlace a la GUI, debería hacer las cosas mucho más fáciles, ¡realmente lo aprecio!
Juan Velez
4

¿Qué tan grandes son los datos y qué tan rápidos son los enlaces entre las bases de datos y entre sí (y usted)? Hay varias ideas:

Si los datos son lo suficientemente pequeños como para que esto sea práctico, ejecute SELECT * FROM <table> ORDER BY <pk>en cada base de datos, guarde los resultados en una pestaña o archivo delimitado por comas (no alineado con el espacio, ya que aumenta el tamaño del archivo resultante masivamente) y compare el resultado resultante con su tipo de diferencia preferido utilidad como winmerge. De esa manera, está comparando absolutamente todos los datos.

Si las bases de datos pueden verse entre sí (lo más probable es que puedan operar como socios de replicación) y el enlace entre ellas es de ancho de banda lo suficientemente alto y latencia lo suficientemente baja, puede usar la funcionalidad del servidor vinculado (consulte http://msdn.microsoft .com / en-us / library / ms190479.aspx y documentación relacionada) para comparar y comparar el contenido de las tablas en un par de sentencias SQL (enumerando las filas <table>que no tienen filas idénticas <linked_server>.<db>..<table>y viceversa) tal como compararía el contenido de dos tablas locales. Potencialmente, esta es una opción relativamente lenta, pero podría ser un control bastante potente para automatizar.

Si necesita usar sumas de verificación porque desea reducir en gran medida la cantidad de datos que deben transferirse, use en HASHBYTESlugar de la CHECKSUMfamilia de funciones, ya que puede usar hashes de mejor calidad para que esté más seguro de que saldrán iguales. Esto es más intensivo en la CPU, pero para grandes cantidades de datos estará vinculado a E / S y no a la CPU de todos modos, por lo que tendrá muchos ciclos libres (y para pequeñas cantidades simplemente no importará).

Como punto intermedio entre comparar todos los datos carácter por carácter y comparar una sola suma de verificación que cubre todos los datos, puede exportar SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>desde cada base de datos y comparar esos resultados para ver si son idénticos (o SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>para reducir la cantidad de datos fluir, pero tener el PK en la salida significará que puede identificar las filas que difieren, si las hay, con menos consultas adicionales). Por supuesto, esta última opción no tiene sentido si los datos en la fila promedio son más pequeños que el hash resultante, en cuyo caso la opción "comparar todo " será más eficiente.

David Spillett
fuente
2

Si bien tablediff compara solo tablas en bases de datos en vivo, hay muchas herramientas de terceros que pueden comparar una copia de seguridad de una base de datos con una base de datos en vivo.

También puede ejecutar el siguiente script para ver los datos que existen en una tabla y no existen en otra, pero puede hacerlo solo en 2 bases de datos activas:

SELECT * FROM MyTest.dbo.testtable DONDE NO EXISTE (SELECT * FROM MyTest2.dbo.TestTable DONDE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)

Carol Baker West
fuente
Gracias por la info! Lo investigaré. ¡Ese guión será útil!
Juan Velez
algo que he usado con frecuencia es except: select id, name from Table1 except select id, name from Table2le dará todo en la Tabla 1 pero no en la Tabla 2
Adam