在Oracle数据库之间复制包含BLOB列的表

3
在adhoc的基础上,我们希望从四个Oracle生产表中复制内容到QA/UAT环境。这不是直接复制,我们需要根据某些输入条件进行筛选数据的复制。
早先我们使用Sybase数据库,因此BCP实用程序在那里运行良好。然而,我们最近迁移到了Oracle,并需要类似的数据复制需求。
根据目前的分析,我已经分析出以下选项:
- RMAN(恢复管理器)- 不能使用,因为它不允许我们复制选择的表或对数据进行过滤。 - SQLLDR(SQL加载程序)- 不能使用,因为我们有BLOB列,因此不确定如何为这些BLOBS创建CSV文件。有什么建议吗? - Oracle数据泵(Expdp / Imbdp)- 不能使用,即使它允许复制所选表,它也不允许我们使用具有连接的某个查询来过滤数据(我知道它允许添加查询,但它只对单个表起作用)。解决方法是创建具有所需数据集的临时表,并使用EXPDP和IMPDP对它们进行转储。如果我在这种方法中漏掉了什么,请给我一些建议。 - 数据库链接- 这是在这种情况下可能的最佳方法。但需要检查DBA是否允许我们创建到/从PRD数据库的链接。 - SQL PLUS COPY - 不能使用,因为它无法处理BLOB字段。
请问哪种方法在性能方面最好?

大家好,我提出这个问题的原因是我的需求有些复杂,需要在从源到目标进行数据复制之前对BLOB进行筛选。由于上述所有方法都有利弊,所以我想知道是否有人遇到过类似情况,并且有没有解决方案。请重新打开问题或告诉我您有任何疑虑。 - Swapnil Jaju
2个回答

2
我会建议使用DATAPUMP格式的外部表。因此,它可能是这样的:
create table my_ext_tab
organization external
(
        type oracle_datapump
        default directory UNLOAD
        location( 'my_ext_tab.dmp' )
)
as
<my query>

您可以将该文件复制到其他数据库中,创建外部表,然后通过插入操作将数据插入到新表中,示例代码如下:

insert /*+ APPEND */ into my_tab
select * from my_ext_tab

您还可以使用并行处理来读写文件


我认为采用上述方法后,目标数据库上的外部表将充当暂存表。然后,我需要将数据从暂存表移动到最终表中,以便我的Web应用程序可以在这些最终表上进行查询。我怀疑应用程序是否能够直接查询外部表。你觉得呢? - Swapnil Jaju
@SwapnilJaju。从技术上讲,您可以针对外部表运行查询;实际上,当我们加载最终表时,这就是我们所做的一切;我们只是在执行INSERT... AS SELECT。然而,我使用过的大多数应用程序都会将数据从外部表读取到最终表中,然后再由您的应用程序使用。 - BobC

1
考虑到您的所有限制,似乎数据库链接是最好的选择。您可以在PROD环境上创建带有连接和过滤器的查询视图,并通过db链接从这些视图中进行选择。这样,在网络传输之前就完成了过滤,而不是在目标端之后进行过滤。

双向链接的问题在于它们会串行化。 - BobC
确实是这样。如果是按需批量传输,这可能不是问题。但你的答案在性能方面更好,我没有想到那个解决方案。 - JeromeFr
@BobC:你有没有想法,是否可以通过DBLinks将BLOB发送到目标数据库?我在某个地方读到过这样的说法。如果有任何建议,请分享一下。谢谢。 - Swapnil Jaju
@SwapnilJaju。测试并查看确实无法做到很容易:SQL> create table junk3( id number, col2 blob );表已创建。SQL> select * from junk3@mylink;错误:ORA-22992:无法使用从远程表中选择的LOB定位器。 - BobC
@BobC:有什么变通方法可以用来完成它吗?我在某个地方读到需要使用临时表。不知道如何实现。 - Swapnil Jaju
@SwapnilJaju。我想不出其他方法了。但为什么不使用我回答中概述的Datapump外部表方法呢? - BobC

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