2

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

例如,我希望导出表,TPI_SUMMARY但要排除DFXRRT等。基本上只想排除带有下划线作为第二个字符的任何内容RTAFFC_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  

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

4

1 回答 1

3

错误是指EXCLUDE,而不是INCLUDE

ORA-39071: Value for EXCLUDE is badly formed

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

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

正如它在文档中所说

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-05-04T16:20:11.127 回答