ORACLE 导出部分报 UDE-00014:参数 'include' 的值无效
问题概述
![image-20231218214544794](https://imp.liups.com/pic/images/2023/12/18/1702907145.png)
今天遇到案例,expdp
报 UDE-00014:参数 'include' 的值无效。
后知后觉的题外话,如果看到这个报错直接去搜索,可能一下子就找到了答案,搜索结果第一条就是 mos 官方网站,还带 Doc id 1587384.1 如下:
![image-20231218215129278](https://imp.liups.com/pic/images/2023/12/18/1702907489.png)
但是我看到这个报错后没有直接去直接搜索,主要是这个报错信息很明显,是include参数的值有问题, 于是就根据这个报错去进一步的排查。
问题排查
首先 他这个 expdp
是使用的 parfile
,那就看 parfile 的内容,内容如下:
1 | INCLUDE=TABLE:"IN ('XXXXXXX','CCCCC', |
其中 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](https://imp.liups.com/pic/images/2023/12/18/1702909788.png)
可以看到 INCLUDE=TABLE:
正好是14个字符,也就是这个 4000 是从:
之后开始计算的。
![image-20231218223307753](https://imp.liups.com/pic/images/2023/12/18/1702909987.png)
问题原因
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
的错误。
解决方案
既然这样,解决方案就有了:
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 | create table t |
然后通过使用 INCLUDE 参数如下:
1 | INCLUDE=TABLE:"IN (select name from <SCHEMA>.t)" |
以上是个常规的方案,但是使用导出部分表,通过使用INCLUDE=TABLE
是一个方案,但是其实 在exp
的时候就有tables
参数的。
1 | TABLES |
本次我也测试了 tables
参数,发现 tables
参数是没有 4000 的长度的限制的。
3、使用 tables
参数,目前经过测试 tables
参数可以超过 4000 的。
1 | tables=A,B,C |
其实expdp
的 INCLUDE
参数最重要的是可以写正则表达式,如果要挨个列出表名,还是 tables
参数可行。
延伸:
本次是要导出 200 多个表结构,采用了include
参数,但是会导出统计信息,具体日志如下:
1 | Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS |
我们要排除掉统计信息,很显然是只能使用 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 的值无效,就有点不好判断了。
原文作者: liups.com
原文链接: http://liups.cn/posts/fcfa4b9/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议