अगर 2 टेबल (विभिन्न सर्वरों पर) की जाँच एक ही सटीक डेटा है


10

तो ऐसा लगता है कि जो कंपनी हमारे SQL सर्वर की मेजबानी कर रही है, उसे उत्पादन सर्वर से बैकअप सर्वर तक प्रतिकृति के साथ कुछ परेशानी हो रही है ... मेरा मानना ​​है कि कुछ तालिकाओं को सही ढंग से प्रतिकृति किया गया है। प्रतिकृति दैनिक (घंटों के बाद) की जाती है।

वहाँ एक तरह से मैं एक ही तालिकाओं में से 2 की तुलना कर सकता हूं, 1 बैकअप बनाम 1 से उत्पादन सर्वर से यह देखने के लिए कि क्या पिछली रात की प्रतिकृति ने काम किया है?

एकमात्र तरीका जो मैं पा सकता था, वह दोनों सर्वरों पर निम्नलिखित क्वेरी को चलाने के लिए था और यह देखने के लिए कि क्या परिणाम मेल खाता है, जिसका अर्थ "2" हो सकता है जिसमें समान जानकारी हो।

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

उपरोक्त कोड का उपयोग करना, ऐसा लगता है कि तालिका ने सफलतापूर्वक प्रतिकृति की है क्योंकि चेकसम मान समान हैं लेकिन मुझे यकीन नहीं है कि यह विधि कितनी विश्वसनीय है।

क्या किसी को यह पता लगाने के लिए एक बेहतर विधि का पता है या यह एक अच्छा तरीका है?

मैं Windows Server 2008 कंप्यूटर पर SQL Server 2008 चला रहा हूं।

धन्यवाद।

जवाबों:


11

मेरा मानना ​​है कि आप टूल टैलिफ की तलाश कर रहे हैं जो आपको बिल्कुल ऐसा करने देता है - मतभेदों के लिए दो प्रतिकृति तालिकाओं की तुलना करें। आरंभ करने के लिए आपको यह लेख उपयोगी लग सकता है ।

यहाँ tablediff के लिए एक GUI है


Awsome, धन्यवाद। मुझे इस पर कुछ पढ़ने को मिला। जीयूआई के लिंक के लिए भी धन्यवाद, यह चीजों को बहुत आसान बना सकता है जो वास्तव में इसकी सराहना करते हैं!
जुआन वेलेज़

4

मुझे यह लेख विशेष रूप से दिलचस्प लगा: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/

"यदि आपको सटीकता पर गति की आवश्यकता है - चेकस्कैम का उपयोग करें, न कि BINARY_CHECKSUM।

यदि आपको गति पर सटीकता की आवश्यकता है - HASHBYTES का उपयोग करें। "


4

डेटा कितना बड़ा है और डेटाबेस और एक-दूसरे (और आप) के बीच के लिंक कितने तेज़ हैं? विचारों की एक संख्या है:

यदि डेटा इतना छोटा है कि यह व्यावहारिक है, तो SELECT * FROM <table> ORDER BY <pk>प्रत्येक DB पर चलाएं , परिणामों को एक टैब या अल्पविराम सीमांकित फ़ाइल में सहेजें (संरेखित नहीं किया गया जो कि परिणामस्वरूप फ़ाइल आकार को बड़े पैमाने पर उड़ाता है) और आपके पसंदीदा भिन्न प्रकार के साथ परिणामी आउटपुट की तुलना करें विनमर जैसे उपयोगिता। इस तरह से आप बिल्कुल सभी डेटा की तुलना कर रहे हैं ।

यदि डेटाबेस एक दूसरे को देख सकते हैं (सबसे अधिक संभावना है कि वे प्रतिकृति भागीदारों के रूप में काम करने में सक्षम हैं) और उनके बीच की कड़ी उच्च बैंडविड्थ और कम पर्याप्त विलंबता है, तो आप लिंक किए गए सर्वर कार्यक्षमता का उपयोग कर सकते हैं (देखें http://msdn.microsoft .com / en-us / पुस्तकालय / ms190479.aspx और संबंधित प्रलेखन) एसक्यूएल बयानों की एक जोड़ी में तालिकाओं की सामग्री की तुलना करने के लिए (पंक्तियों को सूचीबद्ध <table>करना जिसमें समान पंक्तियाँ नहीं हैं <linked_server>.<db>..<table>और इसके विपरीत) आप दो स्थानीय तालिकाओं की सामग्री की तुलना करेंगे। यह संभावित रूप से धीमा विकल्प है, लेकिन स्वचालित करने के लिए काफी शक्तिशाली जांच हो सकती है।

यदि आपको चेकसम का उपयोग करने की आवश्यकता है क्योंकि आप स्थानांतरित किए जाने वाले डेटा की मात्रा को बहुत कम करना चाहते हैं, HASHBYTESतो CHECKSUMफ़ंक्शंस के परिवार के बजाय उपयोग करें क्योंकि आप बेहतर गुणवत्ता वाले हैश का उपयोग कर सकते हैं ताकि आप उनके द्वारा बराबर आने का अधिक आश्वासन दें। यह अधिक सीपीयू इंटेंसिव है, लेकिन बड़ी मात्रा में डेटा के लिए आप I / O बाध्य होंगे, सीपीयू बाध्य नहीं होगा, इसलिए कई चक्रों को छोड़ दिया जाएगा (और छोटी मात्रा के लिए बस कोई फर्क नहीं पड़ेगा)।

सभी डेटा कैरेक्टर-फॉर-कैरेक्टर की तुलना करने और सभी डेटा को कवर करने वाले एकल चेकसम की तुलना करने के बीच एक मध्य-मैदान के रूप में, आप SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>प्रत्येक डेटाबेस से निर्यात कर सकते हैं और उन परिणामों की तुलना करके देख सकते हैं कि क्या वे समान हैं (या SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>डेटा की मात्रा कम करने के लिए बहती है, लेकिन आउटपुट में पीके होने का मतलब है कि आप उन पंक्तियों की पहचान कर सकते हैं जो अलग-अलग हैं, यदि कोई हो, कम प्रश्नों के साथ)। बेशक यह अंतिम विकल्प व्यर्थ है यदि औसत पंक्ति में डेटा परिणामी हैश से छोटा है, तो उस स्थिति में " सब कुछ की तुलना करें " विकल्प अधिक कुशल होगा।


2

जबकि tablediff लाइव डेटाबेस में केवल तालिकाओं की तुलना करता है, बहुत सारे 3 पार्टी उपकरण हैं जो डेटाबेस बैकअप की तुलना एक लाइव डेटाबेस से कर सकते हैं।

आप निम्न स्क्रिप्ट को एक तालिका में मौजूद डेटा और दूसरे में मौजूद नहीं देखने के लिए भी निष्पादित कर सकते हैं, लेकिन आप ऐसा केवल 2 लाइव डेटाबेस के विरुद्ध कर सकते हैं:

चयन करें * MyTest.dbo.testtable से जहां यह नहीं है (MyTest2.dbo से चयन करें * ।TestTable MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


जानकारी के लिए धन्यवाद! मैं उस पर गौर करूंगा। वह स्क्रिप्ट मददगार होगी!
जुआन वेलेज़

मैंने जो कुछ अक्सर उपयोग किया है वह है except: select id, name from Table1 except select id, name from Table2आपको टेबल 1 में सब कुछ दे देंगे लेकिन टेबल 2 में नहीं
एडम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.