Kiểm tra xem 2 bảng (trên các máy chủ khác nhau) có cùng dữ liệu chính xác không


10

Vì vậy, có vẻ như công ty đang lưu trữ Máy chủ SQL của chúng tôi đã gặp một số rắc rối với việc sao chép từ máy chủ sản xuất sang máy chủ sao lưu ... Tôi tin rằng một số bảng đã được sao chép chính xác. Nhân rộng được thực hiện hàng ngày (sau giờ).

Có cách nào để tôi có thể so sánh 2 bảng giống nhau, 1 từ bản sao lưu so với 1 từ máy chủ sản xuất để xem liệu sao chép đêm qua có hoạt động không?

Cách duy nhất tôi có thể tìm thấy là chạy truy vấn sau trên cả hai máy chủ và xem liệu kết quả có khớp với "có thể" có nghĩa là 2 bảng có chứa cùng một thông tin hay không.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

bằng cách sử dụng đoạn mã trên, có vẻ như bảng đã sao chép thành công vì các giá trị tổng kiểm tra là như nhau nhưng tôi không chắc phương thức này đáng tin cậy đến mức nào.

Có ai biết một phương pháp tốt hơn để kiểm tra điều này hoặc nếu đây là một cách tốt?

Tôi đang chạy SQL Server 2008 trên máy tính windows server 2008.

Cảm ơn.

Câu trả lời:


11

Tôi tin rằng bạn đang tìm kiếm công cụ tablediff cho phép bạn thực hiện chính xác điều đó - so sánh hai bảng được sao chép để tìm sự khác biệt. Bạn có thể thấy bài viết này hữu ích, để bắt đầu.

Đây là một GUI cho tablediff


Tuyệt vời, cảm ơn. Tôi có một số đọc để làm về điều này. Cũng cảm ơn vì liên kết đến GUI, nó sẽ giúp mọi thứ dễ dàng hơn rất nhiều thực sự đánh giá cao nó!
Juan Velez


4

Dữ liệu lớn đến mức nào và các liên kết giữa cơ sở dữ liệu với nhau (và bạn) nhanh như thế nào? Có một số ý tưởng:

Nếu dữ liệu đủ nhỏ để thực tế, hãy chạy SELECT * FROM <table> ORDER BY <pk>trên mỗi DB, lưu kết quả vào một tab hoặc tệp được phân tách bằng dấu phẩy (không được căn chỉnh theo chiều rộng để làm tăng kích thước tệp kết quả một cách ồ ạt) và so sánh kết quả đầu ra với loại khác biệt ưa thích của bạn tiện ích như winmerge. Bằng cách đó, bạn đang so sánh hoàn toàn tất cả các dữ liệu.

Nếu các cơ sở dữ liệu có thể nhìn thấy nhau (rất có thể vì chúng có thể hoạt động như các đối tác sao chép) và liên kết giữa chúng là băng thông đủ cao và độ trễ đủ thấp, bạn có thể sử dụng chức năng máy chủ được liên kết (xem http://msdn.microsoft .com / en-us / library / ms190479.aspx và tài liệu liên quan) để so sánh so sánh nội dung của các bảng trong một vài câu lệnh SQL (liệt kê các hàng trong <table>đó không có hàng giống hệt nhau <linked_server>.<db>..<table>và ngược lại) giống như bạn sẽ so sánh nội dung của hai bảng cục bộ. Đây là một tùy chọn tương đối chậm có khả năng, nhưng có thể là một kiểm tra khá mạnh mẽ để tự động hóa.

Nếu bạn đang cần sử dụng tổng kiểm tra vì bạn muốn giảm đáng kể lượng dữ liệu cần truyền, hãy sử dụng HASHBYTESthay vì nhóm CHECKSUMchức năng vì bạn có thể sử dụng hàm băm chất lượng tốt hơn để bạn yên tâm hơn khi chúng ra bằng nhau. Điều này đòi hỏi nhiều CPU hơn, nhưng với lượng dữ liệu lớn, bạn sẽ bị ràng buộc I / O chứ không phải CPU bị ràng buộc vì vậy sẽ có nhiều chu kỳ dự phòng (và với số lượng nhỏ đơn giản là không thành vấn đề).

Là cơ sở giữa việc so sánh tất cả các ký tự dữ liệu và so sánh một tổng kiểm tra bao gồm tất cả dữ liệu, bạn có thể xuất SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>từ mỗi cơ sở dữ liệu và so sánh các kết quả đó để xem liệu chúng có giống nhau không (hoặc SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>để giảm lượng dữ liệu chảy, nhưng có PK trong đầu ra sẽ có nghĩa là bạn có thể xác định các hàng khác nhau, nếu có, với ít truy vấn hơn). Tất nhiên tùy chọn cuối cùng này là vô nghĩa nếu dữ liệu trong hàng trung bình nhỏ hơn hàm băm kết quả, trong trường hợp đó, tùy chọn "so sánh mọi thứ " sẽ hiệu quả hơn.


2

Mặc dù tablediff chỉ so sánh các bảng trong cơ sở dữ liệu trực tiếp, có rất nhiều công cụ của bên thứ 3 có thể so sánh bản sao lưu cơ sở dữ liệu với cơ sở dữ liệu trực tiếp.

Bạn cũng có thể thực thi đoạn mã sau để xem dữ liệu tồn tại trong một bảng và không tồn tại trong bảng khác, nhưng bạn chỉ có thể làm điều đó với 2 cơ sở dữ liệu trực tiếp:

CHỌN * TỪ MyTest.dbo.testtable WHERE KHÔNG EXISTS (CHỌN * TỪ MyTest2.dbo.TestTable WHERE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


Cảm ơn bạn về thông tin! Tôi sẽ xem xét điều đó. Kịch bản đó sẽ hữu ích!
Juan Velez

một cái gì đó tôi đã sử dụng thường xuyên là except: select id, name from Table1 except select id, name from Table2sẽ cung cấp cho bạn mọi thứ trong Bảng 1 nhưng không phải trong Bảng 2
Adam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.