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 , 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
的错误。
m6米乐安卓版下载的解决方案
既然问题原因是 表的长度超过了 4000 导致的,那m6米乐安卓版下载的解决方案就有了:
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' );
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)