我们在项目中面临一个问题,即数据验证问题。
该项目涉及从Sybase到Oracle数据库的数据复制。跨越Sybase,Oracle的表A的表结构是相同的。所有数据库中的列和主键组合相同。例如如果Sybase的表A包含列a,b和C,则具有相同名称和相同列的相同表将在不同的数据库中可用。
我们完成了复制的东西部分。但是我们遇到了一些无声的失败,比如数据差异只是想知道是否有任何工具可用于此。
有关他的任何信息都会有所帮助。谢谢。
Sybase(现在的SAP)有几个产品可用于数据比较和对帐:
rs_subcmp
- 一个较旧的32位工具,附带Sybase Replication Server
产品,可用于比较源和目标之间的数据;可以根据差异生成SQL协调脚本,然后将其应用于目标以使其与源同步;如果您的表格大小超过1GB,您仍然可以使用rs_subcmp
但是您需要创建多个比较作业(通过where
子句)来处理表格的不同子集[我不记得rs_subcmp
是否可以用于异构复制设置,例如ASE-Oracle。Data Assurance (DA)
- 更新的64位产品......也来自Sybase ...它还可以比较数据和(重新)同步来自源的目标(通过SQL协调脚本或直接); DA
能够处理少数不同RDBMS产品(例如ASE-Oracle)之间的比较;我目前正在开发一个项目,其中一个要求是验证(并在需要时协调)从Oracle迁移到HANA的200 + TB数据,并且我使用DA
作为项目的验证/协调部分正如@TenG在他的回答中暗示的那样,比较数据和生成代码以协调差异需要花费大量精力。滚动自己的代码是可行的,但需要做很多工作。如果你有钱,你可能会发现第三方工具可以为你完成大部分/全部工作。
如果您使用第三方产品将数据从Sybase复制到Oracle,则可能需要查看同一供应商是否具有您可以使用的比较/验证/协调工具。
我参与了一些迁移项目,关键部分一直是数据协调。
我只能根据可用工具的限制和最小化停机时间以及可用空间的限制来讨论我们采用的方法。
在所有情况下,我都编写了两个级别的脚本 - 摘要视图和“深度潜水”。我们找不到任何可以及时完成我们想要的工具。事实上,即使我们发现的迁移工具也有局限性(数据泵,sqlloader,黄金门等)和手工编码脚本来处理我们发现在标准工具中缺少或太慢的位。
摘要视图因项目而异。它是基于部分功能(交易匹配的会计数字)供用户验证,部分技术。对于较小的表,我们可以编写简单的报表,差异很直接。
对于较大的表,我们编写了技术报告,查看数据带(例如将PK组分为1000个)收集所有列数据并生成校验和,为每个表生成报告,如:
PK ID Range Start Checksum
----------------- -----------
100000 22773377829
200000 38938938282
.
.
然后,来自每个数据库的相应表对彼此“差异”以突出显示差异。然后可以更详细地查看发现的任何差异。
这些脚本以这样的方式编写,允许它们并行运行,查看离散的波段。 Te波段范围也是可调的,以获得最佳吞吐量。这显然加快了速度。
脚本是触发sqlplus报告的shell脚本,类似于源数据库。
在一个项目中,没有足够的磁盘空间来执行这些报告,因此我编写了一个Java程序,它使用块队列来获取和比较行集,并排查询这两个数据库。在记忆中意味着这超级快。
对于“深入研究”,我们查看了关键表或报告校验和差异的表的详细信息。
对于用户报告,用户将指定他们想要看到的内容,并且我们相应地编写报告。
在最后一个项目中,发现的唯一差异是由字符集转换问题引起的(带有重音符号的人名未正确处理)。
在整体数据集较小的项目中,我们将数据提取到XML文件,并编写了一个Java工具来处理对和报告差异。
SAP / Sybase rs_subcmp工具非常强大,也很难使用。详情见:
您必须传递关键字段信息,但一旦这样做,它可以在瞬态差异后重试/重新启动比较流。很花哨。
rs_subcmp希望能够处理Sybase数据源。因此,要与Oracle进行比较,您可能必须设置其中一个Sybase到Oracle网关产品($$$$$)。
您是否可以安装Oracle ODBC驱动程序并对其进行配置以允许Sybase客户端访问Oracle?我猜不是(但这超出了我的经验范围)。
请注意rs_subcmp的“-h”选项。文档只是说它运行“快速比较”,但它实际上正在做的是使用hashbytes()函数运行查询。就像是:
select keyfield1,keyfield2, hashbytes("Md5",datacol1,datacol2,datacol3)
from mytable
因此,这种查询可能适用于上面讨论的“摘要视图”类型比较(如果Oracle STANDARD_HASH()函数输出与Sybase hashbytes()函数匹配(再次,在我的经验之外))
注意,从ASE 16开始,hash()和hashbytes()函数存在一个错误,该函数针对大型varbinary列运行Md5哈希选项,它们可能会耗尽所有过程缓存,从而可能导致服务器崩溃(CR 811073)