ORA-12700 to ORA-19400

ORA-14048: 分区维护操作不能与其他操作组合

ORA-14048: a partition maintenance operation may not be combined with other operations

原因1: ALTER TABLE或ALTER INDEX语句试图将分区维护操作(例如MOVE PARTITION)与某些其他非法的操作(例如ADD PARTITION或PCTFREE)组合

ALTER TABLE or ALTER INDEX statement attempted to combine a partition maintenance operation (e.g. MOVE PARTITION) with some other operation (e.g. ADD PARTITION or PCTFREE which is illegal

  • 状态: 部分验证,暂时只遇到下面分析中的例子。
  • 分析: ALTER TABLE或ALTER INDEX语句的参数之前有冲突,其它操作对分区维护的操作造成影响。有可能是人为执行设置的语句;亦有可能类似于下例情况,oracle拼接而成的语句:

    -- 创建测试表,在字段后加primary key,则是系统自动生成的约束和索引的名称,而不是人为指定。
    create table ora_14048(a number primary key, b varchar2(30));
    -- 将测试表主键约束对应的索引设置为不可用状态
    alter index SYS_C009537 unusable;
    
    -- windows系统cmd窗口导出测试表
    expdp C##LY/密码@XE tables=ora_14048 dumpfile=ora_14048.dmp directory=data_pump_dir logfile=expdp_ora_14048.log
    -- 然后导入测试表
    impdp INFA/密码@XE remap_schema=C##LY:INFA dumpfile=ora_14048.dmp directory=data_pump_dir logfile=impdp_ora_14048.log
    -- 导入有错,日志如下
    ;;; 
    Import: Release 11.2.0.2.0 - Production on 星期五 91 10:43:59 2017
    
    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
    ;;; 
    连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
    已成功加载/卸载了主表 "INFA"."SYS_IMPORT_FULL_01" 
    启动 "INFA"."SYS_IMPORT_FULL_01":  INFA/********@XE remap_schema=C##LY:INFA dumpfile=ora_14048.dmp directory=data_pump_dir logfile=impdp_ora_14048.log 
    处理对象类型 TABLE_EXPORT/TABLE/TABLE
    处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
    . . 导入了 "INFA"."ORA_14048"                              0 KB       0 行
    处理对象类型 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
    ORA-39083: 对象类型 CONSTRAINT 创建失败, 出现错误:
    ORA-14048: 分区维护操作不能与其他操作组合
    失败的 sql 为:
     ALTER INDEX "INFA"."SYS_C009537"  UNUSABLE ENABLE
    作业 "INFA"."SYS_IMPORT_FULL_01" 已经完成, 但是有 1 个错误 (10:44:01 完成)
    
    -- 查询该表索引和约束情况,发现状态还是正常,索引约束都建立起来了。只是索引名约束名不一致,且索引未能与来源库中一样状态为UNUSABLE。
    select t.status, t.* from user_indexes t where t.table_name = 'ORA_14048';
    select t.status, t.* from user_constraints t where t.table_name = 'ORA_14048';
    
  • 措施: 确保分区维护操作是ALTER TABLE或ALTER INDEX语句中指定的唯一操作;除处理分区之外的,分区表/索引的默认属性的操作或指定表重命名(ALTER TABLE RENAME)的操作都可以随意组合

    Ensure that a partition maintenance operation is the sole operation specified in ALTER TABLE or ALTER INDEX statement; operations other than those dealing with partitions, default attributes of partitioned tables/indices or specifying that a table be renamed (ALTER TABLE RENAME) may be combined at will

    • 人为执行设置的语句,那么还是主动拆开执行操作。
    • 如果是分析中提到的例子,那么猜测是由于oracle的程序内部的问题,未能正常拼接好执行语句,所以如果仍需要将该索引设置为不可用状态,那么在目标库里面同样执行一下设置语句即可(注意,由于是系统生成的索引名,那么在导入到目标库时也是由目标库自主生成的索引名,因此会出现索引名称不一致。需要查询表在目标库里真正的索引名称,然后进行操作);如果不需要设置为不可用状态,那么久不用执行:
      -- 但由于索引名称不一致的问题,如果是导入的表空间或用户等更大级别的数据,那么出现问题时估计就不清楚需要设置不可用状态的索引具体对应的是哪个表了
      -- 此时估计应该从来源库中查询到对应索引的所在表,然后再在目标库中找到该表的索引获取到索引名称然后进行操作。
      alter index SYS_C009554 unusable;
      

ORA-14063: 唯一/主键约束条件关键字中存在无用索引

ORA-14063: Unusable index exists on unique/primary constraint key

原因1: 用户尝试添加或启用主键/唯一约束于(多)列,但这些列上的索引存在有标记为Index Unusable的。

User attempted to add or enable a primary key/unique constraint on column(s) of a table on which there exists an index marked Index Unusable.

  • 状态: 已验证。
  • 分析: 约束要想有效,都必须通过索引来实现,创建约束时都会默认创建同名的索引或关联到约束字段上已有的索引。索引通过alter index 索引名 unusable;可设置为不可用状态,那么关联的约束就无法正常启用或者想在索引限制的字段上创建约束也是无法创建成功的。
  • 措施: 删除现有索引或使用ALTER INDEX REBUILD重建它。

    Drop the existing index or rebuild it using ALTER INDEX REBUILD

    • 如果判断确定,仍需要创建或启用主键约束或唯一约束,那么则需执行alter index 索引名 rebuild;将索引重建或者先删除该索引,然后再执行对应约束语句即可。
    • 如果判断确定,此处不需要再创建或启用约束,那么就不用管,让这个索引继续保持UNUSABLE,并保持对未来同样的操作的抗拒状态:);或者将索引删除,那么以后有其他人想创建就不会再遇到这个问题了。
Copyright © he.lili 2017 all right reserved,powered by Gitbook最新修订日期(UTC时区): 2017-10-27 03:29:34

results matching ""

    No results matching ""