zoukankan      html  css  js  c++  java
  • 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 模式

    image-20200727105551116

    检查故障库用户及其所有组件信息

    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
    
  • 相关阅读:
    Coursera机器学习week11 单元测试
    关于 TypeReference 的解释
    getModifiers 方法解释。
    instanceof isInstance isAssignableFrom 比较
    elasticsearch 基础 语法总结
    kibana 启动 关闭 和进程查找
    MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
    spring boot 项目 热启动
    java zip 压缩文件
    Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  • 原文地址:https://www.cnblogs.com/binliubiao/p/13384777.html
Copyright © 2011-2022 走看看