代码改变世界

Oracle打19.28 RU补丁遇到ORA-29532错误案例总结

2025-08-27 14:28  潇湘隐者  阅读(45)  评论(0)    收藏  举报

上一篇文章"Windows平台安装Oracle RU 19.28补丁遇到的小问题"中介绍了Windows平台安装Oracle 19.28 RU补丁遇到的几个小问题,今天终于在Linux平台安装Oracle 19.28 RU补丁时也遇到了一个小问题,当然这个问题跟平台没有关系,下面简单总结一下.

在做datapatch时,遇到了下面错误

Validating logfiles...done
Patch 37960098 apply (pdb *****): WITH ERRORS
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37960098/27635722/37960098_apply_*****_*****_2025Aug27_09_52_37.log (errors)
  -> Error at line 13455: script rdbms/admin/backport_files/bug_37243920_apply.sql
      - ORA-29532: Java call terminated by uncaught Java exception:
      - oracle.aurora.server.tools.loadjava.ToolsError:
      - Error during dropjava: opening file javax/servlet/GenericServlet.
      - Check trace file for details
      - ORA-06512: at line 24
Patch 37847857 apply (pdb *****): WITH ERRORS (PREV PATCH)
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37847857/27534561/37847857_apply_*****_*****_2025Aug27_09_52_08.log (no errors)
Patch 37960098 apply (pdb *****): WITH ERRORS
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37960098/27635722/37960098_apply_*****_*****_2025Aug27_09_52_37.log (errors)
  -> Error at line 13455: script rdbms/admin/backport_files/bug_37243920_apply.sql
      - ORA-29532: Java call terminated by uncaught Java exception:
      - oracle.aurora.server.tools.loadjava.ToolsError:
      - Error during dropjava: opening file javax/servlet/GenericServlet.
      - Check trace file for details
      - ORA-06512: at line 24
Patch 37847857 apply (pdb *****): WITH ERRORS (PREV PATCH)
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37847857/27534561/37847857_apply_*****_*****_2025Aug27_09_52_08.log (no errors)
Patch 37960098 apply (pdb *****): WITH ERRORS
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37960098/27635722/37960098_apply_*****_*****_2025Aug27_09_52_37.log (errors)
  -> Error at line 13455: script rdbms/admin/backport_files/bug_37243920_apply.sql
      - ORA-29532: Java call terminated by uncaught Java exception:
      - oracle.aurora.server.tools.loadjava.ToolsError:
      - Error during dropjava: opening file javax/servlet/GenericServlet.
      - Check trace file for details
      - ORA-06512: at line 24
Patch 37847857 apply (pdb *****): WITH ERRORS (PREV PATCH)
  logfile: /opt/oracle19c/cfgtoollogs/sqlpatch/37847857/27534561/37847857_apply_*****_*****_2025Aug27_09_52_08.log (no errors)

Please refer to MOS Note 1609718.1 and/or the invocation log
/opt/oracle19c/cfgtoollogs/sqlpatch/sqlpatch_1124749_2025_08_27_09_46_22/sqlpatch_invocation.log
for information on how to resolve the above errors.

SQL Patching tool complete on Wed Aug 27 09:55:50 2025

其中主要的报错信息如下所示:

Error at line 13455: script rdbms/admin/backport_files/bug_37243920_apply.sql
      - ORA-29532: Java call terminated by uncaught Java exception:
      - oracle.aurora.server.tools.loadjava.ToolsError:
      - Error during dropjava: opening file javax/servlet/GenericServlet.
      - Check trace file for details
      - ORA-06512: at line 24

检查具体错误日志,详细错误信息如下截图所示:

在Oracle Support官网找到了出错的原因,官方文档"19.28 OJVMRU Datapatch Execution Failing With ORA-29532 Error During Dropjava Command While Opening File javax/servlet (Doc ID 3097851.1)"
中解释之所以出现这个错误,是因为当时创建PDB时,指定了PATH_PREFIX.官方的详细解释如下所示:

CHANGES
This error is triggered both when upgrading from 19.26/19.27 to 19.28 and when attempting a rollback using datapatch from the previous Oracle Home. The error occurs regardless of whether the database is actively using Java features or not.

CAUSE
This issue can not occur in non-CDBs. It is specific to PDBs that have PATH_PREFIX set. It can not occur even in PDBs without PATH_PREFIX set

Below query can be used to identify if PDB have the PATH_PREFIX set.

On CDB as sysdba

SQL> alter session set container=<PDB_NAME>; ====>>> Provide the PDB name where datapatch failed with above error


SQL> select property_value from cdb_properties where property_name='PATH_PREFIX';

PROPERTY_VALUE
--------------------------------------------------------------------------------
/xxxx/xxxxx/xxxxxxxxx


There is an open BUG 38241374 for this issue and at the time of writing this doc, bug is still being worked by Oracle development team

解决方案

检查对应PDB的PATH_PREFIX设置,如下所示

