【问题标题】:Copying data from one oracle database to another oracle database using C#使用 C# 将数据从一个 oracle 数据库复制到另一个 oracle 数据库
【发布时间】:2011-02-22 19:00:32
【问题描述】:

将数据从一个 oracle 数据库复制到另一个的标准方法是什么。

1) 从源表读取数据并使用配置复制到目标上的临时表(即有多个表,每个表都有单独的临时表) 2)目前没有clob数据,但将来可能会使用clob数据。 3) 将所有内容读入内存(如果大数据分块读取)

不应使用 Oracle 链接 不应该使用文件 代码应该只使用 C# 而不是任何数据库过程。

【问题讨论】:

  • 投票关闭的理由是,通过排除明显的数据库链接、数据库过程、文件传输机制,该解决方案只适用于真正喜欢重新发明轮子的人。
  • @Gary 这是公司的标准程序,生产数据库之间没有任何数据库链接。因此,我们假设使用中间层应用程序。我认为我们可以导出到文件,然后读取文件并写入数据库,但是当我们只想从源表读取并写入目标表时,这将是更多的工作。

标签: c# performance oracle copying


【解决方案1】:

我曾经这样做的一种方法是在源数据库上使用 DataReader,然后在目标数据库上执行插入操作(肯定使用 Bind Parameters)。

请注意,DataReader 非常擅长在通过表移动时不使用太多内存(我相信默认情况下它使用快进、只读游标)。这意味着在给定时间只有少量数据保存在内存中。

以下是需要注意的事项:

关系

如果您正在处理具有关系的数据,您将需要处理它。我见过有两种方法可以解决这个问题:

  1. 在进行复制之前暂时删除目标数据库中的关系,然后再重新创建它们。
  2. 以正确的顺序复制数据以使关系正常工作(这通常非常困难/效率低下)

自动生成的 ID 值

这些列通常通过禁用给定表的自动增量功能并允许身份插入来处理(我使用了一些 SQL Server 术语,我不记得它在 Oracle 上是如何工作的)。

交易

如果您要移动大量数据,交易成本会很高。

可重复性/删除目标数据

除非您比我们其他人更出色,否则您可能不得不多次运行这个东西(至少在开发期间)。这意味着您可能需要一种删除目标数据的方法。

平台特定方法

在 SQL Server 中,有一些方法可以非常快速地执行批量插入(通过放弃像参照完整性检查这样的小事情)。 Oracle 工具集中可能有类似的功能。

表/列元数据

我还没有在 Oracle 中执行此操作,但看起来您可以使用提到的视图获取表和列的元数据 here

【讨论】:

  • @RQDQ 因为我们将源数据保存在内存中,所以我们可以设置一个限制。如果源数据超过内存限制,是否可以读取到内存限制(即以块的形式读取数据)并将数据插入到目标表中。循环这个直到所有源数据都复制到目标。我们计划使这个应用程序通用,因为应用程序不知道什么是源表,什么是目标,只有在运行时它才提供这些值。因此,将来应该处理表结构中的任何新更改,或任何新的源表和目标表
  • 为此使用 DataReader 的好处是它不会将所有数据都保存在内存中。它只是通过数据运行游标(在后台处理分页/分块)。至于能够复制任何表的处理,只需编写代码,以便它读取表结构的系统视图。
  • @RQDQ 您的意思是说从 user_tab_columns 表中读取并在应用程序启动时为每个表生成一次插入和选择查询,并为每个插入重用查询。
  • @bunny - 是的 - 这正是我的想法。这就是我过去所做的,并且效果很好。
  • @bunny - 一般来说,我一次只复制一个表,复制所有列的值(换句话说,每个表一个读取器)。我通常一次只进行一次插入,但 Oracle 可能有更快的方法(我不知道 Oracle 为批量插入数据做了什么)。
猜你喜欢
  • 2012-10-30
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多