由于数据迁移需求,需要将某个用户下除了指定的200张表之外的所有对象和数据全部导出。于是使用expdp工具,指定了exclude参数,排除指定的200张表。
expdp_ad.par文件中关于exclude的部分如下所示:
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201610',
'CA_STAT_DAILY_DTL_PAY_201612',
'CA_STAT_DAILY_DTL_PAY_201701',
'CA_STAT_DAILY_DTL_PAY_201608',
'CA_STAT_DAILY_DTL_PAY_201609',
'CA_STAT_DAILY_DTL_PAY_201611',
......
)"
执行expdp导出时报错,信息如下所示:
oracle ->@zwdb1:/backup/dmp$tail -f nohup.out
Export: Release 12.1.0.2.0 - Production on Wed Aug 19 16:24:37 2020
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
UDE-00014: invalid value for parameter, 'exclude'.
[1] + Done(1) nohup expdp userid=\'/ as sysdba\' parfile=expdp_ad.par &
可以看出,问题在于exclude参数指定的参数值无效。
开始怀疑是exclude参数中指定的表名不能独占一行,需要添加换行符,于是修改expdp_ad.par文件,在exclude参数中指定的表名后都添加换行符。如下所示:
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201610', \
'CA_STAT_DAILY_DTL_PAY_201612', \
'CA_STAT_DAILY_DTL_PAY_201701', \
'CA_STAT_DAILY_DTL_PAY_201608', \
'CA_STAT_DAILY_DTL_PAY_201609', \
'CA_STAT_DAILY_DTL_PAY_201611', \
......
)"
结果仍然提示UDE-00014: invalid value for parameter, 'exclude'., 怀疑换行符不起作用,干脆直接把所有表名都放在一行中。 如下所示:
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201610', 'CA_STAT_DAILY_DTL_PAY_201612', 'CA_STAT_DAILY_DTL_PAY_201701', 'CA_STAT_DAILY_DTL_PAY_201608', ......)"
但是,仍然提示UDE-00014: invalid value for parameter, 'exclude'.,于是再做了一次尝试,将指定的表名只包括三张表,如下所示:
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201610','CA_STAT_DAILY_DTL_PAY_201612','CA_NOTIFY_TASK_0930_2_202003')"
再次测试,可以成功导出数据。 通过这一系列的测试可以说明,EXCLUDE=TABLE:"IN ('参数中的值太多时,就会出现问题。根据这一现象,搜索到文章:UDE-00014 invalid value for parameter, 'tables'. (Doc ID 758848.1)。
这篇文章的大概意思是,当tables参数中的参数值太大,超过3400字节时,就可能会出现无效的参数值。
那么,当前遇到的这个问题,该如何处理呢? 最后想了一个土办法,就是每一张表使用一个exclude=table:in的方式,如下所示:
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201610')"
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201612')"
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201701')"
EXCLUDE=TABLE:"IN ('CA_STAT_DAILY_DTL_PAY_201608')"
......