Oracle 11gR2升级19c时出现ORA-04023:SYS.DBMS_JAVA验证授权错误
ORA-04023: Object SYS.DBMS_JAVA could not be validated or authorized
报错产生原因
- 跨版本升级JVM组件未完成自动编译:11gR2升级到19c的过程中,Oracle内置JVM组件的系统对象未完成自动重编译,SYS.DBMS_JAVA包状态变为INVALID,常规重编译逻辑无法自动修复异常。
- Java权限配置被重置:升级后原有SYS、PUBLIC用户的Java执行权限被默认重置,缺少DBMS_JAVA调用所需的底层权限,导致包无法通过授权验证。
- 旧版本JVM补丁冲突:11g环境中安装过的JVM专属补丁没有提前卸载,升级到19c后残留补丁和新版JVM组件不兼容,导致DBMS_JAVA验证失败。
- 共享池残留锁或空间不足:升级后首次调用DBMS_JAVA时共享池可用空间不足,或者之前的异常操作导致DBMS_JAVA对象上存在残留锁,无法完成加载验证。
排查步骤
- 检查DBMS_JAVA包状态,执行SQL:
select owner, object_name, object_type, status from dba_objects where owner='SYS' and object_name='DBMS_JAVA';
如果返回STATUS为INVALID,说明包未编译通过。 - 检查JVM组件整体状态,执行SQL:
select comp_id, comp_name, version, status from dba_registry where comp_id='JAVAVM';
如果STATUS不为VALID,说明JVM组件整体异常。 - 检查Java调用权限配置,执行SQL:
select grantee, privilege from dba_java_policy where grantee in ('SYS','PUBLIC');
确认是否存在JAVAUSERPRIV、JAVADEBUGPRIV等必要权限。
修复方案
- 单包重编译:如果仅DBMS_JAVA为无效状态,先尝试直接重编译包体:
alter package SYS.DBMS_JAVA compile body;
如果仍无效,执行全库无效对象重编译脚本:@?/rdbms/admin/utlrp.sql - 修复JVM组件:如果JVM整体状态异常,停止所有业务连接后以SYS身份执行重装脚本:
@?/rdbms/admin/initjvm.sql @?/rdbms/admin/catjava.sql
执行完成后再次运行utlrp.sql重编译所有无效对象。
- 重置Java权限:如果是权限缺失导致,执行以下语句授予必要权限后重启实例生效:
exec dbms_java.grant_permission( 'PUBLIC', 'SYS:java.lang.RuntimePermission', '*', '' );exec dbms_java.grant_permission( 'SYS', 'SYS:java.lang.AllPermission', '*', '' ); - 清理共享池残留:非业务高峰执行刷新共享池操作,清理对象锁残留:
alter system flush shared_pool;
如果仍有持有锁的会话,查询并kill对应会话:select * from v$locked_object where object_id = (select object_id from dba_objects where owner='SYS' and object_name='DBMS_JAVA');
内容的提问来源于stack exchange,提问作者user16893235
相关产品推荐
相关产品推荐

