4

我无法删除并重新创建 oracle 文本索引。

SQL> drop index "WBR"."CTX_t1";

Index dropped

SQL> 
SQL> CREATE INDEX "WBR"."CTX_t1"
  2  ON WBR.t1(ASSET_XML)
  3  INDEXTYPE IS "CTXSYS"."CONTEXT"
  4  PARAMETERS ('DATASTORE CTXSYS.DIRECT_DATASTORE SECTION GROUP CTXSYS.AUTO_SECTION_GROUP SYNC (every "SYSDATE+10/1440")')
  5  ;

CREATE INDEX "WBR"."CTX_t1"
ON WBR.t1(ASSET_XML)
INDEXTYPE IS "CTXSYS"."CONTEXT"
PARAMETERS ('DATASTORE CTXSYS.DIRECT_DATASTORE SECTION GROUP CTXSYS.AUTO_SECTION_GROUP SYNC(every "SYSDATE+10/1440")')

ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10507: duplicate index name: CTX_t1
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366

即使删除了 cintext 索引,我也可以看到 CTXSYS.CTX_INDEXES 中的条目。

作业和内部表仍在数据库中:

DR$CTX_t1$I
DR$CTX_t1$J--job
DR$CTX_t1$K
DR$CTX_t1$N
DR$CTX_t1$R
DR$CTX_t1$X

有什么建议么?

4

4 回答 4

2

这似乎是甲骨文的一个错误。我们有一个脚本可以从生产数据库中刷新我们的质量数据库。为了解决这个问题,我们在刷新开始之前执行这个 PL/SQL 脚本。

    /**
     * Correctif bug sur la suppression d'index full text: 
     * Unable to recreate an Oracle Text index as the database continually throws a "DRG-10507: duplicate index name" error
     * http://ask4dba.blogspot.com/2016/11/drg-10507-in-creating-text-index-after.html
     * https://www.ibm.com/support/pages/unable-recreate-oracle-text-index-database-continually-throws-drg-10507-duplicate-index-name-error
    **/
    DECLARE
      LR$IDX_ID NUMBER(15);
      LR$IDX_NAME VARCHAR2(255);
      LR$SCHEMA VARCHAR2(255);

    CURSOR C1 IS

            select IDX_ID, IDX_NAME, usr.USERNAME from CTXSYS.DR$INDEX
            join all_users usr on usr.USER_ID = IDX_OWNER#
            where IDX_NAME in ('IDX_EDI_EMISSION_MSG_EAI', 'IDX_EDI_EMISSION_MSG', 'IDX_EDI_RECEPTION_MSG', 'IDX_EDI_RECEPTION_MSG_TMS');

    BEGIN 

        DBMS_OUTPUT.put_line('DEBUT de la suppression des index fulltext' );
        OPEN C1;
        LOOP 
            FETCH C1 INTO  LR$IDX_ID, LR$IDX_NAME, LR$SCHEMA;
            EXIT WHEN C1%NOTFOUND; 

            BEGIN

                BEGIN

                    DBMS_OUTPUT.put_line('Suppression (drop) de l''index '|| LR$SCHEMA || '.' || LR$IDX_NAME );
                    execute immediate 'DROP INDEX ' || LR$SCHEMA || '.' || LR$IDX_NAME;

                EXCEPTION
                    WHEN OTHERS THEN

                        DBMS_OUTPUT.put_line('Erreur Oracle #'||TO_CHAR(SQLCODE)||' : '||SQLERRM(SQLCODE));
                        DBMS_OUTPUT.put_line('L''index ' || LR$IDX_NAME ||' n''existe pas :  ' || LR$IDX_ID);

                END;

                DBMS_OUTPUT.put_line('Suppression des lignes de l''index ' || LR$IDX_ID);
                delete from ctxsys.dr$index_value where IXV_IDX_ID = LR$IDX_ID;
                delete from ctxsys.dr$index_object where IXO_IDX_ID = LR$IDX_ID;
                delete from ctxsys.dr$index where idx_id = LR$IDX_ID;
                commit;

            END;                       

        END LOOP;

        CLOSE C1;
        COMMIT;
    End ;
    /
于 2019-11-26T11:33:25.210 回答
2

1)检查是否存在同名的其他对象(可能不区分大小写)

select owner, object_name, object_type from dba_objects where upper(object_name) like '%CTX_T1%';

如果是的话,放弃它。

2) 尝试使用 FORCE 选项删除索引

drop index "WBR"."CTX_t1" FORCE;

如果没有帮助:

3) 联系 Oracle 支持

于 2015-09-30T17:05:53.623 回答
1

[1] 甲骨文文本:Create Or Alter Index Fails With DRG-50857, ORA-27486 ( Doc ID 2497828.1 )

grant create作业给用户,然后尝试创建索引,它应该可以工作。

我遇到了将索引同步参数从更改为的情况('SYNC (on commit)')('SYNC (EVERY "SYSDATE+15/1440")')因为这将自动使用 Oracle 作业,架构应该具有创建作业权限。

于 2020-07-01T20:58:07.393 回答
0

对于那些在创建索引期间和在删除索引语句之后遇到稍微不同的错误(我在 Oracle 12c 上)的人来说,这基本上不是一个答案:

ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvxtab.create_index_tables
ORA-00955: name is already used by an existing object
ORA-06512: at "CTXSYS.DRUE", line 171
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 316

在删除索引和清除 CTXSYS 表中的相关数据之间似乎存在时间滞后(或其他原因)(但我不需要任何提交语句)。所以对我来说,再次执行删除索引并运行相同的创建语句再次解决了问题(第二次创建运行正常)

于 2017-05-29T13:08:08.270 回答