我的Oracle数据库中有大量用户模式。我希望导出这些模式的表数据,但排除任何以第二个字符为下划线命名的表。
例如,我希望导出表TPI_SUMMARY
,DFXRRT
和RTAFF
但排除C_NAMES
,G_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
查询错误。 DIRECTORY
,DUMPFILE
和LOGFILE
都可以。
我得到以下内容:
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
有什么想法吗?我真的很难让它发挥作用。
答案 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:
EXCLUDE
和INCLUDE
参数是互斥的。
您可以使用两个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
子句 - 这可能比列出所有内置模式更简单,可以变化。