【问题标题】:How to exclude certain tables from Oracle datapump export如何从 Oracle 数据泵导出中排除某些表
【发布时间】:2017-10-02 22:04:21
【问题描述】:

我的 Oracle 数据库中有大量用户模式。我希望导出这些模式的表数据,但排除任何以第二个字符为下划线命名的表。

例如,我希望导出表 TPI_SUMMARYDFXRRTRTAFF,但排除 C_NAMESG_BEARS 等。基本上只是想排除带有下划线作为第二个字符的任何内容

我正在使用 Oracle 数据泵:

expdp system/xxxxx@string parfile=parfile.par

parfile 包含:

INCLUDE=TABLE:"IN(select table_name from dba_tables where table_name not like '_\_%')" 
EXCLUDE=SCHEMA:"='SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS'"
DIRECTORY=paul_test 
DUMPFILE=infrep_temp1.dmp 
FULL=Y 
LOGFILE=Daily_Backup_infrep_temp1.log

我就是无法让它工作。我认为 EXCLUDE 位没问题,但 INCLUDE 查询是错误的。 DIRECTORYDUMPFILELOGFILE 都可以。

我得到以下信息:

Export: Release 11.2.0.4.0 - Production on Thu May 4 16:41:48 2017  

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.  

Connected to: Oracle Database 11g Release 11.2.0.4.0 - 64bit Production  
ORA-39001: invalid argument value  
ORA-39071: Value for EXCLUDE is badly formed.  
ORA-00933: SQL command not properly ended  

有什么想法吗?我真的很难让它发挥作用。

【问题讨论】:

    标签: oracle oracle11g datapump expdp


    【解决方案1】:

    错误指的是EXCLUDE,而不是INCLUDE

    ORA-39071: Value for EXCLUDE is badly formed
    

    ...这确实是错误的。您正在尝试使用具有多个值的相等性;你只需要再次使用IN()

    EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"
    

    但是as it says in the documentation:

    EXCLUDEINCLUDE 参数是互斥的。

    你可以使用两个EXCLUDE子句,所以你可以否定第一个INCLUDE

    EXCLUDE=TABLE:"NOT IN(select table_name from dba_tables where table_name not like '_\_%')" 
    EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"
    

    或者说现在是双重否定的:

    EXCLUDE=TABLE:"IN(select table_name from dba_tables where table_name like '_\_%')" 
    EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"
    

    但是like 与您期望的不匹配;您需要添加一个escape 子句,在这种情况下,您需要通过加倍来转义反斜杠:

    EXCLUDE=TABLE:"IN(select table_name from dba_tables where table_name like '_\_%' escape '\\')" 
    

    或者您可以使用 substr() 代替:

    EXCLUDE=TABLE:"IN(select table_name from dba_tables where substr(table_name, 2, 1) = '_')"
    

    如果您有确实想要的架构列表,您也可以使用两个 INCLUDE 子句代替 - 这可能比列出所有内置架构更简单,这可能会有所不同.

    【讨论】:

      猜你喜欢
      • 2017-08-24
      • 1970-01-01
      • 2012-12-12
      • 2016-02-29
      • 2020-07-04
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多