Sprawdzanie, czy 2 tabele (na różnych serwerach) zawierają te same dokładne dane

10

Wygląda więc na to, że firma, która obsługuje nasze serwery SQL, ma problemy z replikacją z serwera produkcyjnego na serwer zapasowy ... Myślę jednak, że niektóre tabele poprawnie się replikują. Replikacja odbywa się codziennie (po godzinach).

Czy istnieje sposób, aby porównać 2 te same tabele, 1 z kopii zapasowej z 1 z serwera produkcyjnego, aby sprawdzić, czy replikacja z ostatniej nocy działała?

Jedynym sposobem, jaki mogłem znaleźć, było uruchomienie następującego zapytania na obu serwerach i sprawdzenie, czy wynik jest zgodny, co „może” oznaczać, że do 2 tabel zawierają te same informacje.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

przy użyciu powyższego kodu Wygląda na to, że tabela została pomyślnie zreplikowana, ponieważ wartości sum kontrolnych są takie same, ale nie jestem pewien, jak niezawodna jest ta metoda.

Czy ktoś wie o lepszej metodzie sprawdzenia tego, czy jest to dobry sposób?

Korzystam z programu SQL Server 2008 na komputerze z systemem Windows Server 2008.

Dzięki.

Juan Velez
źródło

Odpowiedzi:

11

Myślę, że szukasz narzędzia tablediff, które pozwoli ci to zrobić dokładnie - porównaj dwie replikowane tabele pod kątem różnic. Ten artykuł może okazać się przydatny na początek.

Oto GUI dla tablediff

RK Kuppala
źródło
Świetnie, dziękuję. Muszę coś z tym zrobić. Dziękujemy również za link do GUI, dzięki czemu łatwiej jest to docenić!
Juan Velez,
4

Jak duże są dane i jak szybkie są połączenia między bazami danych między sobą (a tobą)? Istnieje wiele pomysłów:

Jeśli dane są na tyle małe, że jest to praktyczne, uruchom SELECT * FROM <table> ORDER BY <pk>każdą bazę danych, zapisz wyniki w pliku rozdzielanym tabulatorami lub przecinkami (nie wyrównane spacją, ponieważ powoduje to znaczny wzrost rozmiaru pliku wynikowego) i porównaj uzyskane wyniki z preferowanym typem pliku różnicowego narzędzie takie jak winmerge. W ten sposób porównujesz absolutnie wszystkie dane.

Jeśli bazy danych mogą się widzieć (najprawdopodobniej ponieważ są w stanie działać jako partnerzy replikacji), a połączenie między nimi ma wystarczającą przepustowość i wystarczająco małe opóźnienie, można użyć funkcji serwera połączonego (patrz http://msdn.microsoft .com / en-us / library / ms190479.aspx i powiązana dokumentacja) i porównaj, porównaj zawartość tabel w kilku instrukcjach SQL (wymieniając wiersze, w <table>których nie ma identycznych wierszy <linked_server>.<db>..<table>i odwrotnie) tak jak porównałbyś zawartość dwóch lokalnych tabel. Jest to potencjalnie stosunkowo wolna opcja, ale może być dość zaawansowanym narzędziem do automatyzacji.

Jeśli chcesz użyć sum kontrolnych, ponieważ chcesz znacznie zmniejszyć ilość danych, które muszą zostać przesłane, użyj HASHBYTESraczej niż CHECKSUMrodziny funkcji, ponieważ możesz używać skrótów lepszej jakości , aby mieć pewność, że będą one równe. Jest to bardziej obciążające procesor, ale w przypadku dużych ilości danych będziesz związany z procesorem we / wy, a nie z procesorem, więc będziesz mieć wiele wolnych cykli (a dla małych ilości po prostu nie będzie to miało znaczenia).

Jako środek pośredni między porównaniem wszystkich danych znak po znaku a porównaniem pojedynczej sumy kontrolnej obejmującej wszystkie dane, możesz wyeksportować SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>z każdej bazy danych i porównać te wyniki, aby sprawdzić, czy są one identyczne (lub SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>aby zmniejszyć ilość danych przepływające, ale posiadanie PK na wyjściu oznacza, że ​​możesz zidentyfikować wiersze, które różnią się, jeśli w ogóle, z mniejszymi zapytaniami). Oczywiście ta ostatnia opcja nie ma sensu, jeśli dane w średnim wierszu są mniejsze niż wynikowy skrót, w którym to przypadku opcja „porównaj wszystko ” będzie bardziej wydajna.

David Spillett
źródło
2

Chociaż tablediff porównuje tylko tabele w aktywnych bazach danych, istnieje wiele narzędzi innych firm, które mogą porównać kopię zapasową bazy danych z aktywną bazą danych.

Możesz również wykonać następujący skrypt, aby zobaczyć dane, które istnieją w jednej tabeli, a nie istnieją w innej, ale możesz to zrobić tylko w przypadku 2 aktywnych baz danych:

WYBIERZ * Z MyTest.dbo.testtable GDZIE NIE ISTNIEJE (WYBIERZ * Z MyTest2.dbo.TestTable GDZIE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)

Carol Baker West
źródło
Dzięki za informację! Zajrzę do tego. Ten skrypt będzie pomocny!
Juan Velez,
coś, z czego często korzystałem to except: select id, name from Table1 except select id, name from Table2da ci wszystko w Tabeli 1, ale nie w Tabeli 2
Adam