【问题标题】:Compare tables in SQL Server and Oracle比较 SQL Server 和 Oracle 中的表
【发布时间】:2016-11-02 07:03:03
【问题描述】:

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

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

我的目标是:Exadata 上的 Oracle 11,其表结构与其源类似。

知道我能做什么吗?有没有可用的工具?

【问题讨论】:

  • 添加了“exadata”标签,因为我听说迁移到 Exadata 的问题在之前的 Oracle 迁移中不存在。不过没有什么特别要分享的。
  • 比较中需要注意的一个问题是,在 SQL Server 中,varchar 或 nvarchar 的 '' 是非空的空字符串。在 Oracle '' 中与 null 相同。根据您的比较工具和方法,SQL Server '' 可能因此被标记为与 Oracle 的 '' 不同。

标签: oracle sql-server-2005 comparison


【解决方案1】:

你也许可以设计一个函数来处理每个表上的每一列:

  • 将行号与值连接起来
  • 散列(md5 应该在两者上都可用)
  • 并计算哈希值的聚合按位异或。

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

缺点是:如果结果不一样,你不知道区别在哪里。例如,您可以按 1000 行的块等对表进行分区。

【讨论】:

    【解决方案2】:

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

    当您详细了解表格数量及其大小时,它向我建议您要深入比较每个表格中每一列中的每个值。

    我不知道有任何此类工具。这样的检查可能会运行很长时间,但由于它是一次性的,所以它是可行的。你可以用 C# 或 Java 或其他你喜欢的语言编写这样的东西。

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

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

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

    【讨论】:

    • 谢谢。是的,这正是我要问的,而且我对数据库的无知,我不能简单地说:)。我正在考虑检查一个较小的子集以减少运行此检查所需的时间。我有兴趣听到人们有任何其他想法,所以想在这里提出这个问题。感谢您的投入,它肯定对我有帮助。
    【解决方案3】:

    我会尝试在 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。当您有权访问远程计算机时,您可以向其添加链接服务器。

    【讨论】:

    • 我不认为我们的 DBA 喜欢链接服务器的想法,所以必须做一些其他的事情:(
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2021-04-27
    • 2011-04-20
    相关资源
    最近更新 更多