ตรวจสอบว่า 2 ตาราง (บนเซิร์ฟเวอร์ที่แตกต่างกัน) มีข้อมูลที่แน่นอนเหมือนกัน


10

ดังนั้นดูเหมือนว่า บริษัท ที่โฮสต์ SQL Server ของเรามีปัญหากับการจำลองแบบจากเซิร์ฟเวอร์การผลิตไปยังเซิร์ฟเวอร์การสำรองข้อมูล ... ฉันเชื่อว่าบางส่วนของตารางได้ถูกจำลองอย่างถูกต้องแม้ว่า การจำลองแบบเสร็จสิ้นทุกวัน (หลังจากชั่วโมง)

มีวิธีที่ฉันสามารถเปรียบเทียบ 2 ของตารางเดียวกัน 1 จากสำรอง vs 1 จากเซิร์ฟเวอร์การผลิตเพื่อดูว่าการจำลองแบบคืนที่ผ่านมาทำงานหรือไม่

วิธีเดียวที่ฉันสามารถค้นหาได้คือเรียกใช้แบบสอบถามต่อไปนี้บนเซิร์ฟเวอร์ทั้งสองและดูว่าผลลัพธ์ที่ตรงกับ "อาจ" หมายความว่าถึง 2 ตารางมีข้อมูลเดียวกันหรือไม่

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

ใช้รหัสข้างต้นดูเหมือนว่าตารางทำซ้ำได้สำเร็จเนื่องจากค่า checksum เหมือนกัน แต่ฉันไม่แน่ใจว่าวิธีนี้น่าเชื่อถือเพียงใด

ไม่มีใครรู้วิธีที่ดีกว่าในการตรวจสอบนี้หรือถ้าเป็นวิธีที่ดี?

ฉันใช้ SQL Server 2008 บนคอมพิวเตอร์ที่ใช้ Windows Server 2008

ขอบคุณ

คำตอบ:


11

ฉันเชื่อว่าคุณกำลังมองหาเครื่องมือtablediffซึ่งช่วยให้คุณทำอย่างนั้น - เปรียบเทียบสองตารางที่ทำซ้ำสำหรับความแตกต่าง คุณอาจพบว่าบทความนี้มีประโยชน์ในการเริ่มต้น

นี่คือ GUIสำหรับ tablediff


น่ากลัวขอบคุณ ฉันได้อ่านเกี่ยวกับเรื่องนี้ ขอบคุณสำหรับลิงค์ไปยัง GUI มันควรทำให้สิ่งต่าง ๆ ง่ายขึ้นขอบคุณจริงๆ!
Juan Velez

4

ฉันพบบทความนี้น่าสนใจเป็นพิเศษ: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/

"ถ้าคุณต้องการความรวดเร็วมากกว่าความแม่นยำ - ใช้ CHECKSUM ไม่ใช่ BINARY_CHECKSUM

หากคุณต้องการความแม่นยำมากกว่าความเร็ว - ใช้ HASHBYTES "


4

ข้อมูลมีขนาดใหญ่เพียงใดและการเชื่อมโยงระหว่างฐานข้อมูลและความเร็ว (และคุณ) มีความรวดเร็วเพียงใด มีแนวคิดหลายประการ:

หากข้อมูลมีขนาดเล็กพอที่จะใช้งานได้จริงให้เรียกใช้SELECT * FROM <table> ORDER BY <pk>บนแต่ละฐานข้อมูลบันทึกผลลัพธ์ลงในแท็บหรือไฟล์ที่คั่นด้วยจุลภาค (ไม่เว้นระยะชิดกันเนื่องจากขนาดของไฟล์ที่เกิดขึ้นมีขนาดใหญ่มาก) และเปรียบเทียบผลลัพธ์ที่ได้ โปรแกรมอรรถประโยชน์เช่น winmerge วิธีการที่คุณกำลังเปรียบเทียบอย่างทุกข้อมูล

