暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle19c expdp无法导出通过主键约束自动创建的唯一索引

ASKTOM 2019-06-03
1503

问题描述

我在19c数据泵导出时遇到问题,我想知道是否存在数据泵导出参数或其他解决策略。

当表的主键作为create table语句的一部分被创建时,会自动创建一个与主键同名的唯一索引。

在重新创建约束之前,11g数据泵分别导出此唯一索引。
19c数据泵不导出唯一索引。当应用约束时,会自动创建索引。

当存在可用作主键约束的索引的现有 (非唯一) 索引时,这会产生问题。在这种情况下,创建了约束,但它引用了不正确的索引。

当数据泵尝试将统计信息重新导入到主键索引中时,这种变化就会显现出来。引发错误,因为具有预期名称 (与约束相同) 的主键索引不存在。

ORA-20000: Unable to set values for index PK_TABLE_NAME: does not exist or insufficient privileges


进一步的调查将错误缩小到未记录的标志all_indexes.constraint_index。在19c中,创建主键作为create table语句的一部分的任何表在此列中的值为 “是”。这样可以防止数据泵单独创建索引。

如果主键索引和约束都通过USING子句与create table语句分开创建,则all_indexes.constraint_index设置为 “否”,主键索引将由数据泵导出。

最后,无论如何创建主键索引,由11g导出的任何表都将all_indexes.constraint_index设置为 “否”。所有后续出口均按预期进行。我已经确认all_indexes.constraint_index保持设置为 “否”。

附加的LiveSQL脚本在19c上运行时会重新创建场景。然后需要导出/导入架构以查看问题。

因此,问题仅发生在直接在19c上创建的表中,并且存在用于主键约束的伪覆盖索引。(我说伪是因为索引不需要唯一,并且我发现键可以反转。)存在的解决方法是重写create table语句,使其不包括内联主键创建,但这对于大型现有应用程序来说是不切实际的。只能为少量有问题的表重写create table语句是可能的,但留下了未来索引将导致这种情况发生的可能性。

理想的解决方案是一种标记数据泵以强制导出所有主键索引的方法,或者是某种更新all_indexes.constraint_index = “NO” 的方法。(实际上是描述同一件事的两种方式。)

专家解答

干得好的调查工作!

我已经在我最新的19c实例上复制了这一点。

MOS上有一些类似的错误,但没有一个完全匹配,所以我记录了错误29892354。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论