2 tablonun (farklı sunucularda) aynı kesin verilere sahip olup olmadığını kontrol etme


10

SQL Server'larımızı barındıran şirket, üretim sunucusundan yedekleme sunucusuna çoğaltma konusunda bazı sorunlar yaşıyor gibi görünüyor ... Bence bazı tablolar doğru olsa da çoğalıyor. Çoğaltma günlük olarak yapılır (saatlerden sonra).

Dün gece çoğaltmanın işe yarayıp yaramadığını görmek için aynı tabloların 2'sini, 1'i üretim sunucusundan 1'i üretim sunucusundan karşılaştırabilmemin bir yolu var mı?

Ben bulabildiğim tek yolu aşağıdaki sorguyu her iki sunucuda çalıştırmak ve sonuç "hangi" eşleştiğini görmek için 2 tabloları aynı bilgileri içerdiği anlamına geliyordu.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

Yukarıdaki kodu kullanarak, sağlama toplamı değerleri aynı olduğu gibi tablo başarıyla çoğaltılmış görünüyor ama bu yöntemin ne kadar güvenilir olduğundan emin değilim.

Herkes bunu kontrol etmek için daha iyi bir yöntem biliyor mu veya bu iyi bir yol olup olmadığını?

Windows Server 2008 bilgisayarında SQL Server 2008 çalıştırıyorum.

Teşekkürler.

Yanıtlar:


11

Tam olarak bunu yapmanızı sağlayan araç tablediff'i aradığınızı düşünüyorum - farklılıklar için iki çoğaltılmış tabloyu karşılaştırın. Başlamak için bu makaleyi yararlı bulabilirsiniz .

İşte tablediff için bir GUI


Awsome, teşekkürler. Bunu yapmak için biraz okuma yaptım. Ayrıca GUI bağlantısı için teşekkürler, şeyleri gerçekten çok daha kolay hale getirmelidir!
Juan Velez


4

Veri ne kadar büyük ve veritabanları ile birbiriniz (ve siz) arasındaki bağlantılar ne kadar hızlı? Bir takım fikirler var:

Veriler bu kadar pratik olacak kadar küçükse SELECT * FROM <table> ORDER BY <pk>, her DB'de çalışın, sonuçları bir sekmeye veya virgülle ayrılmış dosyaya kaydedin (sonuçta elde edilen dosya boyutunu büyük ölçüde havaya uçurmak için boş alan hizalamayın) ve elde edilen çıktıyı tercih ettiğiniz fark türüyle karşılaştırın winmerge gibi yarar. Bu şekilde tüm verileri kesinlikle karşılaştırıyorsunuz .

Veritabanları birbirini görebiliyorsa (büyük olasılıkla çoğaltma ortağı olarak çalışabildikleri için) ve aralarındaki bağlantı yeterince yüksek bant genişliği ve yeterince düşük gecikme süresine sahipse, bağlı sunucu işlevini kullanabilirsiniz (bkz. Http://msdn.microsoft .com / en-us / library / ms190479.aspx ve ilgili belgeler) birkaç SQL deyimindeki tabloların içeriğini karşılaştırmak ve karşılaştırmak ( <table>aynı satırları olmayan satırları listelemek <linked_server>.<db>..<table>ve tam tersi) iki yerel tablonun içeriğini karşılaştırırsınız. Bu potansiyel olarak nispeten yavaş bir seçenektir, ancak otomatikleştirmek için oldukça güçlü bir kontrol olabilir.

Aktarılması gereken veri miktarını büyük ölçüde azaltmak istediğiniz için sağlama toplamlarını kullanmanız gerekiyorsa, daha iyi kalitede karmaları kullanabildiğiniz için işlev ailesinden HASHBYTESziyade CHECKSUMişlevlerini kullanın, böylece eşit şekilde çıktıklarından daha emin olabilirsiniz. Bu daha fazla CPU yoğundur, ancak büyük miktarlarda veri için I / O bağlı olacaksınız zaten CPU bağlı değilsiniz, bu yüzden birçok döngü yedek olacak (ve küçük miktarlar için önemli değil).

Karakter için tüm veri karakterlerini karşılaştırmak ve tüm verileri kapsayan tek bir sağlama toplamını karşılaştırmak arasında bir orta yol olarak SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>, her veritabanından dışa aktarabilir ve aynı olup olmadıklarını (veya SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>veri miktarını azaltmak için) bu sonuçları karşılaştırabilirsiniz . ancak çıkışta PK olması, varsa daha az sorguyla farklı satırları tanımlayabileceğiniz anlamına gelir). Tabii ki bu son seçenek, ortalama satırdaki veriler sonuçtaki karmadan daha küçükse anlamsızdır, bu durumda " her şeyi karşılaştır " seçeneği daha verimli olacaktır.


2

Tablediff yalnızca canlı veritabanlarındaki tabloları karşılaştırırken, veritabanı yedeklemesini canlı bir veritabanıyla karşılaştırabilen birçok 3. taraf aracı vardır.

Ayrıca, bir tabloda var olan ve başka bir tabloda bulunmayan verileri görmek için aşağıdaki komut dosyasını yürütebilirsiniz, ancak bunu yalnızca 2 canlı veritabanına karşı yapabilirsiniz:

MyTest.dbo.testtable'TAN VAR OLMADAN SEÇİN (MyTest2.dbo.TestTable'DAN SEÇİNİZ * SELECT MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


Bilgi için teşekkürler! Buna bakacağım. Bu senaryo yardımcı olacak!
Juan Velez

sık kullandığım bir şey except: select id, name from Table1 except select id, name from Table2size Table1'deki her şeyi verecek ama Table2'de değil
Adam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.