Table of Contents
问题概述
今天遇到案例,expdp 报 UDE-00014:参数 'include' 的值无效。
后知后觉的题外话,如果看到这个报错直接去搜索,可能一下子就找到了答案,搜索结果第一个就是 MOS 官方网站,还带 Doc id 1587384.1 如下:
但是我看到这个报错后没有直接去搜索,主要是这个报错信息很明显,是include参数的值有问题, 于是就根据这个报错去进一步的排查。
问题排查
首先他这个expdp 是使用的parfile,那就看 parfile 的内容,内容如下:
INCLUDE=TABLE:"IN ('XXXXXXX','CCCCC', 'BBBBBB', ……………… )"
其中 INCLUDE=TABLE:" IN (' 后面写了一堆的表,仔细发现他这些表名之间有换行,那心想是换行导致的,经过修改将 所有表名都写到同一行内,仍然不行。
大家都知道写在 parfile 里面的参数是不需要转义的,里面也就是有逗号和引号及括号,也不需要转义,就猜测可能是逗号和引号等是全角模式下的,也经过修改确认是半角英文模式下的逗号,引号和括号。重新执行expdp 仍然报错。
拿到了parfile的具体内容,在我本机执行仍然报相同的错误,不过我本机的报错是英文的:UDE-00014: invalid value for parameter, 'include'. 仍然是 include 参数值有问题。
我这里甚至想到他这些表名里是不是有$ 符号等特殊字符,可能在 shell 下会转义之类导致的,经过仔细观察发现也没有什么特殊字符,然后就想既然字符什么没问题那就应该是长度的问题了,就去官方网站去查询了INCLUDE 参数,没找到明显的地方写明TABLE:"IN有长度限制,但是这个参数带个 in,这就想到了 oracle 的 sql 的 in 有 1000 个的限制,但是我这看了下,这根本没有 1000 个表名呢,我搜索了下, 也才是 200 个左右。
我这就想到了 4000 这个限制,计算了下,长度确实超过了 4000了,然后经过删除操作,保留了4000 个字符,实际还是不行的,最后确认是这 4000 个字符是从 TABLE:的冒号开始计算的。如下图:

可以看到 INCLUDE=TABLE: 正好是14个字符,也就是这个 4000 是从:之后开始计算的,也就是 "IN( 也是计算在 4000 内的,包括引号和双引号等字符,不仅仅是计算表的名字。

问题原因
As stated in Bug 12557091, this is an expected behavior as EXCLUDE and INCLUDE parameters takes values with length of 4000 only. Anything beyond this generates UDE-00014 error.
其实这是一个预期的结果,当expdp的过程中使用 EXCLUDE和INCLUDE 参数的时候,其值的长度不能超过 4000 ,超过之后会报UDE-00014的错误。
解决方案
既然问题原因是 表的长度超过了 4000 导致的,那解决方案就有了:
1、INCLUDE 通过分批导出,每批限制其长度不超过 4000(需要注意的是要写到一行呐,中间不能有换行,这里测试如果有换行会报错:UDE-00011: parameter include is incompatible with parameter exclude)
2、创建一张表比如表名是t ,将 INCLUDE/EXCLUDE 的表名(注意要大写)插入到 t表,(参考文档:EXPDP fails with UDE-00014: invalid value for parameter, ‘INCLUDE’ specifying a long list of tables (Doc ID 1587384.1),这个也是文章开头搜索的结果就是这个文章 1587384.1,可以看出来 MOS的 seo 做的还挺好,当然也可能是其权重高 )
create table t
(
name varchar2(20)
);
-- 将表名插入到 t 表
insert into t values('TABLE1');
insert into t values('TABLE2');
...
insert into t values('TABLE<n>');
commit;
然后通过使用 INCLUDE 参数如下:
INCLUDE=TABLE:"IN (select name from <SCHEMA>.t)"
以上是个常规的方案,但是使用导出部分表,通过使用INCLUDE=TABLE 是一个方案,但是其实 在exp的时候就有tables参数的。
TABLES
Identifies a list of tables to export.
For example, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995.
本次我也测试了tables 参数,发现 tables 参数是没有 4000 的长度的限制的。
3、使用tables 参数,目前经过测试 tables 参数可以超过 4000 的。
tables=A,B,C
其实expdp的 INCLUDE 参数最重要的是可以写正则表达式,如果要挨个列出表名,还是 tables参数可行。
延伸:
本次是要导出 200 多个表结构,采用了include 参数,但是会导出统计信息,具体日志如下:
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS Processing object type SCHEMA_EXPORT/TABLE/TABLE Master table "A"."F2023_TAB_METADATA_FULLBK" successfully loaded/unloaded
我们要排除掉统计信息,很显然是只能使用 EXCLUDE=STATISTICS,那么问题来了,使用 INCLUDE=TABLE 和 EXCLUDE=STATISTICS 进行导出,会报 UDE-00011: parameter include is incompatible with parameter exclude 也就是include 和exclude 不能同时使用。
那如果要导出部分表信息,并且不导出统计信息应该怎么做呢?就只能使用tables参数然后外加 EXCLUDE=STATISTICS 来实现了。
可以看到 ORACLE 的报错不是很明显,如果报错有跟 MOS 文档那样有明显的 long list of tables ,问题就可以很好的判断了,他这写的 参数 ‘include’ 的值无效,就有点不好判断了。
参考资料
EXPDP fails with UDE-00014: invalid value for parameter, ‘INCLUDE’ specifying a long list of tables (Doc ID 1587384.1)




