0

我们的 Oracle 11.2.0.3 数据库中有几个 CTXCAT 类型的 Oracle Text 索引。Oracle 企业管理器中的一个进程每 8 分钟运行一次,并转储有关多年不存在的索引的错误,例如跟踪文件 $ORACLE_HOME/node_SID/sysman/log/emagent.trc 中的一个:

==================================================================
2013-08-13 05:51:09,882 Thread-1079278176 WARN  vpxoci: OCI Error -- ErrorCode(20000): ORA-20000: Oracle Text error:
DRG-10502: index PRODUCTION.IX2_WEB_SESSION_DETAIL does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

SQL = "/* OracleOEM */
DECLARE
   TYPE        data_cursor_type IS REF CURSOR;
  data_c"...
LOGIN = dbsnmp/<PW>@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node-vip)(PORT=1521))(CONNECT_DATA=(SID=ORCL1)))
2013-08-13 05:51:09,882 Thread-1079278176 ERROR fetchlets.sql: ORA-20000: Oracle Text error:
DRG-10502: index PRODUCTION.IX2_WEB_SESSION_DETAIL does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

2013-08-13 05:51:09,882 Thread-1079278176 ERROR engine: [rac_database,ORCL,textIndexStats] : nmeegd_GetMetricData failed : ORA-20000: Oracle Text error:
DRG-10502: index PRODUCTION.IX2_WEB_SESSION_DETAIL does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

2013-08-13 05:51:09,882 Thread-1079278176 WARN  collector: <nmecmc.c> Error exit. Error message: ORA-20000: Oracle Text error:
DRG-10502: index PRODUCTION.IX2_WEB_SESSION_DETAIL does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48
==================================================================

我进行了一次疯狂的尝试,并以 CONTEXT 类型的名称创建了一个新索引(CTXCAT 不起作用),错误停止了一段时间。我删除了该索引,然后开始得到以下内容,这与我在尝试创建 CTXCAT 类型的索引时看到的错误相同:

==================================================================
2013-08-30 02:13:07,129 Thread-1075751520 WARN  vpxoci: OCI Error -- ErrorCode(20000): ORA-20000: Oracle Text error:
DRG-11119: operation is not supported by this index type
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

SQL = "/* OracleOEM */
DECLARE
   TYPE        data_cursor_type IS REF CURSOR;
  data_c"...
LOGIN = dbsnmp/<PW>@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node-vip)(PORT=1521))(CONNECT_DATA=(SID=ORCL1)))
2013-08-30 02:13:07,129 Thread-1075751520 ERROR fetchlets.sql: ORA-20000: Oracle Text error:
DRG-11119: operation is not supported by this index type
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

2013-08-30 02:13:07,130 Thread-1075751520 ERROR engine: [rac_database,ORCL,textIndexStats] : nmeegd_GetMetricData failed : ORA-20000: Oracle Text error:
DRG-11119: operation is not supported by this index type
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48

2013-08-30 02:13:07,130 Thread-1075751520 WARN  collector: <nmecmc.c> Error exit. Error message: ORA-20000: Oracle Text error:
DRG-11119: operation is not supported by this index type
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 534
ORA-06512: at line 48
==================================================================

我做了一些调查,发现在任何 CTXCAT 类型索引上调用 ctx_report.index_stats( ctxcat_indexname ) 都会给我完全相同的错误,直到行号。

更多的调查随之而来,因为在谷歌上寻找 textIndexStats 并没有出现太多。我终于在输出列表中找到了它:

emctl status agent scheduler | grep textIndexStats

但是里面什么都没有select * from dba_scheduler_jobs matched textIndexStats,所以我不清楚下一步该往哪里看,想知道如何防止再次发生。

4

1 回答 1

1

我能够解决这个问题,并决定为可能遇到此问题并遇到我遇到的同一堵墙的其他人回答我自己的问题。我仍然不知道是什么原因造成的,但它已修复。

进一步的研究将我指向以下链接,其中包含足够的提示,可以为我指明正确的方向。http://docs.oracle.com/cd/B14099_19/manage.1012/b16242/emctl.htm

第 2.7.6 节“重新评估度量集合”包含有关存储企业管理器度量的文件的信息。为避免死链接,我将在此处复制该文章的一些摘录:

1. Go to $ORACLE_HOME/sysman/admin/metadata directory, where $ORACLE_HOME is the Oracle Home of the Management Agent.

2. Locate the XML file for the target type. For example, if you are interested in the host metric 'Filesystem Space Available(%)' metric, look for the host.xml file.

实际上,我在这个目录中查找了 textIndexStats,并在一个名为 database.xmlp 的文件中找到了它。我在以下行中发现了很多信息:

  <Metric NAME="textIndexStats" TYPE="RAW" IS_METRIC_LONG_RUNNING="TRUE" >

最有用的信息来自作为 CDATA 嵌入的 SQL,其中包括以下几行:

cursor idx_cur IS
select owner,job_name,comments
from dba_scheduler_jobs where job_name like 'EM_IDX_STAT_JOB%' and
upper(owner) = 'DBSNMP';

idx_rec idx_cur%ROWTYPE;
BEGIN
 OPEN idx_cur;
 FETCH idx_cur into idx_rec;
 guid := :1;
 IF idx_cur%FOUND THEN
   dbms_lob.createtemporary(statData,false);
   dbms_lob.createtemporary(sizeData,false);
   dbms_lob.createtemporary(objectsData,false);
   idx_name := substr(idx_rec.comments,1,instr(idx_rec.comments,'|')-1);

这很明显,不存在的索引名称正在从 DBSNMP 用户的 dba_scheduler_jobs 中的注释列中解析出来,其作业名称类似于“EM_IDX_STAT_JOB%”。

运行上面游标中使用的相同查询向我显示了调度程序表中的许多记录。显然,它们不是真正的调度程序条目,而是用于将此脚本排队,该脚本将数据插入 sysman.mgmt_text_index_stats。调度程序表中有许多 CTXCAT 和缺失索引。显然,调度程序表中的行仅在成功时才会被删除,并且不正确的条目将持续数年。

为了解决这个问题,我以用户 DBSNMP 的身份运行了以下命令:

BEGIN
   for idx_rec in (
    select owner,job_name,comments
    from dba_scheduler_jobs
    where job_name like 'EM_IDX_STAT_JOB%' and upper(owner) = 'DBSNMP')
  LOOP
  DBMS_SCHEDULER.DROP_JOB( idx_rec.job_name );
  END LOOP;
END;
/

这消除了垃圾邮件跟踪日志文件的问题。如果 CTXCAT 索引不能被添加,或者在那里它们被优雅地处理,那就太好了。我希望这对下一个 DBA 有所帮助,因为我在这上面花了太多时间。

于 2013-09-03T20:50:42.633 回答