1、Oracle OJVM的作用
Oracle JavaVM(OJVM)是 Oracle 数据库中的一个内置 Java 虚拟机组件,主要功能包括:
1)运行Java代码:允许在数据库内部执行Java存储过程、函数和触发器,实现与SQL的紧密集成。
2)支持Java应用:为使用Java开发的数据库应用(如 JDBC、Java 存储过程)提供运行时环境。
3)安全隔离:通过数据库的安全机制(例如权限控制)管理Java代码的访问权限。
4)性能优化:直接访问数据库数据,减少网络开销,适合数据密集型操作(如 ETL、复杂计算)。
2、Oracle OJVM安装情况
OJVM是被默认安装的。可以用下面的SQL可以判定OJVM是否被安装。
SELECT version, status FROM dba_registry WHERE comp_id='JAVAVM';
VERSION STATUS
------------------------------ --------------------------------------------
19.0.0.0.0 VALID
备注:如果status的值是VALID则代表安装,否则则意味没有被安装。
3、Oracle OJVM是否被使用
OJVM即使默认被安装,但是很多情况下,基本都是不会被使用。可以使用下面的SQL来确认OJVM是否被使用:
select count(*) from x$kglob where kglobtyp=29 or kglobtyp=56;
如果count的值为0,则表示组件虽然被默认安装,但是从未使用。
查询示例:
SQL> select count(*) from x$kglob where KGLOBTYP = 29 OR KGLOBTYP = 56;
COUNT(*)
----------
0
4、如何禁用Oracle OJVM组件
数据库打上PSU补丁(或者RU补丁后),升级数据字典后,执行如下两个命令禁用OJVM:
1、@?/rdbms/admin/dbmsjdev.sql
2、exec dbms_java_dev.disable;
备注:dbmsjdev.sql脚本会创建DBMS_JAVA_DEV包,DBMS_JAVA_DEV可以禁用和启用Java classes类对象授权给public公共用户,从而达到禁用和启用的作用。
5、如何卸载Oracle OJVM组件
删除OJVM组件
可以参考文章:
https://mikedietrichde.com/2017/08/07/javavm-xml-clean-oracle-database-11-2-12-2/
https://www.modb.pro/db/101439
备注:
请操作前在测试环境中做充分测试,请勿在生产环境中进行尝试。
不建议在已经运行一段时间的生产环境中做此操作。
6、如何重建Oracle OJVM组件
简要步骤:
alter system set java_jit_enabled = FALSE;
alter system set "_system_trig_enabled"=FALSE;
-- Keep a Note of original JOB_QUEUE_PROCESSES value before this
alter system set JOB_QUEUE_PROCESSES=0;
create or replace java system
/
alter system set java_jit_enabled = true;
alter system set "_system_trig_enabled"=TRUE;
alter system set JOB_QUEUE_PROCESSES=10;
@?/rdbms/admin/utlrp.sql
具体参考官方文档:Safe repair/reinstall of the JVM Component in 11.2 and up (Doc ID 2314363.1)
建议做好充分测试,再尝试。
7、OJVM的补丁集
OJVM PSU主要是针对oracle java VM。
从2014年10月开始Oracle JavaVM组件作为一个单独的部分来进行安装。之前是包含在oracle rdbms psu中。
只要oracle db中安装jvm组件,就需要安装对应版本的oracle JavaVM PSU。如果只是打了rdbms的PSU,安全漏洞检查就会检查出jvm的安全漏洞。特别是OJVM的"反序列化"漏洞,基本一直没有消停过。
补丁安装方式,可以参考我的《Oracle 11g单库环境PSU补丁安装》和《Oracle 19c单库环境RU补丁安装》文章