1. 程式人生 > 實用技巧 >Oracle-APEX元件失效問題分析過程

Oracle-APEX元件失效問題分析過程

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