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.
fuente
Este artículo me pareció particularmente interesante: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/
"Si necesita velocidad sobre la precisión, use CHECKSUM, no BINARY_CHECKSUM.
Si necesita precisión sobre la velocidad, use HASHBYTES ".
fuente
¿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
HASHBYTES
lugar de laCHECKSUM
familia 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 (oSELECT 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.fuente
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)
fuente
except
:select id, name from Table1 except select id, name from Table2
le dará todo en la Tabla 1 pero no en la Tabla 2