imp导入dmp时产生错误 ORA-14063、ORA-14048,错误信息如下:
. . 正在导入表 "APP_ASSEM_SET_DICT"导入了 4 行
IMP-00017: 由于 ORACLE 错误 14063, 以下语句失败:
"ALTER TABLE "APP_ASSEM_SET_DICT" ADD CONSTRAINT "PK_SET_CODE" PRIMARY KEY "
"("SET_CODE") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL"
" 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL "
"DEFAULT) TABLESPACE "TSP_MHEALTH" LOGGING"
IMP-00003: 遇到 ORACLE 错误 14063
ORA-14063: 唯一/主约束条件关键字中存在无用索引
IMP-00017: 由于 ORACLE 错误 14048, 以下语句失败:
"ALTER INDEX "PK_SET_CODE" UNUSABLE ENABLE "
IMP-00003: 遇到 ORACLE 错误 14048
ORA-14048: 分区维护操作不能与其他操作组合
错误1:ORA-14063 无法使用指数存在唯一/主约束的关键
原因:尝试添加或启用一个主键/唯一约束,列一个表上存在索引标记的索引不可用(S)。
行动:删除现有的索引或重建它使用的ALTER INDEX重建。
错误2:ORA-14048 分区维护操作不能与其他操作组合
原因: ALTER TABLE或ALTER INDEX语句试图结合一些其他操作(例如,添加分区或PCTFREE的),这是非法的分区维护操作(例如,移动分区)。
行动:确保分区维护操作是唯一指定的操作的ALTER TABLE或ALTER INDEX语句;比表被改名(ALTER TABLE语句重新命名)处理与分区,分区表/索引的默认属性,或指定的其他操作可以结合起来。
解决过程1:
在导入库中查找发现,出现该错误的表,全部没有主键。执行主键创建SQL报错ORA-14063无法使用指数存在唯一/主约束的关键
根据错误1的原因,尝试操作:删除现有的索引或重建它使用的ALTER INDEX重建。
注:(需要在该表所在表空间对应的用户登录执行SQL)
alter index PK_SET_CODE rebuild ;
主键生成成功。将导入日志中所有报错的主键索引重新创建。
然而再次建库导入还是会出现同样的问题。
导入库修改此操作不可取。
解决过程2:
因为在导入库里查找名为 PK_SET_CODE的 index没有找到, 判断该 index 没有创建成功, 于是去导出库找原因。
根据错误2提示, 应该是导出库出了问题, 导致dmp出现问题。在导出库一查, 发现PK_SET_CODE的 status 为 UNUSABLE。那么在导出库修复一下 index, 再进行导出, 导入,则导入正常,错误1、错误2都解决了。用该表空间对应账户登录后,查看index状态:
select index_name,status from user_indexes where table_owner='MHEALTH';
查看表约束字段的视图
SELECT * from user_cons_columns t where t.owner='MHEALTH';
查询用户索引状态无效的索引名称
select index_name from user_indexes where status !='VALID';
根据这三项发现报错的索引都是状态无效(status=UNUSABLE)
获取修复语句
select ' alter index '||index_name||' rebuild ;' from user_indexes where status !='VALID';
执行这些修复语句之后,再将数据库导出,最后导入到新库,错误1、错误2都已经解决。
总结:
两处错误其实是因为导出库的索引(主键)状态变为UNUSABLE导致的。修改状态之后导出dmp,再导入到新库即可解决。
疑虑: 是什么操作导致index 出现 unusable 的情况?