MySQL-sql server:一致性检查



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

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

例如,我们可以针对MySQL中的列运行CRC32,但在MSSQL上没有可靠的方法可以做到这一点。或者,MSSQL上有CHECKSUM_AGG,但MySQL上没有其他选项。

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

目前没有大容量加载接口,SSIS也不可用(MSSQL服务器不是我公司的一部分)。

我想我会回到这里,描述我们最终实现的解决方案。这是脖子上的一大痛!

首先,由于我们服务器上的MySQL和远程服务器上的MSSQL的固定版本,没有常见的编码方法。MSSQL API以UTF-16LE返回数据,MySQL数据库的Unicode数据存储在Latin-1表中叹息

首先,我们将要比较的字段连接起来,然后对结果进行MD5。为了使MySQL结果与MSSQLHASHYTES函数的输出相匹配,我们必须这样做:

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 ) + ...

然后,根据中国余数定理,我们取整个范围内MD5的和,取三个大素数(311313317)的模

这给了我们三个我们正在检查的范围的数字。我们可以合理地确定,如果每台服务器上给定范围内的三个数字都匹配,那么数据是一致的。

我将省去我们为将拉丁语中的Unicode音译为UTF-16LE

而必须进行的编码的细节

相关内容

  • 没有找到相关文章

最新更新