问题概述

image-20231218214544794

今天遇到案例,expdpUDE-00014:参数 'include' 的值无效。

后知后觉的题外话,如果看到这个报错直接去搜索,可能一下子就找到了答案,搜索结果第一条就是 mos 官方网站,还带 Doc id 1587384.1 如下:

image-20231218215129278

但是我看到这个报错后没有直接去直接搜索,主要是这个报错信息很明显,是include参数的值有问题, 于是就根据这个报错去进一步的排查。

问题排查

首先 他这个 expdp 是使用的 parfile,那就看 parfile 的内容,内容如下:

1
2
3
4
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个的限制,但是我这看了下,这根本没有10000个表名呢,我搜索了下 也才是200个左右。我这就想到了 4000 这个限制,计算了下,长度确实超过了 4000,然后经过删除操作,保留了4000个字符,实际还是不行的,最后确认是 4000个字符是从 TABLE: 的 冒号开始计算的。

image-20231218222940959

可以看到 INCLUDE=TABLE: 正好是14个字符,也就是这个 4000 是从:之后开始计算的。

image-20231218223307753

问题原因

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的过程中使用 EXCLUDEINCLUDE 参数的时候,其值的长度不能超过 4000 ,超过之后会报 UDE-00014 的错误。

解决方案

既然这样,解决方案就有了:

1、INCLUDE 通过分批导出,每批限制其长度不超过 4000
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 做的还挺好,当然也可能是其权重高 )

1
2
3
4
5
6
7
8
9
10
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 参数如下:

1
INCLUDE=TABLE:"IN (select name from <SCHEMA>.t)"

以上是个常规的方案,但是使用导出部分表,通过使用INCLUDE=TABLE 是一个方案,但是其实 在exp的时候就有tables参数的。

1
2
3
TABLES
Identifies a list of tables to export.
For example, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995.

本次我也测试了 tables 参数,发现 tables 参数是没有 4000 的长度的限制的。

3、使用 tables 参数,目前经过测试 tables 参数可以超过 4000 的。

1
tables=A,B,C

其实expdpINCLUDE 参数最重要的是可以写正则表达式,如果要挨个列出表名,还是 tables 参数可行。

延伸:

本次是要导出 200 多个表结构,采用了include 参数,但是会导出统计信息,具体日志如下:

1
2
3
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 也就是 includeexclude 不能同时使用。

那如果要导出部分表信息,并且不导出统计信息应该怎么做呢?就只能使用tables参数然后外加 EXCLUDE=STATISTICS 来实现了。

可以看到 ORACLE 的报错不是很明显,如果报错有跟 mos 文档那样有明显的 long list of tables ,问题就可以很好的判断了,他这写的 参数 include 的值无效,就有点不好判断了。

原文作者: liups.com

原文链接: http://www.liups.com/posts/fcfa4b9/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议