【问题标题】:MySQL - sql server: consistency checkMySQL - sql server:一致性检查
【发布时间】:2012-08-23 00:50:04
【问题描述】:

我正在尝试检查两个数据库之间的数据加载结果。不幸的是,我只能直接访问一个数据库(MySQL),管理 MSSQL 的公司可以通过 API 向我们公开它。

我想做的是检查行集中某些列的一致性。最初,我希望能够对列运行 CRC 或哈希检查,但似乎没有兼容的方式来执行此操作。

例如,我们可以对 MySQL 中的列运行 CRC32,但在 MSSQL 上没有可靠的方法来执行相同的操作。或者,在 MSSQL 上有 CHECKSUM_AGG,但在 MySQL 上没有其他选择。

最终结果是,如果校验和不同,我想进行二进制搜索以识别需要更改的行。

目前没有批量加载接口,SSIS不可用(MSSQL服务器不属于我公司)。

【问题讨论】:

    标签: mysql sql-server data-consistency


    【解决方案1】:

    我想我会回到这个并描述我们最终实施的解决方案。这是颈部的主要疼痛!

    首先,由于我们服务器上的 MySQL 和远程服务器上的 MSSQL 的版本是固定的,所以没有通用的编码方法。 MSSQL API 以 UTF-16LE 格式返回数据,MySQL 数据库将 Unicode 数据存储在 Latin-1 表中sigh

    首先,我们将要比较的字段连接起来,然后对结果进行 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 ) + ...
    

    然后,根据Chinese Remainder Theorem,我们对整个范围内的 MD5 求和,以三个大素数 (311,313,317) 为模

    这为我们检查的范围提供了三个数字。我们可以合理地确定,如果所有三个数字都匹配每个服务器上的给定范围,则数据是一致的。

    我不会详细说明我们为将 Latin-1 中的 Unicode 音译为 UTF-16LE 所做的修改

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 1970-01-01
      • 2011-02-19
      • 2019-12-31
      • 2011-04-28
      • 1970-01-01
      • 2010-12-04
      • 2015-01-29
      • 2013-04-01
      相关资源
      最近更新 更多