Oracle Text 组件未默认安装,需检查CTXSYS用户状态;若不存在或为EXPIRED & LOCKED,则未装或禁用;安装前须满足4个硬性条件:SYSTEM表空间≥500MB、字符集为AL32UTF8/ZHS16GBK、实例OPEN且非RESTRICTED、SYS AS SYSDBA登录并SET SERVEROUTPUT ON;手动执行catctx.sql后验证dba_registry中状态为VALID,并解锁CTXSYS用户。
Oracle Text 组件是否已安装?先查 CTXSYS 用户和数据字典
oracle text 不是默认必装组件,12c 及以后版本中甚至可能完全未部署。直接连数据库执行:
select username, account_status from dba_users where username = 'ctxsys';如果返回空行,说明组件没装;若状态为
expired & locked,大概率是装了但被禁用或初始化失败。别急着运行 catqm.sql 或 catctx.sql —— 这些脚本依赖数据库字符集、undo 表空间大小、以及是否处于 upgrade 模式,盲目执行会卡住或报 ora-01031: insufficient privileges。
安装前必须确认的 4 个硬性条件
缺一不可,否则 catctx.sql 会中途退出且不提示具体原因:
-
SYSTEM表空间剩余空间 ≥ 500MB(CTXSYS默认建在此处,不能指定其他表空间) - 数据库字符集为
AL32UTF8或ZHS16GBK(不支持WE8ISO8859P1等单字节字符集) - 当前实例处于
OPEN状态,且非RESTRICTED模式(SELECT logins FROM v$instance;应返回ALLOWED) - 以
SYS AS SYSDBA登录,且SQL*Plus中已执行SET SERVEROUTPUT ON(否则安装日志看不到关键错误)
手动安装步骤:从解压到 CTXSYS 可用
适用于 19c/21c 单机或 RAC(RAC 需在所有节点重复):
- 确认 Oracle Home 下存在
$ORACLE_HOME/ctx/admin/catctx.sql(若缺失,说明安装介质没选 “Oracle Text” 选项,需重跑runInstaller补装) - 用
SYS执行:@$ORACLE_HOME/ctx/admin/catctx.sql CTXSYS SYSAUX TEMP NOLOG
其中NOLOG表示跳过日志模式检查(避免因归档未开而失败),SYSAUX是强制指定的默认表空间 - 执行完后立即验证:
SELECT comp_name, status FROM dba_registry WHERE comp_name = 'Oracle Text';
状态必须为VALID;若为LOADING,说明后台作业卡住,需查dba_scheduler_job_log - 解锁并设密码:
ALTER USER ctxsys IDENTIFIED BY oracle123 ACCOUNT UNLOCK;
(密码需满足复杂度策略,否则仍为LOCKED)
常见失败场景与绕过技巧
不是所有报错都要重装:
- 报
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine:通常是全文索引创建时触发的,跟安装无关,忽略;真正安装失败的标志是catctx.sql脚本输出里出现ERROR at line X:且后续无PL/SQL procedure successfully completed -
CTXSYS用户存在但ctx_ddl包不可用:执行EXEC ctxsys.ctx_adm.set_parameter('skip_sync', 'TRUE');再重编译包:ALTER PACKAGE ctxsys.ctx_ddl COMPILE BODY;
- RAC 环境下部分节点
CTXSYS状态不一致:不要单独在某节点运行catctx.sql,必须先停掉所有实例,再逐个启动并安装,否则数据字典不同步
最易被忽略的是:安装后首次调用 ctx_ddl.create_preference 时,若报 ORA-06508: PL/SQL: could not find program unit being called,说明 CTXSYS 的 Java source 没加载全——此时需手动运行 $ORACLE_HOME/ctx/admin/javarem.sh(Linux)或 javarem.bat(Windows)清理残留,再重跑 catctx.sql。

















