在SQL Server和Oracle中比较表格

3
我有一组SQL脚本,用于将SQL Server 2005中的表数据迁移到Oracle 11。我想比较两个数据库中的数据,以确保它们被正确地迁移。
我的源是:SQL Server 2005。它有10个大表,大约有8000万行和20个表,大约有10万行。
我的目标是:Exadata上的Oracle 11,其表结构与其源相似。
你有什么想法?是否有可用的工具?

添加了“exadata”标签,因为我听说在迁移到Exadata时存在一些问题,而这些问题在之前的Oracle迁移中并不存在。不过目前没有具体的信息可以分享。 - BQ.
1
在比较中需要注意的一个问题是,在SQL Server中,varchar或nvarchar的''是非空的空字符串。在Oracle中,''与null相同。根据您的比较工具和方法,由于这个原因,SQL Server的''可能会被标记为与Oracle的''不同。 - Shannon Severance
3个回答

1

你可以设计一个函数,对于每个表的每一列:

  • 将行号与值连接起来
  • 进行哈希处理(md5 应该在两个数据库中都可用)
  • 计算哈希值的聚合位异或。

如果结果相同,则可能在两个数据库中具有相同的值,而无需在网络上传输大量数据。

缺点是:如果结果不同,则不知道差异在哪里。例如,您可以将表按1000行或其他大小的块进行分区。


0

我会尝试在SSMO中设置一个连接到Oracle数据库的链接服务器。 然后,我会使用except运算符比较每个表的数据。

select * from table1
except
select * from [link_server]..myschema.TABLE1
union
select * from [link_server]..myschema.TABLE1
except
select * from table1

注意:当Oracle表包含CLOB列时,我无法使其工作。

回复评论: 在本地计算机上安装SQL Server,您就是DBA。当您可以访问远程计算机时,可以向其添加链接服务器。


我不认为我们的数据库管理员喜欢联接服务器的想法,所以我们必须考虑其他解决方案 :( - Vikram

0

您似乎在询问:“如何对我的ETL解决方案进行单元测试,以确保我在源数据库中拥有的数据在目标数据库中得到忠实复制?”

当你涉及表格数量和大小的细节时,这让我想到你想要深入比较每个表中每个列中的每个值。

我不知道是否有这样的工具。这种检查可能需要很长时间,但由于这是一次性操作,所以是可行的。您可以使用C#、Java或其他您熟悉的语言编写此类程序。

另一个思路是检查每个表的较小子集。如果ETL工具可以正确处理小子集,则没有理由认为它会在其余部分失败,除非存在异常情况。

您可以批量迁移数据,并在每个批次中进行检查和提交。

另一个想法可能是采用统计方法:从每个表中随机抽取若干行并执行检查。


谢谢。是的,这正是我想问的,但由于对数据库的无知,我没有用简单的术语表达出来 :). 我正在考虑检查一小部分数据以减少此次检查所需的时间。我很想听听其他人的想法,所以想在这里提出问题。感谢您的反馈,它确实对我有所帮助。 - Vikram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接