Oracle-APEX組件失效問題
1. 問題現象
在Oracle11.2.0.4版本中發現APEX組件失效
set lines 168 pages 99
col comp_name for a32
select comp_name, version, status, schema from dba_registry where status='INVALID';
COMP_NAME VERSION STATUS SCHEMA
-------------------------------- ------------------------------ ---------------------- ------------------------------
Oracle Application Express 3.2.1.00.12 INVALID APEX_030200
col object_name for a32
select owner, object_name, object_type from dba_objects where status = 'INVALID';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------------------- -------------------
APEX_030200 WWV_FLOW_HELP PACKAGE BODY
2. 分析
重新編譯失效包體
alter package APEX_XXXXXX.WWV_FLOW_HELP compile body;
show err;
col text for a64
select text from dba_errors where name = 'WWV_FLOW_HELP' and owner ='APEX_030200';
輸出結果,發現表或視圖或包不存在。如下:
SQL> show err
Errors for PACKAGE BODY APEX_030200.WWV_FLOW_HELP:
LINE/COL ERROR
-------- -----------------------------------------------------------------
188/20 PL/SQL: SQL Statement ignored
189/27 PL/SQL: ORA-00942: table or view does not exist
191/13 PL/SQL: Statement ignored
191/13 PLS-00201: identifier 'CTX_DDL.DROP_PREFERENCE' must be declared
196/16 PL/SQL: SQL Statement ignored
197/23 PL/SQL: ORA-00942: table or view does not exist
199/9 PL/SQL: Statement ignored
199/9 PLS-00201: identifier 'CTX_DDL.DROP_PREFERENCE' must be declared
261/5 PL/SQL: Statement ignored
261/5 PLS-00201: identifier 'CTX_DDL.CREATE_PREFERENCE' must be
declared
262/5 PL/SQL: Statement ignored
262/5 PLS-00201: identifier 'CTX_DDL.SET_ATTRIBUTE' must be declared
265/9 PL/SQL: Statement ignored
265/9 PLS-00201: identifier 'CTX_DDL.SET_ATTRIBUTE' must be declared
280/9 PL/SQL: Statement ignored
280/9 PLS-00201: identifier 'CTX_DDL.CREATE_PREFERENCE' must be
declared
292/13 PL/SQL: Statement ignored
292/13 PLS-00201: identifier 'CTX_DOC.FILTER' must be declared
312/13 PL/SQL: Statement ignored
312/13 PLS-00201: identifier 'CTX_DOC.FILTER' must be declared
SQL>
通過Oracle內部包都wrapped加密,不能直接查看包體代碼,需要解碼
set long 9999
select dbms_metadata.get_ddl('PACKAGE_BODY','WWV_FLOW_HELP','APEX_030200') from dual;
檢查相關對象是否存在
set lines 168 pages 99
col object_name for a32
select owner,object_name, object_type, status from dba_objects where object_name in ('CTX_DDL','CTX_DOC','CTX_USER_PREFERENCES');
no rows selected
從上面輸出結果,發現對象都不存在。到其它數據庫檢查知道這3個對象都屬於CTXSYS 模式
檢查故障庫用戶及其所有組件信息
select username, account_status from dba_users where username='CTXSYS';
select comp_id, comp_name,VERSION,MODIFIED,PROCEDURE, status from dba_registry where schema='CTXSYS';
發現該故障庫未安裝相關對象組件。
總結
至此,問題原因已經浮出水面。由於CTXSYS模式未安裝引起APEX組件缺失相關表、視圖和包,導致APEX組件中一個包體失效。
3. 解決措施
前期准備
配置環境變量
Platform: Requires path set: ENV variable:
--------------------- --------------------- -------------------
Linux x86-64 YES LD_LIBRARY_PATH
Solaris SPARC64 YES LD_LIBRARY_PATH
IBM AIX YES LIBPATH
HP PA-RISC YES SHLIB_PATH
HP Itanium YES LD_LIBRARY_PATH
- If you have the C Shell (csh or tcsh), enter the following:
$ setenv LD_LIBRARY_PATH $ORACLE_HOME/ctx/lib:$LD_LIBRARY_PATH
- If you have the Bourne shell (sh), Bash shell (bash), or Korn shell (ksh), enter the following:
$ export LD_LIBRARY_PATH=$ORACLE_HOME/ctx/lib:$LD_LIBRARY_PATH
Run the following command to check if the LD_LIBRARY_PATH environmental variable is set correctly:
$ echo $LD_LIBRARY_PATH
CTXSYS用戶所需權限
需要執行DBMS_LOB and DBMS_SCHEDULER的權限(默認授權給PUBLIC)
grant execute on DBMS_SCHEDULER to PUBLIC;
grant execute on DBMS_JOB to PUBLIC;
grant execute on UTL_FILE to PUBLIC;
grant execute on UTL_HTTP to PUBLIC;
-- 確認
select owner, object_name, object_type,status from dba_objects where owner='PUBLIC' and object_name in ('DBMS_SCHEDULER', 'DBMS_JOB', 'UTL_FILE', 'UTL_HTTP') ;
安裝Oracle Text組件
創建CTXSYS用戶和組件
sqlplus / as sysdba
spool text_install.txt
@?/ctx/admin/catctx.sql change_on_install SYSAUX TEMP NOLOCK
- change_on_install 是ctxsys 用戶密碼
- SYSAUX 是ctxsys默認表空間
設置默認語言
connect "CTXSYS"/"change_on_install"
@?/ctx/admin/defaults/dr0defin.sql "AMERICAN";
conn / as sysdba
alter user ctxsys account lock password expire;
spool off
結果檢查
connect / as SYSDBA
set pages 1000
col object_name format a40
col object_type format a20
col comp_name format a30
column library_name format a8
column file_spec format a60 wrap
spool text_install_verification.log
-- check on setup
select comp_name, status, substr(version,1,10) as version from dba_registry where comp_id = 'CONTEXT';
select * from ctxsys.ctx_version;
select substr(ctxsys.dri_version,1,10) VER_CODE from dual;
select count(*) from dba_objects where owner='CTXSYS';
-- Get a summary count
select object_type, count(*) from dba_objects where owner='CTXSYS' group by object_type;
-- Any invalid objects
select object_name, object_type, status from dba_objects where owner='CTXSYS' and status != 'VALID' order by object_name;
spool off