首页 - 通讯 - ORA

ORA

2023-10-10 02:34

使用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 )

这里记录一下今天遇到的案例,了解一下问题的来龙脉去。

参考资料

[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