由於數據遷移需求,需要將某個用戶下除了指定的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')"
......
