使用expdp/impdp导出导入数据时,遇到ORA-2000错误,如下所示:
处理对象类型SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
处理对象类型SCHEMA_EXPORT/TABLE/COMMENT
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX
处理对象 类型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
处理对象类型SCHEMA_导出/表/索引/统计/INDEX_STATISTICS
处理对象 类型SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
处理对象 类型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
处理对象类型SCHEMA_EXPORT/STATISTICS /MARKER
xxxx.xxxxx : sqlerrm = ORA-20000: 无法设置值对于索引xxx:不存在或权限不足ges
导入统计数据失败对于 1 个对象;
导出环境为Oracle 12c,导入数据库环境为Oracle 19c,具体版本为19.16.0.0.0。我检查了Oracle支持,碰巧遇到Bug 30978304。关于为什么会出现这个错误,ORA -20000 from Data Pump Import (IMPDP) when PK Constraint does not Create a New Index (Doc ID 2679433.1)[1] ,有详细的案例描述,这里无需再构造案例。描述一下出现ORA-20000错误的场景,如下:
适用于:
Oracle 数据库 - 企业版 - 版本 19.1.0.0.0 及更高版本
信息本文档适用于任何平台。
症状
跑步时带有统计信息的数据泵导入 (IMPDP),创建索引和约束的顺序允许主键约束引用用户创建的索引,而不是按应有的方式创建新索引。
A 已简化测试 case:
SQL> 删除用户 INDEXTEST 级联;
SQL> 创建由 INDEXTEST 标识的用户 INDEXTEST;
SQL> 将 dba 授予 INDEXTEST;
SQL> 连接 INDEXTEST/ INDEXTEST
SQL> 创建表 i_test(id number, t1 varchar2(100), t2 varchar2(100));
SQL> 更改表 i_test 添加约束 i_test_pk 主键 (id, t1, t2);
SQL> 插入 i_test 值 (1,1,1);
SQL> 提交;
SQL> 在 i_test(id, t2, t1) 上创建唯一索引 i_test_idx;
SQL> 从 user_indexes 中选择 index_name;
SQL> 从 user_constrai 中选择constraint_naments;
SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('INDEXTEST');
SQL> !expdp 系统/架构=INDEXTEST转储文件=INDEXTEST重用_ dumpfiles=y
SQL> 连接system/
SQL> drop user INDEXTEST Cascade;
SQL>!impdp system/ schemas=INDEXTEST dumpfile=INDEXTEST
导入:发布 19.0.0.0.0 - 于 3 月 2 日星期一 19:08 生产:53 2020 版本 19.3.0.0.0
版权所有 (c) 1982、2019,Oracle 和/或其附属公司。保留所有权利。
连接到:Oracle Database 19c 企业版发布 19.0.0.0.0 - 生产版
主表"SYSTEM"."SYS_IMPORT_ SCHEMA_01" 已成功加载/已卸载
开始“SYSTEM”.“SYS_IMPORT_SCHEMA_01”:system/******** schemas=INDEXTEST
dumpfile=INDEXTEST 处理对象类型SCHEMA_EXPORT/USER
处理对象类型SCHEMA_EXPORT/SYSTEM_GRANT
处理对象类型 SCHEMA_EXPORT/ROLE_GRANT
处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE
处理对象 类型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型SCHEMA_EXPORT/TABLE/ TABLE
处理对象类型SCHEMA_EXPORT /表/表_数据
。 。已导入 "INDEXTEST"."I_TEST" 5.898 KB 1 行
正在处理对象 类型 SCHEMA_EX PORT/TABLE/INDEX/INDEX
处理对象类型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
处理对象类型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
处理对象类型 SCHEMA_EXPORT/表/统计/TABLE_STATISTICS
处理对象类型SCHEMA_EXPORT/STATISTICS/MARKER
INDEXTEST.I_TEST_PK:sqlerrm=ORA-20000:无法设置 值对于 索引I_TEST_PK:不存在或权限不足,对于 1 个对象,导入统计信息失败;
作业“系统”。“SYS_IMPORT_SCHEMA_01”已完成,共 2 个3 月 2 日星期一
19 发生错误:2020 年 09:13 已过去 0 00:00:19
SQL> 连接 INDEXTEST/INDEXTEST
SQL> 从 user_indexes 中选择index_name;
SQL> 从 user_constraints 中选择constraint_name;
SQL> 退出;
注意:据报告,当列顺序相同,但用户创建的索引有一个额外的列时,也存在此问题。
变更
数据库是升级到 19c 版本或更高版本。该问题在 12.2 或 18c 环境中未重现。
原因
此问题是由产品缺陷引起的。
它是调查在:
未发布的 Bug 30978304 - ORA-20000 在 IMPDP 期间,带有统计数据并且未创建 PK 的唯一索引
参考:
B ug 30978304 - 数据泵导入过程中导入统计数据时出现 ORA-20000(文档 30978304.8)
Bug 30978304 - 在导入统计数据时数据泵导入期间的 ORA-20000 (Doc ID 30978304.8)[2]影响的版本还是蛮多的,如下截图所示
Bug 30978304详细描述如下:
描述
ORA-20000错误发生在数据泵导入统计数据以及某些索引组合时。
此问题现已修复。
发生了什么?
之后导入可传输表空间时,属于索引的盘区在表空间位图中被错误地标记为未分配。这会导致
objd不匹配断言,因为这样的范围最终可能会分配给
另一个对象。
条件
前端口端必须具有以下属性:
有一个用户创建的表,表中具有多列 PK 约束
DDL。此约束有一个系统生成的唯一索引(例如 ABC)。
在与 PK 相同的列上有一个用户创建的唯一索引(例如 XYZ),
但列顺序不同。
注意如果列顺序匹配,XYZ 创建将会失败并出现
ORA-1408,并且不会出现此错误。
修复
修复力ABC 的创建早些时候。这可以解决在 impdp 导入统计数据时、当表上存在两个或多个索引并且
其中一个是主键索引.
其他症状:
TTS 从 12.1 DB 导入到 19c 会损坏表空间位图,从而导致以下结果:对属于的段
的操作引发错误表空间:
1。 ORA-8103
2。 ORA-600 [kcl_mismatch_1]
3。 ORA-600 [kdifind:kcbz_objdchk]
4。 ORA-600 [ktrget2:kcbz_objdchk]
5。 ORA-600 [ktspffbmb:objdchk_kcbnew_3]
6。 ORA-600 [ktspgtb2:kcbz_objdchk]
解决方法
无。
您可能会在以下位置获得此修复:
Data Pum p 推荐的 19.10 及以上版本的主动补丁(文档 ID 2819284.1 )
这里记录一下今天遇到的案例,了解一下问题的来龙脉去。
:https://www.gsm-guard.net/epmos/faces/SearchDocDisplay?_adf.ctrl-state=g9qrlq9os_4&_afrLoop=203438157763988
[2]:https://www.gsm-guard.net/epmos/faces/SearchDocDisplay?_afrLoop=211126172370682&_afrWindowMode=0&_adf.ctrl-state=iqtartzdc_4