m6米乐安卓版下载-米乐app官网下载
暂无图片
11

oracle 导出部分表报 ude-m6米乐安卓版下载

原创 lps 2023-12-18
392

table of contents

问题概述

image-20231218214544794

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

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

image-20231218215129278

但是我看到这个报错后没有直接去搜索,主要是这个报错信息很明显,是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:的冒号开始计算的。

image-20231218222940959

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

image-20231218223307753

问题原因

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的过程中使用 excludeinclude 参数的时候,其值的长度不能超过 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

其实expdpinclude 参数最重要的是可以写正则表达式,如果要挨个列出表名,还是 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=tableexclude=statistics 进行导出,会报 ude-00011: parameter include is incompatible with parameter exclude 也就是includeexclude 不能同时使用。

那如果要导出部分表信息,并且不导出统计信息应该怎么做呢?就只能使用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)

最后修改时间:2024-01-21 19:37:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图