Vérifier si 2 tables (sur des serveurs différents) ont les mêmes données exactes

10

Il semble donc que la société qui héberge nos serveurs SQL ait eu des problèmes avec la réplication du serveur de production vers le serveur de sauvegarde ... Je pense que certaines tables se sont répliquées correctement. La réplication se fait quotidiennement (après les heures).

Existe-t-il un moyen de comparer 2 des mêmes tables, 1 de la sauvegarde et 1 du serveur de production pour voir si la réplication des dernières nuits a fonctionné?

La seule façon que j'ai pu trouver était d'exécuter la requête suivante sur les deux serveurs et de voir si le résultat correspondait, ce qui "pourrait" signifier que 2 tables contiennent les mêmes informations.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

en utilisant le code ci-dessus, il semble que la table s'est répliquée avec succès car les valeurs de somme de contrôle sont les mêmes, mais je ne suis pas sûr de la fiabilité de cette méthode.

Est-ce que quelqu'un connaît une meilleure méthode pour vérifier cela ou si c'est un bon moyen?

J'exécute SQL Server 2008 sur un ordinateur Windows Server 2008.

Merci.

Juan Velez
la source

Réponses:

11

Je crois que vous recherchez l'outil tablediff qui vous permet de faire exactement cela - comparer deux tableaux répliqués pour les différences. Vous pourriez trouver cet article utile pour commencer.

Voici une interface graphique pour tablediff

RK Kuppala
la source
Génial, merci. J'ai de la lecture à faire là-dessus. Merci aussi pour le lien vers l'interface graphique, cela devrait rendre les choses beaucoup plus faciles vraiment l'apprécier!
Juan Velez
4

Quelle est la taille des données et à quelle vitesse les liens entre les bases de données et entre eux (et vous)? Il y a plusieurs idées:

Si les données sont suffisamment petites pour que cela soit pratique, exécutez SELECT * FROM <table> ORDER BY <pk>sur chaque base de données, enregistrez les résultats dans un fichier délimité par des tabulations ou des virgules (pas aligné sur l'espace car cela fait exploser massivement la taille du fichier résultant) et comparez la sortie résultante avec votre type de différence préféré utilitaire tel que winmerge. De cette façon, vous comparez absolument toutes les données.

Si les bases de données peuvent se voir (très probablement car elles sont capables de fonctionner en tant que partenaires de réplication) et que le lien entre elles est une bande passante suffisamment élevée et une latence suffisamment faible, vous pouvez utiliser la fonctionnalité de serveur lié (voir http://msdn.microsoft .com / en-us / library / ms190479.aspx et documentation connexe) pour comparer et comparer le contenu des tables dans quelques instructions SQL (répertoriant les lignes <table>qui n'ont pas de lignes identiques dans <linked_server>.<db>..<table>et vice versa) tout comme vous compareriez le contenu de deux tables locales. Il s'agit potentiellement d'une option relativement lente, mais cela pourrait être une vérification assez puissante à automatiser.

Si vous devez utiliser des sommes de contrôle parce que vous souhaitez réduire considérablement la quantité de données à transférer, utilisez HASHBYTESplutôt que la CHECKSUMfamille de fonctions, car vous pouvez utiliser des hachages de meilleure qualité afin d'être plus sûrs qu'ils sortent égaux. Ceci est plus gourmand en CPU, mais pour de grandes quantités de données, vous serez lié aux E / S et non lié au CPU de toute façon, de nombreux cycles seront donc disponibles (et pour de petites quantités, cela n'a tout simplement pas d'importance).

En tant qu'intermédiaire entre la comparaison de toutes les données caractère par caractère et la comparaison d'une seule somme de contrôle couvrant toutes les données, vous pouvez exporter à SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>partir de chaque base de données et comparer ces résultats pour voir s'ils sont identiques (ou SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>pour réduire la quantité de données coulant, mais ayant le PK dans la sortie signifie que vous pouvez identifier les lignes qui diffèrent, le cas échéant, avec moins de requêtes supplémentaires). Bien sûr, cette dernière option est inutile si les données de la ligne moyenne sont plus petites que le hachage résultant, auquel cas l' option " tout comparer " sera plus efficace.

David Spillett
la source
2

Alors que tablediff compare uniquement les tables des bases de données actives, il existe de nombreux outils tiers qui peuvent comparer une sauvegarde de base de données à une base de données active.

Vous pouvez également exécuter le script suivant pour voir les données qui existent dans une table et qui n'existent pas dans une autre, mais vous ne pouvez le faire que sur 2 bases de données actives:

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

Carol Baker West
la source
Merci pour l'info! J'examinerai cela. Ce script sera utile!
Juan Velez
quelque chose que j'ai utilisé fréquemment est except: select id, name from Table1 except select id, name from Table2vous donnera tout dans le tableau 1 mais pas dans le tableau 2
Adam