ถ้าฐานข้อมูลสามารถมองเห็นกันและกัน (ส่วนใหญ่น่าจะเป็นพวกเขามีความสามารถที่จะทำงานเป็นคู่การจำลอง) และเชื่อมโยงระหว่างพวกเขาอยู่ในระดับสูงพอและแบนด์วิดธ์ latency ต่ำพอที่คุณสามารถใช้ฟังก์ชั่นเซิร์ฟเวอร์ที่เชื่อมโยง (ดูhttp://msdn.microsoft .com / en-us / library / ms190479.aspxและเอกสารที่เกี่ยวข้อง) เพื่อเปรียบเทียบเนื้อหาของตารางในคำสั่ง SQL สองรายการ (แสดงรายการแถวใน<table>ที่ไม่มีแถวที่เหมือนกัน<linked_server>.<db>..<table>และในทางกลับกัน) เช่นเดียวกับ คุณจะเปรียบเทียบเนื้อหาของสองตารางท้องถิ่น นี่เป็นตัวเลือกที่ค่อนข้างช้า แต่อาจเป็นการตรวจสอบที่ทรงพลังในการทำให้เป็นอัตโนมัติ

หากคุณต้องการใช้ checksums เพราะคุณต้องการลดจำนวนข้อมูลที่ต้องโอนให้ใช้HASHBYTESมากกว่าCHECKSUMฟังก์ชั่นตระกูลเนื่องจากคุณสามารถใช้แฮชที่มีคุณภาพดีกว่าเพื่อให้คุณมั่นใจได้ว่ามันจะออกมาเท่ากัน นี่เป็น CPU ที่มีความเข้มข้นมากกว่า แต่สำหรับข้อมูลจำนวนมากคุณจะถูกผูกไว้กับ I / O ไม่ใช่ CPU ที่ถูกผูกไว้ดังนั้นจะมีวงจรสำรองมากมาย (และสำหรับจำนวนเล็กน้อยก็ไม่สำคัญ)

ในฐานะที่เป็นสื่อกลางระหว่างการเปรียบเทียบข้อมูลอักขระสำหรับอักขระและการเปรียบเทียบเช็คซัมเดียวที่ครอบคลุมข้อมูลทั้งหมดคุณสามารถส่งออกSELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>จากแต่ละฐานข้อมูลและเปรียบเทียบผลลัพธ์เหล่านั้นเพื่อดูว่าพวกเขาเหมือนกันหรือไม่หรือSELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>ลดปริมาณข้อมูล โฟลว์ แต่การมี PK ในเอาต์พุตจะหมายความว่าคุณสามารถระบุแถวที่แตกต่างกันถ้ามีให้ทำพร้อมกับเคียวรีเพิ่มเติมที่น้อยลง) แน่นอนว่าตัวเลือกสุดท้ายนี้ไม่มีจุดหมายหากข้อมูลในแถวเฉลี่ยมีขนาดเล็กกว่าแฮชที่ได้ซึ่งในกรณีนี้ตัวเลือก"เปรียบเทียบทุกอย่าง " จะมีประสิทธิภาพมากขึ้น


2

ในขณะที่ tablediff เปรียบเทียบเฉพาะตารางในฐานข้อมูลที่ใช้งานจริงมีเครื่องมือบุคคลที่ 3 จำนวนมากที่สามารถเปรียบเทียบการสำรองข้อมูลฐานข้อมูลกับฐานข้อมูลจริง

คุณยังสามารถเรียกใช้สคริปต์ต่อไปนี้เพื่อดูข้อมูลที่มีอยู่ในหนึ่งตารางและไม่มีอยู่ในอีกตารางหนึ่ง แต่คุณสามารถทำได้กับฐานข้อมูลที่ใช้งานจริง 2 แห่งเท่านั้น:

เลือก * จาก MyTest.dbo.testtable ซึ่งไม่มีอยู่ (เลือก * จาก MyTest2.dbo.TestTable โดยที่ MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


ขอบคุณสำหรับข้อมูล! ฉันจะดูว่า สคริปต์นั้นจะมีประโยชน์!
Juan Velez

สิ่งที่ฉันได้ใช้บ่อยคือexcept: select id, name from Table1 except select id, name from Table2จะให้ทุกอย่างในตารางที่ 1 แต่ไม่ได้อยู่ใน Table2
อดัม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.