导出没有 BLOB 列的表

kon*_*dkg 5 oracle export blob

我有一张大表,里面有 BLOB 对象,还有一些从其他表到这个表的引用。我通过从生产中制作 expdp(数据泵),然后在开发/测试主机上匿名数据来为我的应用程序准备开发和测试模式。问题是这个带有 BLOB 的表太大了,将转储文件从生产复制到测试/开发,然后导入它需要很长时间......

是否有任何解决方案可以在表中没有某些列的情况下导出 SCHEMA(可能是一些过滤器,用空的 BLOB 或 NULL 替换所有的 BLOB)?

我还考虑制作一个“仅 BLOB 模式”并将其链接到生产模式,而根本不导出它,但这可能会导致性能问题。

Mat*_*Mat 11

您可以在 Oracle 11gR2 中使用expdpREMAP_DATA选项执行此操作。

  1. 在包中创建一个函数该函数将 blob 作为参数并返回null(或者可能是一个空 blob)。
  2. expdp像往常一样调用,添加:

    REMAP_DATA=SCHEMA.TAB.BLOB_COLUM:SCHEMA.PACKAGE.YOUR_FUNCTION
    
    Run Code Online (Sandbox Code Playgroud)

简短示例(架构:)mat

REMAP_DATA=SCHEMA.TAB.BLOB_COLUM:SCHEMA.PACKAGE.YOUR_FUNCTION
Run Code Online (Sandbox Code Playgroud)

普通出口:

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO 
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 10.00 MB       1 rows
...
Run Code Online (Sandbox Code Playgroud)

转储文件约为 11M。

使用数据重新映射:

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO \
                REMAP_DATA=MAT.FOO.B:MAT.remap.null_lob
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 5.398 KB       1 rows
...
Run Code Online (Sandbox Code Playgroud)

转储文件是 ~100k,导入该转储确实会在列中导入一个空值。


另一种选择是使用外部表来执行加载/卸载和ORACLE_DATAPUMP驱动程序(我认为这是在 10g 中引入的,请参阅外部表概念)。

对于卸载,请使用以下内容:

create or replace 
package remap as 
  function null_lob(col blob) return blob;
end remap;
/

create or replace
package body remap as
  function null_lob(col blob)
    return blob is
    eblob blob;
  begin
    return null;
  end null_lob;
end remap;
/

create table foo(a number, b blob);
-- insert a line with a 10M blob, commit

select a, length(b) from foo;

     A  LENGTH(B)
---------- ----------
     1   10485760
Run Code Online (Sandbox Code Playgroud)

(您可以在创建外部表后立即删除它,这不会 - 默认情况下 - 删除转储文件。)

然后将foo.dmp文件移动到目标服务器和目录,并在那里创建外部表:

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO 
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 10.00 MB       1 rows
...
Run Code Online (Sandbox Code Playgroud)

最后加载您的目标表(truncate ...; insert /*+ append */ ...例如CTAS 或):

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO \
                REMAP_DATA=MAT.FOO.B:MAT.remap.null_lob
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 5.398 KB       1 rows
...
Run Code Online (Sandbox Code Playgroud)

完成后删除外部加载器表。