SQL> alter session set container=*****;

Session altered.

SQL> select property_value from cdb_properties where property_name='PATH_PREFIX';

PROPERTY_VALUE
--------------------------------------------------------------------------------
/****uatdb/data/pdbseed

SQL> 

然后在对应的PDB执行下面SQL语句

alter session set container=<PDB NAME>;

@@?/rdbms/admin/sqlsessstart.sql

show con_name

set serveroutput on
declare
cur sys_refcursor;
jvm_stat number;
class_name varchar2(512);
prop_val varchar2(1000);
begin
select status into jvm_stat from sys.registry$ where cid = 'JAVAVM';
if jvm_stat <> 99 and SYS_CONTEXT('USERENV','CON_ID') > 1 then
select property_value into prop_val from cdb_properties where property_name='PATH_PREFIX';
-- Drop javax/servlet
open cur for
q'[select dbms_java.longname(object_name) from all_objects
where object_type = 'JAVA CLASS'
and dbms_java.longname(object_name) like 'javax/servlet/%']';
loop
fetch cur into class_name;
exit when cur%NOTFOUND;
execute immediate 'drop java class "' || class_name || '"';
execute immediate 'drop public synonym "' || class_name || '"';
dbms_output.put_line('Java class [' || class_name || '] dropped');
end loop;
close cur;

end if;
exception when no_data_found then null;
end;
/

COMMIT;

@?/rdbms/admin/sqlsessend.sql

具体执行的详细信息如下所示:

SQL> alter session set container=****;

Session altered.

SQL> 

SQL> @@?/rdbms/admin/sqlsessstart.sql

Session altered.

SQL> show con_name

CON_NAME
------------------------------
*****
SQL> 
SQL> set serveroutput on
SQL> declare
  2  cur sys_refcursor;
  3  jvm_stat number;
  4  class_name varchar2(512);
  5  prop_val varchar2(1000);
  6  begin
  7  select status into jvm_stat from sys.registry$ where cid = 'JAVAVM';
  8  if jvm_stat <> 99 and SYS_CONTEXT('USERENV','CON_ID') > 1 then
  9  select property_value into prop_val from cdb_properties where property_name='PATH_PREFIX';
 10  -- Drop javax/servlet
 11  open cur for
 12  q'[select dbms_java.longname(object_name) from all_objects
 13  where object_type = 'JAVA CLASS'
 14  and dbms_java.longname(object_name) like 'javax/servlet/%']';
 15  loop
 16  fetch cur into class_name;
 17  exit when cur%NOTFOUND;
 18  execute immediate 'drop java class "' || class_name || '"';
 19  execute immediate 'drop public synonym "' || class_name || '"';
 20  dbms_output.put_line('Java class [' || class_name || '] dropped');
 21  end loop;
 22  close cur;
 23  
 24  end if;
 25  exception when no_data_found then null;
 26  end;
 27  /
Java class [javax/servlet/GenericServlet] dropped
Java class [javax/servlet/RequestDispatcher] dropped
Java class [javax/servlet/Servlet] dropped
Java class [javax/servlet/ServletConfig] dropped
Java class [javax/servlet/ServletContext] dropped
Java class [javax/servlet/ServletException] dropped
Java class [javax/servlet/ServletInputStream] dropped
Java class [javax/servlet/ServletOutputStream] dropped
Java class [javax/servlet/ServletRequest] dropped
Java class [javax/servlet/ServletResponse] dropped
Java class [javax/servlet/SingleThreadModel] dropped
Java class [javax/servlet/UnavailableException] dropped
Java class [javax/servlet/http/Cookie] dropped
Java class [javax/servlet/http/HttpServlet] dropped
Java class [javax/servlet/http/HttpServletRequest] dropped
Java class [javax/servlet/http/HttpServletResponse] dropped
Java class [javax/servlet/http/HttpSession] dropped
Java class [javax/servlet/http/HttpSessionBindingEvent] dropped
Java class [javax/servlet/http/HttpSessionBindingListener] dropped
Java class [javax/servlet/http/HttpSessionContext] dropped
Java class [javax/servlet/http/HttpUtils] dropped
Java class [javax/servlet/http/NoBodyOutputStream] dropped
Java class [javax/servlet/http/NoBodyResponse] dropped

PL/SQL procedure successfully completed.

SQL> COMMIT;

Commit complete.

SQL> @?/rdbms/admin/sqlsessend.sql

Session altered.

SQL> 

在每一个有问题的PDB上执行上面SQL语句后,重新跑datapatch脚本,经过实际验证,上述方法能解决这个问题. 另外,在搜索这个问题的时候,也发现还有其他一些原因也会遇到ORA-29532,不过出错的细节有所不同。个人没有碰到过那样的问题。

参考资料

19.28 OJVMRU Datapatch Execution Failing With ORA-29532 Error During Dropjava Command While Opening File javax/servlet (Doc ID 3097851.1)