Oracle 19C 中共有16个组件,但并不是所有的都是必要的,多一个组件就会一个漏洞,特别是OJVM的“反序列化”漏洞,最近几年一直没有消停过。所以业务方面没有特别要求的话,在安装初期就可以勾选掉,只安装必需组件。
如果忘记勾选掉或者只能使用dbca静默模式创建的话,就会安装上那些非必需组件,本文将一一介绍那些非必需组件的删除方法,下次咱们讲组件的安装方法。

1. 删除OJVM组件
OJVM的组件包括“JServer JAVA Virtual Machine”、“Oracle Database Java Packages”。删除操作步骤如下:
1)检查要删除JVM影响的任何依赖于JVM的架构(Oracle提供或自定义)
SELECT owner, object_type, status, COUNT(*) FROM dba_objects WHERE object_type LIKE '%JAVA%' AND owner NOT IN ('SYS', 'OJVMSYS', 'EXFSYS') GROUP BY owner, object_type, status ORDER BY owner, object_type, status;
2)开启restricted 模式
connect as sysdbastartup mountalter database open;alter system enable restricted session;alter system set "_system_trig_enabled" = false scope=memory;
3)开启日志
spool force_removal.txtset echo on
4)如果第一步查到DBMS_JAVA_DEV,则执行如下步骤
exec dbms_java_dev.enable;
5)执行删除脚本
@?/rdbms/admin/catnoexf.sql@?/rdbms/admin/catnojav.sql
6)删除'JServer JAVA Virtual Machine' 和剩下的java对象
execute rmjvm.run(TRUE);
7)最后清理
truncate table java$jvm$status;delete from obj$ where obj#=0 and type#=0;commit;
8)检查是否还有java对象存在
select count(*) from obj$ where type#=29 and owner#=0;
9)更新registry 表
delete from sys.registry$ where cid in ('JAVAVM','CATJAVA','EXF');commit;
10)关闭日志记录
set echo offspool off
11) 重启数据库所有节点
2. 删除OLAP组件
OLAP的组件包括“OLAP Analytic Workspace”、“Oracle OLAP API”。删除操作步骤如下:
1)检查是否有需要备份的OLAP数据
select owner,aw_name from dba_aws where owner !='SYS';
如果没有返回数据,则不需要备份,如果有数据,需要备份则参考“Note 1935015.1 What and How to Export/Import OLAP Data
2)执行删除脚本
sqlplus nologconn as sysdbaspool remove_olap.log----> Remove OLAP Catalog@?/olap/admin/catnoamd.sql----> Remove OLAP API@?/olap/admin/catnoxoq.sql----> Deinstall APS - OLAP AW component@?/olap/admin/catnoaps.sql----> Recompile invalids@?/rdbms/admin/utlrp.sqlspool off
3)修改expdp中相关信息,以删除用于导出OLAP数据(如果需要回退,请不要执行此步骤)
delete from sys.exppkgact$ where package = 'DBMS_AW_EXP' and schema= 'SYS';delete from exppkgact$ where package='DBMS_CUBE_EXP';commit;
4)如果想从oracle的可执行文件中删除olap,则执行如下命令:
cd $ORACLE_HOME/rdbms/libmake -f ins_rdbms.mk olap_offmake -f ins_rdbms.mk ioracle
3. 删除DV组件
DV组件包括“Oracle Database Vault”,删除的操作步骤如下:
conn as sysdba@?/rdbms/admin/dvremov.sql
4. 删除ORDIM组件
ORDIM组件包括“Oracle Multimedia”,删除的操作步骤如下:
connect as sysdba@?/ord/im/admin/imremov.sql
5. 删除OLS组件
OLS组件包括“Oracle Label Security”,删除的操作步骤如下:
connect as sysdba@?/rdbms/admin/catnools.sql
Note:catnools.sql此脚本在12C~19C的数据库版本中没有提供,可以去11.2.0.4的相关目录找到catnools.sql来执行。
6. 删除XML组件
XML组件包括“Oracle XDK”,删除的操作步骤如下:
1)执行删除脚本
connect as sysdba@?\xdk\admin\rmxml.sql
2)更新registry表
delete from sys.registry$ where cid in ('XML');commit;
7. 删除SDO组件
SDO组件包括Spatial,删除的操作步骤如下:
1)检查Spatial indexes 是否存在
connect as sysdbaselect owner,index_name from dba_indexeswhere ityp_name = 'SPATIAL_INDEX';
若存在,则删除Spatial indexes,执行如下:
drop index <owner>.<indexname>;-- If some indexes cannot be dropped use the FORCE option:drop index <owner>.<indexname> force;
自动删除脚本如下:
set pagesize 0spool DropIndexes.sqlselect 'drop index ' || owner || '.' || index_name ||';'from dba_indexes where ityp_name = 'SPATIAL_INDEX';spool off@DropIndexes.sql
2)检查SDO_GEOMETRY类型的字段是否存在
set pages 200col owner for a20col table_name for a30col column_name for a25select owner, table_name, column_namefrom dba_tab_columnswhere data_type = 'SDO_GEOMETRY'and owner != 'MDSYS'order by 1,2,3;
若存在则执行如下命令:
set pagesize 0spool DropTables.sqlselect 'drop table '|| owner ||'.'|| table_name||';'from dba_tab_columnswhere data_type = 'SDO_GEOMETRY'and owner != 'MDSYS';spool off@DropTables.sql
清空存在SDO_GEOMETRY类型的字段的用户的回收站
purge recyclebin;
3)删除MDSYS用户
drop user MDSYS cascade;
4)删除为Spatial创建的所有公共同义词
set pagesize 0set feed offspool dropsyn.sqlselect 'drop public synonym "' || synonym_name || '";' from dba_synonyms where table_owner='MDSYS';spool off;@dropsyn.sql
5)删除Spatial 组件在安装过程中创建的其它用户
drop user mddata cascade;-- Only created as of release 11g:drop user spatial_csw_admin_usr cascade;drop user spatial_wfs_admin_usr cascade;
8. 删除CONTEXT组件
9. 删除APEX组件
APEX组件包括“Oracle Application Express”,删除的操作步骤如下:
1)检查apex组件是否在使用
运行apex_verify.sql脚本并检查输出以确认未使用APEX,APEX安装验证脚本参考文档ID 1254932.1。
2)检查apex的用户有哪些存在于数据库中,不同的apex版本,apex的用户名就不一样。
select username from dba_users where username like ‘APEX%’;select username from dba_users where username like ‘FLOWS%’;
3) 删除步骤2中查到的用户
Drop user XXXXXX cascade;
如果删除用户的时候,提示“ORA-28014: cannot drop administrative user or role”,则在删除用户前则执行如下命令:
alter session set "_oracle_script"=true;
删除用户之后再执行:
alter session set "_oracle_script"=false;
4) 删除APEX公共同义词
select 'drop public synonym ' || synonym_name || CHR(10) || '/' from sys.dba_synonymswhere table_owner in (步骤2中查到的用户名');
本文仅在19C中进行测试过,其它版本可能会有差别。
请操作前在测试环境中做充分测试,请勿在生产环境中进行尝试。
不推荐在已经运行一段时间的生产环境中做此操作,只建议做为生产环境上线前的准备工作之一。
请操作前做好备份工作。
集群环境操作后,记得要重启所有实例,避免内存中信息不一致。
cdb环境需要在pdb下执行同样的操作,也可以使用catcon.pl脚本执行。
文章参考:

更多精彩干货分享
点击下方名片关注
IT那活儿





