我的Oracle数据库中有大量的用户模式。我希望导出这些模式的表数据,但排除了以下第二个字符命名的表。
例如,我希望导出表TPI_SUMMARY
,DFXRRT
和RTAFF
,但排除C_NAMES
,G_BEARS
等。基本上只想将其作为第二个字符
我正在使用Oracle Data Pump:
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
有什么想法吗?我真的很努力地让这个工作。
错误是指EXCLUDE
,而不是INCLUDE
:
ORA-39071: Value for EXCLUDE is badly formed
...,确实是错误的。您正在尝试使用具有多个值的平等;您只需要再次使用IN()
:
EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"
,但正如文档中所述:
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) = '_')"
您也可以,如果您有一个模式列表 do 想要,请使用两个INCLUDE
子句 - 这可能更简单,而不是列出所有内置模式,它们可能会变化。/p>