前言:
近期处理了一起Oracle数据库组件出现大量invalid的问题,分析发现是由于一些系统包的public公共用户权限丢失导致,相关的组件用户无法方法这些系统包,致使数据库组件大量出现invalid的问题。
问题:
数据库组件出现状态大量的invalid
问题分析:
查询组件用户的失效对象数量
select owner,status,count(*) from dba_objects
where status='INVALID' and owner in ('LBACSYS','OLAPSYS','CTXSYS','WMSYS','XDB','MDSYS')
group by owner,status;
可以发现出现组件用户出现大量的失效对象
查看失效对象编译的错误原因
set linesize 200
set pagesize 10000
col owner for a10
col name for a20
col text for a100
select owner,name,line,text
from dba_errors
where owner in ('LBACSYS','OLAPSYS','CTXSYS','WMSYS','XDB','MDSYS')
order by owner,name,line;
可以发现,错误大部分都是调用包出现未声明的情况,这些包DBMS_SQL,DBMS_SCHEDULER,UTL_FILE都是数据库自带的一些包,而现在出现调用未声明的情况,说明组件的相关用户没有权限是调用这些包
而调用这些包的权限,通常都是通过授予public公共用户,从而使相关组件用户有权限进行调用的,所以,我们获取了当前环境的public对象的execute权限与组件正常环境权限进行了比对
set linesize 400
set pagesize 400
col privilege for a20
col owner for a20
select grantee,PRIVILEGE,owner,table_name
from dba_tab_privs
where grantee='PUBLIC' and PRIVILEGE='EXECUTE';
发现了以下包权限存在丢失的情况,而这些对象跟之前包编译报错的包是一致的
EXECUTE ON DBMS_LOB TO public ;
EXECUTE ON UTL_TCP TO public ;
EXECUTE ON UTL_HTTP TO public ;
EXECUTE ON DBMS_SQL TO public ;
EXECUTE ON UTL_FILE TO public ;
EXECUTE ON DBMS_XMLGEN TO public ;
EXECUTE ON UTL_SMTP TO public ;
EXECUTE ON DBMS_JOB TO public ;
EXECUTE ON DBMS_SCHEDULER TO public ;
SELECT ON ALL_USERS TO public;
问题原因:
数据库组件出现大量invalid的问题,是由于一些系统包的public公共用户权限丢失导致,相关的组件用户无法方法这些系统包,致使数据库组件大量出现invalid的问题。
问题修复:
对丢失的权限重新进行授权,并重新进行数据库组件编译
---权限授权
GRANT EXECUTE ON DBMS_LOB TO public ;
GRANT EXECUTE ON UTL_TCP TO public ;
GRANT EXECUTE ON UTL_HTTP TO public ;
GRANT EXECUTE ON DBMS_SQL TO public ;
GRANT EXECUTE ON UTL_FILE TO public ;
GRANT EXECUTE ON DBMS_XMLGEN TO public ;
GRANT EXECUTE ON UTL_SMTP TO public ;
GRANT EXECUTE ON DBMS_JOB TO public ;
GRANT EXECUTE ON DBMS_SCHEDULER TO public ;
GRANT SELECT ON ALL_USERS TO public;
---重新编译
@?/rdbms/admin/utlrp
组件状态重新变为valid
set linesize 200
Col Comp_name Format a40
col schema for a20
com comp_id for a20
Col Status Format a12
Select comp_id,Comp_name, status, Version,schema
From Dba_Registry
Order by Comp_name;
其他问题:
对于public公共用户权限为何会出现丢失?
可能是以下原因导致
1 在数据库升级迁移的过程中public权限没有跟随迁移,导致丢失
2 用户在进行数据库安全改造的过程中,回收了public权限