1

2つのデータベース間のデータロードの結果を確認しようとしています。残念ながら、私は1つのデータベース(MySQL)に直接アクセスすることしかできません。MSSQLを管理している会社は、APIを介してデータベースを公開できます。

私がやりたいのは、行セット全体で特定の列の整合性をチェックすることです。もともと、列に対してCRCまたはハッシュチェックを実行できることを望んでいましたが、これを実行する互換性のある方法はないようです。

たとえば、MySQLの列に対してCRC32を実行できますが、MSSQLで同じことを実行する信頼できる方法はありません。または、MSSQLにはCHECKSUM_AGGがありますが、MySQLには代替手段がありません。

最終的に、チェックサムが異なる場合は、変更が必要な行を特定するためにバイナリ検索を実行したいと思います。

現在、バルクロードインターフェイスはなく、SSISは使用できません(MSSQLサーバーは私の会社の一部ではありません)。

4

1 に答える 1

3

これに戻って、最終的に実装したソリューションについて説明しようと思いました。これは首の大きな痛みでした!

まず、サーバー上の MySQL とリモート サーバー上の MSSQL のバージョンが固定されているため、一般的なエンコード方法がありませんでした。MSSQL API は UTF- 16LEでデータを返し、MySQL データベースはラテン 1 テーブルに格納された Unicode データを持っていました。

まず、比較するフィールドを連結し、次に結果を MD5 しました。MySQL の結果を MSSQL HASHBYTES 関数の出力と一致させるには、次のようにする必要がありました。

SELECT ABS(CONV(CONCAT(
    IF(MID(MD5(CONC), -8 , 1) >= "8", "FFFFFFFF", ""),
    RIGHT(MD5(CONC), 8)
), 16, -10 )) AS CALC

ここで、CONC は、関心のあるフィールドを連結する副選択の結果です。

MSSQL サーバーでは、次のクエリを実行する必要がありました。

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

次に、中国の剰余定理に従って、3 つの大きな素数 (311,313,317) を法として、範囲全体で MD5 の合計を取りました。

これにより、チェックしていた範囲の 3 つの数値が得られました。各サーバーの特定の範囲で 3 つの数値がすべて一致した場合、データは一貫していると合理的に確信できます。

Latin-1 の Unicode を UTF-16LE に音訳するために必要な変更の詳細については割愛します。

于 2013-08-06T16:53:01.873 に答える