2012-08-28 3 views
1

두 데이터베이스 사이에 데이터로드 결과를 확인하려고합니다. 불행히도 MSSQL을 관리하는 회사는 API를 통해 직접 하나의 데이터베이스 (MySQL)에만 액세스 할 수 있습니다.MySQL - SQL 서버 : 일관성 검사

행 세트의 특정 열의 일관성을 확인하고 싶습니다. 원래는 열에 대해 CRC 또는 해시 검사를 수행 할 수 있기를 바랬지 만이 작업을 수행하는 호환 방법이없는 것으로 보입니다.

예를 들어, 우리는 MySQL의 컬럼에 대해 CRC32를 실행할 수 있지만, MSSQL에서 동일하게 수행하는 신뢰할만한 방법은 없습니다. 또는 MSSQL에는 CHECKSUM_AGG가 있지만 MySQL에는 대안이 없습니다.

결국 변경 사항이 필요한 행을 식별하기 위해 체크섬이 다른 경우 이진 검색을 수행하고 싶습니다.

현재 대량로드 인터페이스가 없으며 SSIS를 사용할 수 없습니다 (MSSQL 서버는 회사에 속하지 않습니다).

답변

2

나는 이것으로 돌아와서 우리가 구현 한 솔루션을 설명 할 것이라고 생각했습니다. 이것은 목에 큰 고통이었습니다!

첫째, 우리 서버의 MySQL 버전과 원격 서버의 MSSQL 때문에 일반적인 인코딩 방법이 없었습니다. MSSQL API는 UTF-16LE 데이터를 반환, MySQL 데이터베이스는 라틴 1 테이블 한숨

는 첫째, 우리는 우리가 결과를 MD5'd, 우리가 비교 된 필드를 연결된에 저장된 유니 코드 데이터를했다. .

SELECT ABS(CONV(CONCAT(
    IF(MID(MD5(CONC), -8 , 1) >= "8", "FFFFFFFF", ""), 
    RIGHT(MD5(CONC), 8) 
), 16, -10)) AS CALC 
CONC 우리가 관심있는 분야들을 연결 부속 선택의 결과입니다

다음 MSSQL HASHBYTES 함수의 출력과 일치하는 MySQL의 결과를 얻기 위해, 우리는이 작업을 수행했다 MSSQL 서버에서, 우리는 다음과 같은 쿼리해야 할 일을했을 : 다음

SELECT ABS(CONVERT(INT,HASHBYTES('MD5', 
    CONVERT(NVARCHAR(4000), FIELD1) + 
    CONVERT(NVARCHAR(4000), FIELD2) + ... 

을, 우리는 당 Chinese Remainder Theorem

0123로, 전체 범위, 모듈 3 대 틱 소수 (311,313,317)에 걸쳐 MD5의 합계를했다

이것은 우리가 조사한 범위에 대해 세 개의 숫자를주었습니다. 각 서버의 주어진 범위에 대해 세 숫자가 일치하면 데이터가 일관성이 있음을 합리적으로 확신 할 수 있습니다.

라틴어 1의 유니 코드를 가져 오기 위해 수행해야하는 작업에 대한 세부 사항은 UTF-16LE로 번역됩니다.