서로 다른 서버에있는 2 개의 테이블이 동일한 정확한 데이터를 가지고 있는지 확인


10

따라서 SQL Server를 호스팅하는 회사는 프로덕션 서버에서 백업 서버로의 복제에 문제가있는 것 같습니다. 일부 테이블이 올바르게 복제되고 있다고 생각합니다. 매일 (시간 후) 복제가 수행됩니다.

지난 밤 복제가 작동했는지 확인하기 위해 동일한 테이블 중 2 개를 백업에서 1 개와 프로덕션 서버에서 1 개를 비교할 수있는 방법이 있습니까?

내가 찾을 수있는 유일한 방법은 두 서버 모두에서 다음 쿼리를 실행하고 결과가 2 개의 테이블에 동일한 정보가 포함되어 있음을 의미하는 결과와 일치하는지 확인하는 것입니다.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

위의 코드를 사용하면 체크섬 값이 동일하기 때문에 테이블이 성공적으로 복제 된 것 같지만이 방법이 얼마나 안정적인지 잘 모르겠습니다.

누구든지 이것을 확인하는 더 좋은 방법을 알고 있거나 이것이 좋은 방법인지 알고 있습니까?

Windows Server 2008 컴퓨터에서 SQL Server 2008을 실행하고 있습니다.

감사.

답변:


11

나는 당신이 정확하게 그렇게 할 수있는 tablediff 도구를 찾고 있다고 생각합니다 -차이점에 대해 두 개의 복제 된 테이블을 비교하십시오. 이 기사 를 시작하면 유용 할 것 입니다.

tablediff 의 GUI는 다음과 같습니다.


정말 고마워 나는 이것에 관한 독서를했습니다. 또한 GUI에 대한 링크 덕분에 훨씬 더 쉽게 이해할 수 있어야합니다!
Juan Velez


4

데이터는 얼마나 크며 데이터베이스와 서로 (그리고 당신) 사이의 링크는 얼마나 빠릅니까? 여러 가지 아이디어가 있습니다.

데이터가 충분히 작아서 실용적이라면 SELECT * FROM <table> ORDER BY <pk>각 DB 에서 실행 하고 결과를 탭 또는 쉼표로 구분 된 파일에 저장하고 (공백이 정렬되지 않아 결과 파일 크기가 크게 증가하지 않음) 결과 출력을 선호하는 diff 유형과 비교하십시오. winmerge와 같은 유틸리티. 그렇게하면 모든 데이터를 절대적으로 비교할 수 있습니다 .

데이터베이스가 서로를 볼 수 있고 (대부분 복제 파트너로 작동 할 수있을 가능성이 높음) 이들 사이의 링크가 충분한 대역폭과 낮은 대기 시간 인 경우 연결된 서버 기능을 사용할 수 있습니다 ( http://msdn.microsoft 참조) . .com / en-us / library / ms190479.aspx 및 관련 설명서)를 사용하여 몇 개의 SQL 문에서 테이블의 내용을 비교하고 ( <table>같은 행이없는 행을 나열 <linked_server>.<db>..<table>하거나 그 반대로) 두 로컬 테이블의 내용을 비교합니다. 이것은 잠재적으로 비교적 느린 옵션이지만 자동화하기위한 강력한 검사가 될 수 있습니다.

전송해야하는 데이터의 양을 크게 줄이려고 체크섬을 사용해야 HASHBYTES하는 경우,보다 CHECKSUM우수한 품질의 해시를 사용할 수 있으므로 기능 군 대신 사용하여 동등하게 나오도록하십시오. 이것은 CPU를 많이 사용하지만 많은 양의 데이터의 경우 CPU에 바운드되지 않고 I / O 바운드가되므로 많은 사이클이 필요합니다 (소량의 경우 간단하지 않습니다).

문자 별 모든 데이터를 비교하고 모든 데이터를 포함하는 단일 체크섬을 비교하는 중간 단계로서 SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>각 데이터베이스에서 내보내고 그 결과를 비교하여 동일한 지 확인하거나 SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>데이터 양을 줄일 수 있습니다. 흐름이 있지만 출력에 PK가 있으면 더 적은 쿼리로 다른 행을 식별 할 수 있습니다. 물론 평균 행의 데이터가 결과 해시보다 작은 경우이 마지막 옵션은 의미가 없습니다.이 경우 " 모든 항목 비교 "옵션이 더 효율적입니다.


2

tablediff는 라이브 데이터베이스의 테이블 만 비교하지만 데이터베이스 백업을 라이브 데이터베이스와 비교할 수있는 많은 타사 도구가 있습니다.

다음 스크립트를 실행하여 한 테이블에 존재하고 다른 테이블에 존재하지 않는 데이터를 볼 수 있지만 2 개의 라이브 데이터베이스에 대해서만 수행 할 수 있습니다.

존재하지 않는 경우 MyTest.dbo.testtable에서 SELECT * (MyTest2.dbo.testtable.f1에서 MyTest.dbo.testtable.f1에서 SELECT *


정보에 대해서 감사드립니다! 내가 살펴볼 게 그 스크립트가 도움이 될 것입니다!
Juan Velez

내가 자주 사용하는 것은 except: select id, name from Table1 except select id, name from Table2Table1의 모든 것을 줄 것 입니다 . 그러나 Table2의 것은 아닙니다.
Adam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.