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.
źródło
Uważam ten artykuł za szczególnie interesujący: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/
„Jeśli potrzebujesz prędkości ponad dokładność - użyj CHECKSUM, a nie BINARY_CHECKSUM.
Jeśli potrzebujesz dokładności w stosunku do prędkości - użyj HASHBYTES. ”
źródło
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
HASHBYTES
raczej niżCHECKSUM
rodziny 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 (lubSELECT 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.źródło
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)
źródło
except
:select id, name from Table1 except select id, name from Table2
da ci wszystko w Tabeli 1, ale nie w Tabeli 2