如何从Oracle数据仓导出中排除某些表

时间:2017-05-04 15:58:17

标签: oracle oracle11g datapump expdp

我的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  

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

1 个答案:

答案 0 :(得分:3)

错误是指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子句 - 这可能比列出所有内置模式更简单,可以变化。