ORA-04063: package body "DBSNMP.BSLN" has errors
问题描述:
警告日志出现报错:
Sun Jun 28 00:00:01 2020 Errors in file /u01/app/oracle/diag/rdbms/zbqdb/zbqdbi2/trace/zbqdbi2_j000_8274.trc: ORA-12012: error on auto execute of job "SYS"."BSLN_MAINTAIN_STATS_JOB" ORA-04063: package body "DBSNMP.BSLN" has errors ORA-06508: PL/SQL: could not find program unit being called: "DBSNMP.BSLN" ORA-06512: at "DBSNMP.BSLN_INTERNAL", line 2073 ORA-06512: at line 1
问题类似我之前不久的一片博文里边描述的问题,ORA-04063: package body "DBSNMP.BSLN_INTERNAL" has errors。
虽然不再搜索到同样的官方处理方式,不过其实根因是一样的。
问题原因:
1.BSLN包体对象处于无效状态。
select owner,object_name,object_type,status from dba_objects where owner='DBSNMP' and object_name='BSLN'; OWNER OBJECT_NAME OBJECT_TYPE STATUS ---------- ------------------------------ --------------------------------------------------------- ---------- DBSNMP BSLN PACKAGE VALID DBSNMP BSLN PACKAGE BODY INVALID
处理过程
08:26:15 sys@xxxxxxi1(xxxxxx1)> alter package DBSNMP.BSLN compile body; Warning: Package Body altered with compilation errors. Elapsed: 00:00:00.10 08:27:36 sys@xxxxxxi1(xxxxxx1)> show error Errors for PACKAGE BODY DBSNMP.BSLN: LINE/COL ERROR -------- ----------------------------------------------------------------- 88/5 PL/SQL: Statement ignored 88/19 PLS-00201: identifier 'DBMS_OBFUSCATION_TOOLKIT' must be declared 200/7 PL/SQL: Statement ignored 200/21 PLS-00201: identifier 'DBMS_OBFUSCATION_TOOLKIT' must be declared 241/7 PL/SQL: Statement ignored 242/8 PLS-00201: identifier 'DBMS_OBFUSCATION_TOOLKIT' must be declared 1332/7 PL/SQL: Statement ignored 1332/21 PLS-00201: identifier 'DBMS_OBFUSCATION_TOOLKIT' must be declared 08:39:51 sys@xxxxxx(xxxxxx2)> select * from dba_sys_privs where grantee='DBSNMP'; GRANTEE PRIVILEGE ADM ------------ -------------------------------------------------- --- DBSNMP CREATE PROCEDURE NO DBSNMP UNLIMITED TABLESPACE NO DBSNMP SELECT ANY DICTIONARY NO DBSNMP CREATE TABLE NO Elapsed: 00:00:00.00 08:39:52 sys@xxxxxx(xxxxxx2)> select * from dba_role_privs where grantee='DBSNMP'; GRANTEE GRANTED_ROLE ADM DEF ------------ ------------------------------ --- --- DBSNMP OEM_MONITOR NO YES Elapsed: 00:00:00.02 08:40:05 sys@xxxxxx(xxxxxx2)> select * from dba_tab_privs where grantee='DBSNMP'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE ------------ ---------- ----------------------------------- ------------ -------------------------------------------------- --- --- DBSNMP SYS DBMS_SERVER_ALERT SYS EXECUTE NO NO DBSNMP SYS DBMS_JOB SYS EXECUTE NO NO DBSNMP SYS DBMS_MANAGEMENT_PACKS SYS EXECUTE NO NO DBSNMP APPQOSSYS WLM_CLASSIFIER_PLAN APPQOSSYS SELECT NO NO DBSNMP APPQOSSYS WLM_METRICS_STREAM APPQOSSYS SELECT NO NO DBSNMP APPQOSSYS WLM_MPA_STREAM APPQOSSYS SELECT NO NO DBSNMP APPQOSSYS WLM_VIOLATION_STREAM APPQOSSYS SELECT NO NO 7 rows selected. Elapsed: 00:00:00.05 08:40:15 sys@xxxxxx(xxxxxx2)> select * from dba_tab_privs where grantee='OEM_MONITOR'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE ------------ ---------- ----------------------------------- ------------ -------------------------------------------------- --- --- OEM_MONITOR SYS ALERT_QUE SYS DEQUEUE NO NO OEM_MONITOR SYS DBMS_SYSTEM SYS EXECUTE NO NO OEM_MONITOR SYS DBMS_SERVER_ALERT SYS EXECUTE NO NO OEM_MONITOR SYS DBMS_MONITOR SYS EXECUTE NO NO OEM_MONITOR SYS DBMS_AQ SYS EXECUTE NO NO OEM_MONITOR SYS DBMS_AQADM SYS EXECUTE NO NO OEM_MONITOR SYS DBMS_WORKLOAD_REPOSITORY SYS EXECUTE NO NO OEM_MONITOR DBSNMP BSLN DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_BASELINES DBSNMP SELECT NO NO OEM_MONITOR DBSNMP BSLN_INTERNAL DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_METRIC_DEFAULTS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP BSLN_METRIC_SET DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_METRIC_T DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_OBSERVATION_SET DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_OBSERVATION_T DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_STATISTICS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP BSLN_STATISTICS_SET DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_STATISTICS_T DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_THRESHOLD_PARAMS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP BSLN_TIMEGROUPS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP BSLN_VARIANCE_SET DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP BSLN_VARIANCE_T DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP MGMT_BASELINE DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BASELINE_SQL DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_BASELINES DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_DATASOURCES DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_INTERVALS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_METRICS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_STATISTICS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_BSLN_THRESHOLD_PARMS DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_HISTORY DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_HISTORY_SQL DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_LATEST DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_LATEST_SQL DBSNMP SELECT NO NO OEM_MONITOR DBSNMP MGMT_RESPONSE DBSNMP EXECUTE NO NO OEM_MONITOR DBSNMP MGMT_UPDATE_DB_FEATURE_LOG DBSNMP EXECUTE NO NO OEM_MONITOR SYS DBMS_DRS SYS EXECUTE NO NO 37 rows selected. Elapsed: 00:00:00.04 08:43:46 sys@xxxxxx(xxxxxx2)> select owner,object_name,object_type from dba_objects where object_name='DBMS_OBFUSCATION_TOOLKIT'; OWNER OBJECT_NAME OBJECT_TYPE ---------- ------------------------------ ------------------- SYS DBMS_OBFUSCATION_TOOLKIT PACKAGE BODY SYS DBMS_OBFUSCATION_TOOLKIT PACKAGE PUBLIC DBMS_OBFUSCATION_TOOLKIT SYNONYM Elapsed: 00:00:00.00 08:43:52 sys@xxxxxx(xxxxxx2)> grant execute on sys.DBMS_OBFUSCATION_TOOLKIT to DBSNMP; Grant succeeded. Elapsed: 00:00:00.02 08:44:19 sys@xxxxxx(xxxxxx2)> alter package DBSNMP.BSLN compile body; Package body altered. Elapsed: 00:00:00.23 08:44:42 sys@xxxxxx(xxxxxx2)> select * from dba_tab_privs where table_name='DBMS_OBFUSCATION_TOOLKIT'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE ------------ ---------- ----------------------------------- ------------ -------------------- --- --- DBSNMP SYS DBMS_OBFUSCATION_TOOLKIT SYS EXECUTE NO NO
深入分析
根据此次问题和上次的问题,原本以为出于安全原因,删除了某些包上的public特权是Oracle随着版本的自身的行为。
但是其实不是这样,此次版本为11.2.0.4.0。在发生问题的生产环境上,某些包确实没有了public的特权。
但是我看了其他同样是11.2.0.4.0的环境,确发现这些权限还在。
那么原因只有两个:
- 建库之后,由于企业的生产规范要求,按照Oracle安全白皮书中的建议撤消了某些包的公开的执行特权。
- 可能是建库的时候存在一些特殊的配置。
第一个的可能性更大一些。因为Oracle确实有mos文档建议撤销一些包的public权限。
比如:ecurity Checklist: 10 Basic Steps to Make Your Database Secure from Attacks (Doc ID 1545816.1)中