ablog

不器用で落着きのない技術者のメモ

could not find program unit being called: "ORACLE_OCM.MGMT_DB_LL_METRICS"

アラートログに以下のメッセージが出力されていた。

ORA-12012: error on auto execute of job 48247
ORA-04063: ORA-04063: package body "ORACLE_OCM.MGMT_DB_LL_METRICS" has errors
ORA-06508: PL/SQL: could not find program unit being called: "ORACLE_OCM.MGMT_DB_LL_METRICS"
ORA-06512: at line 1

Oracle Configuration Managerのトラブルシューティング によると、ORACLE_OCM ユーザが UTL_FILE、DBMS_SCHEDULER の EXECUTE権限を持たない場合に発生する。<セキュリティ・ガイド[B19269-02]>に従って、PUBLIC ユーザから不要なオブジェクト権限(UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_FILE、DBMS_RANDOM)を取消したのが原因。

B19269-02 を再確認しようとしたら、B19269-03 にバージョンアップされて内容が変わっていた。かろうじて Google のキャッシュに残っていた。


[B19269-02] --> http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19269-02/policies.htm#518452
[B19269-03] --> http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19269-03/policies.htm#803196


修正前にエラーが発生していて修正後に発生しないことを確認するため、ジョブの実行間隔を1分に変更する。

$ sqlplus / as sysdba
BEGIN
sys.dbms_scheduler.disable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'schedule_name');
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.enable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."AUTO_SPACE_ADVISOR_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'schedule_name');
sys.dbms_scheduler.set_attribute( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.enable( '"SYS"."AUTO_SPACE_ADVISOR_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."GATHER_STATS_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'schedule_name');
sys.dbms_scheduler.set_attribute( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.enable( '"SYS"."GATHER_STATS_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."PURGE_LOG"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."PURGE_LOG"', attribute => 'schedule_name');
sys.dbms_scheduler.set_attribute( name => '"SYS"."PURGE_LOG"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.enable( '"SYS"."PURGE_LOG"' );
END;
/
        
BEGIN
sys.dbms_scheduler.disable( '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"' );
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"', attribute => 'start_date', value => systimestamp at time zone '+9:00');
sys.dbms_scheduler.enable( '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"' );
END;
/

修正する。

$ sqlplus / as sysdba
col table_name for a20
col grantee for a10
col privilege for a10
select table_name,grantee,privilege from dba_tab_privs where table_name in ('UTL_FILE','HTTPURITYPE','UTL_INADDR');
 TABLE_NAME           GRANTEE    PRIVILEGE
 -------------------- ---------- ----------
 UTL_INADDR           PUBLIC     EXECUTE 
 HTTPURITYPE          PUBLIC     EXECUTE

grant execute on UTL_FILE to public;
revoke all on HTTPURITYPE from public;
revoke all on UTL_INADDR from public;
ALTER PACKAGE oracle_ocm.MGMT_DB_LL_METRICS compile;
ALTER PACKAGE oracle_ocm.mgmt_config compile;

select table_name,grantee,privilege from dba_tab_privs where table_name in ('UTL_FILE','HTTPURITYPE','UTL_INADDR');
 TABLE_NAME           GRANTEE    PRIVILEGE
 -------------------- ---------- ----------
 UTL_FILE             PUBLIC     EXECUTE

アラートログにエラーが出力されなくなっていることを確認する。

$ less /export/home/oracle/admin/orcl/bdump/alert_orcl.log 

無事解決したので、ジョブのスケジュールを元に戻す。

$ sqlplus / as sysdba
BEGIN
sys.dbms_scheduler.disable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'schedule_name');
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'repeat_interval', value => 'FREQ=MINUTELY');
sys.dbms_scheduler.enable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."AUTO_SPACE_ADVISOR_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'start_date');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'repeat_interval');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'end_date');
sys.dbms_scheduler.set_attribute( name => '"SYS"."AUTO_SPACE_ADVISOR_JOB"', attribute => 'schedule_name', value => 'SYS.MAINTENANCE_WINDOW_GROUP');
sys.dbms_scheduler.enable( '"SYS"."AUTO_SPACE_ADVISOR_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."GATHER_STATS_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'start_date');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'repeat_interval');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'end_date');
sys.dbms_scheduler.set_attribute( name => '"SYS"."GATHER_STATS_JOB"', attribute => 'schedule_name', value => 'SYS.MAINTENANCE_WINDOW_GROUP');
sys.dbms_scheduler.enable( '"SYS"."GATHER_STATS_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"SYS"."PURGE_LOG"' );
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."PURGE_LOG"', attribute => 'start_date');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."PURGE_LOG"', attribute => 'repeat_interval');
sys.dbms_scheduler.set_attribute_null( name => '"SYS"."PURGE_LOG"', attribute => 'end_date');
sys.dbms_scheduler.set_attribute( name => '"SYS"."PURGE_LOG"', attribute => 'schedule_name', value => 'SYS.DAILY_PURGE_SCHEDULE');
sys.dbms_scheduler.enable( '"SYS"."PURGE_LOG"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"' );
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"', attribute => 'repeat_interval', value => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=1;BYMINUTE=1;BYSECOND=
0');
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"', attribute => 'start_date', value => to_timestamp_tz('2009-01-23 +9:00', 'YYYY-MM-DD TZH:TZM'));
sys.dbms_scheduler.enable( '"ORACLE_OCM"."MGMT_STATS_CONFIG_JOB"' );
END;
/

BEGIN
sys.dbms_scheduler.disable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
sys.dbms_scheduler.set_attribute_null( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'start_date');
sys.dbms_scheduler.set_attribute_null( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'repeat_interval');
sys.dbms_scheduler.set_attribute_null( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'end_date');
sys.dbms_scheduler.set_attribute( name => '"ORACLE_OCM"."MGMT_CONFIG_JOB"', attribute => 'schedule_name', value => 'SYS.MAINTENANCE_WINDOW_GROUP');
sys.dbms_scheduler.enable( '"ORACLE_OCM"."MGMT_CONFIG_JOB"' );
END;
/