【问题标题】:Compare millions of records from Oracle to SQL server比较从 Oracle 到 SQL Server 的数百万条记录
【发布时间】:2016-04-20 16:54:35
【问题描述】:

我有一个 Oracle 数据库和一个 SQL Server 数据库。有一张表说Inventory,它在两个数据库表中都包含数百万行,并且还在不断增长。

我想每天将Oracle表数据与SQL Server数据进行比较,找出SQL Server表中缺少哪些记录。

什么是最好的方法?

  1. 创建 SSIS 包。
  2. 创建 Windows 服务。

我想消耗更少的资源来实现这个需要更少时间和资源的功能。

例如:oracle 中有 1800 万条记录,SQL Server 中有 16/17 百万条记录

出现这种两种不同数据库的情况是因为两个不同的应用程序在线和离线

编辑:如何通过Oracle网关将SQL服务器从oracle连接到SQL服务器到

1) 从 Oracle 直接查询 SQL Server 以第一次更新 SQL Server 中缺失的记录。

2) 在 Oracle 上创建一个触发器,该触发器在从 Oracle 中删除记录时执行,并将已删除的记录插入到新的 oracle 表中。

3) 创建 SSIS 包,将新创建的 oracle 表映射到 SQL Server 以更新 SQL Server 记录。这样每天只需通过 SSIS 处理少量记录。

您如何看待这种方法?

【问题讨论】:

  • 我认为一个好的长期策略是不要将您的状态存储在不同的 RDBMS 中。您能否更新解释您如何解决此问题的问题?
  • 您能解释一下目前记录是如何复制的吗?
  • Oracle 数据库有所有记录.. 并且记录有可能从 oracle 数据库中删除,我们必须更新从 oracle 数据库中删除的 SQL 服务器记录
  • 因此,您不仅要比较,还要插入(和更新?)更改。您可能想将其添加到您的问题中。
  • 是的,您的编辑正在谈论我在下面提到的差异复制。

标签: sql-server database oracle ssis


【解决方案1】:

我建议使用自制的 ETL 解决方案。

  1. 安排oracle job导出源表数据(每天 方式基于应用逻辑)to plain CSV格式。
  2. 安排SQL-Server job(从第一个 oracle 作业开始有可接受的延迟)来读取这个 CSV 文件并导入它 使用BULK INSERT 到 sql-servter 中的中型表。
  3. SQL-Server 作业的最后一部分是读取中表数据 并执行逻辑(插入、更新目标表)。我建议使用另一个表来存储此每日工作结果的报告。

【讨论】:

    【解决方案2】:

    您基本上想要做的是从 Oracle 复制到 SQL Server。

    您可以在 SSIS、Windows 服务或许多平台中执行此操作。 真正的诀窍是使用正确的设计模式。

    有两种通用的设计模式

    1. 快照复制

    您从两个系统中获取所有记录并在某处比较它们(到目前为止,我们建议在 SSIS 中比较或在 Oracle 上比较,但还没有在 SQL Server 上比较的建议,尽管这是有效的)

    你在这里比较了 1800 万条记录,所以这是很多工作

    1. 差异复制

    您记录自上次复制以来发布者(即 Oracle)中的更改,然后将这些更改应用到订阅者(即 SQL Server)

    您可以通过在 Oracle 端实现触发器和日志表来手动执行此操作,然后使用常规 ETL 过程(SSIS、命令行工具、文本文件等),可能在 SQL 代理中安排将这些应用到 SQL Server .

    或者您可以通过使用开箱即用的复制功能将 Oracle 设置为发布者并将 SQL 设置为订阅者来做到这一点:https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx

    您将不得不尝试其中一些,看看哪些对您有用。

    鉴于此目标:

    我想消耗更少的资源来实现这个需要更少时间和资源的功能

    事务复制效率更高,但也很复杂。出于维护目的,您最熟悉哪些平台(.Net、SSIS、Python 等)?

    【讨论】:

      【解决方案3】:

      我将创建一个 SSIS 包并使用数据流/OLE DB 数据源从 Oracle 表加载数据。如果您有 SQL Enterprise,Attunity 连接器会更快一些。

      然后我会将 SQL Server 表中的键加载到查找转换中,在其中我将匹配键上的 2 个源,并将不匹配的行定向到单独的输出中。

      最后,我会将不匹配的行输出到 OLE DB 命令,以更新 SQL Server 表。

      此 SSIS 包将需要大量内存,但由于匹配是在内存中以最少的 IO 完成的,因此它的速度可能会优于其他解决方案。它将需要足够的空闲内存来缓存 SQL Server 表中的所有键。

      SSIS 还有一个优势,就是它有很多其他的转换功能,如果你以后需要的话。

      【讨论】:

      • 感谢您的回复。所以你建议 SSIS 包是比较 18 百万条 oracle 记录与 15/16 百万条 SQL 服务器记录与 SSIS 查找的最佳方法??
      • 是的,因为 IO 最少。 SSIS 只需要从 Oracle 和 SQL Server 表中读取一次,然后它将在内存中匹配,而大多数其他技术需要读取和写入(然后再次读取)您的大型数据集之一。
      • 我认为 SSIS 查找无法处理该卷(不过我很高兴得到纠正)。如果有任何程度的复杂性(即不区分大小写或范围查找),它必须逐行进行查找,这对于 1800 万条记录将非常慢。
      • 我在想象一个典型的键匹配,例如所有列都是数字或可以匹配为区分大小写,所以我会使用默认的完整缓存模式进行查找。正如我所提到的,这将需要足够的内存,例如18m x 平均键长。例如。如果键是单个 int / DT_I4 列,则为 18m x 4 字节 = 72MB。
      【解决方案4】:

      我认为最好的方法是使用 oracle 网关。按照步骤操作即可。我有类似的经历。

      1. 为 SQL Server 安装和配置 Oracle 数据库网关。 https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
      2. 现在您可以创建从 oracle 到 sql server 的 dblink。
      3. 创建一个过程,比较 oracle 数据库中丢失的记录并插入到 sql server 数据库中。

      例如,您可以在过程中使用此语句。

          INSERT INTO "dbo"."sql_server_table"@dblink_name("column1","column2"...."column5")
      VALUES
      (
          select column1,column2....column5 from oracle_table
          minus
         select "column1","column2"...."column5" from "dbo"."sql_server_table"@dblink_name
      )
      
      1. 创建一个每天执行该过程的调度程序。

      当两个数据库都在线时,缺失的记录会被插入到sql server。否则调度程序会失败,或者您可以手动执行该过程。 它占用最少的资源。

      【讨论】:

        【解决方案5】:

        其他选择:

        如果可以使用Oracle gateway for SQL Server,则无需传输数据,直接查询即可。

        如果不能使用 Oracle 网关,可以使用 Pentaho 数据集成或其他 ETL 工具来比较表并获取结果。易于使用。

        【讨论】:

        • 你的回答很模糊,至少对我来说,因为它没有提供任何线索来说明如何实现这一点。还要考虑一个应用程序离线的情况。
        • 嗨。我只建议用程序传输数据的替代方案。使用 SQLServer 的 oracle 网关,您可以直接进行比较。与 ETL 工具相同,但此替代方法不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        相关资源
        最近更新 更多