SQL Server和Oracle中的比较表

问题描述:

我有一套SQL脚本,用于将数据从SQL Server 2005中的表迁移到Oracle 11.我想比较两个数据库中的数据以确保它们正确迁移。SQL Server和Oracle中的比较表

我的来源是:SQL Server 2005.它有10个大表,大约有8000万行,20个表大约有100,000行。

我的目标是:Exadata上的Oracle 11,它具有与其源代码相似的表结构。

任何想法我可以做什么?有没有可用的工具?

+0

添加了'exadata'标签,因为我听说过迁移到Exadata时在以前的Oracle迁移中不存在的问题。尽管没有具体的分享。 – 2011-01-07 16:42:21

+1

需要注意的一点是,在SQL Server中,varchar或nvarchar的''是非空的空字符串。在Oracle中与null相同。根据您的比较工具和方法,SQL Server''可能被标记为与Oracle''不同,因此。 – 2011-01-08 00:07:14

也许你可以设计出能够对每个表中的每一列的函数:

  • 与值连接行号
  • 哈希它(MD5应该是上均可用)
  • 和计算合计按位散列值的异或。

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

缺点是:如果结果不一样,你不知道区别在哪里。你也许可以用1000行的数据块来分区你的表格。

我会尝试在SSMO中建立一个链接到Oracle数据库的服务器。 然后我会比较使用的表,除了运营商为每个表

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。当你有权访问远程机器时,你可以添加一个链接服务器。

+0

我不认为我们的数据库管理员喜欢链接servres的想法,所以将不得不做其他事情: – Vikram 2011-01-07 14:26:40

你似乎在问什么:“我如何单元测试我的ETL解决方案,以确保我的源数据库中的数据能够忠实地复制到我的目标数据库中?”

当您进入表格数量和大小的细节时,它向我建议您想要深入比较每个表格中每列的每个值。

我不知道有任何这样的工具。这种检查可能会持续很长时间,但由于这是一次性检查,因此可行。您可以使用C#或Java或其他您熟悉的语言编写这样的东西。

另一个想法是检查每个表的较小子集。如果ETL工具正确地执行了一小部分子集,除非出现异常情况,否则没有理由相信它会与其余部分一起失败。

您可以批量迁移数据,随时检查并提交每个数据。

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