Oracleエラー対応(ORA-12012): ORA-12012発生時の調査対応について

現役DBAが解説-Oracleエラー対応

OracleのORA-12012は、Oracle Databaseに設定されたジョブが失敗した時に発生するエラーです。
ORA-12012はジョブの内容によって対応が異なりますので、本記事では主にORA-12012の概要と失敗したジョブの確認方法を解説します。

1.エラーメッセージ

Oracleのジョブが失敗すると、以下のようなORA-12012を含む各種エラーがアラートログに記録されます。

2024-03-22T15:46:25.241997+09:00
Errors in file C:\APPS\ORACLE\diag\rdbms\test\test\trace\test_j000_6500.trc:
ORA-12012: ジョブ"TEST1"."MV_RF$J_0_S_4"の自動実行エラーが発生しました
ORA-12008: マテリアライズド・ビューまたはゾーンマップのリフレッシュ・パスでエラーが発生しました
ORA-06512: "SYS.DBMS_SNAPSHOT_KKXRCA", 行3012
ORA-06512: "SYS.DBMS_SNAPSHOT_KKXRCA", 行2424
・・・

2.エラー原因

ORA-12012自体はあくまで「Oracleで設定されたジョブの実行が失敗した」という通知です。
そのため、エラー原因についてはジョブ内容やORA-12012に付随したその他のエラー番号、トレースファイル等を確認する必要があります。

3.エラーとなったジョブの確認方法

前章のエラーメッセージ例では、ORA-12012の下にORA-12008が記載されています。
ORA-12008はMVIEWリフレッシュが失敗した際のエラーとなるため、MVIEWの定期リフレッシュジョブがエラーとなっていることが分かります。
しかし、アラートログを見ただけではジョブの内容がよく分からない場合もあります。
その時は、ORA-12012に記載されているジョブの名前から、DBA_SCHEDULER_JOBSを検索して確認を行います。

SQL> --ジョブ内容の確認例
SQL> select owner,job_name, job_action from dba_scheduler_jobs
  2  where owner='TEST1'
  3  and job_name ='MV_RF$J_0_S_4';

OWNER JOB_NAME             JOB_ACTION
----- -------------------- --------------------------------------------------
TEST1 MV_RF$J_0_S_4        dbms_refresh.refresh('"TEST1"."TEST_MVIEW1"');

確認例の通り「JOB_ACTION」列を見ると、実際にジョブ内で実行されている処理(「TEST1.TEST_MVIEW1」のリフレッシュ)が記載されています。
今回例示したMVIEWリフレッシュジョブは、ORA-12012が起きやすいジョブの1つです。
MVIEWリフレッシュエラーの場合は、ソース元の表に列追加等の変更を加えていないか、ソース元へのアクセス経路に問題が起きていないか等の調査を行います。
ジョブで実行される処理はMVIEWリフレッシュ以外にも、プロシージャ、PL/SQLなど多岐に渡ります。
処理内容を確認した上で、何故エラーとなったのか各種調査を行う必要があります。

なお、ORA-12012のエラー文にジョブ名ではなく、ジョブ番号が記載されている場合があります。
こちらは現行のOracle Schedulerではなく、古いDBMS_JOB がジョブに使われている場合に記載されます。
その際は、DBA_SCHEDULER_JOBSではなく、DBA_JOBSからwhere条件をJOB=<エラー記載のジョブ番号>として検索を行ってください。

SQL> --【参考】DBA_JOBS におけるジョブ内容の確認例
SQL> select job,schema_user,what from dba_jobs
  2  where job =22;

       JOB SCHEMA_USER     WHAT
---------- --------------- --------------------------------------------------
        22 USER1           dbms_refresh.refresh('"USER1"."TEST_MVIEW1"');

4.Oracleの内部ジョブが失敗している場合

ORA-12012で失敗するジョブの中には、Oracle内部でデフォルト設定・自動実行されているジョブも含まれます。
このようなジョブはジョブ名が“SYS”.”×××”のように、SYSがジョブの所有者となっています。
内部ジョブはエラーが頻発しなければ大きな問題にならないことも多いですが、調査を行う場合はまずオラクル社のナレッジを確認し、可能ならばサポートへの問い合わせも行いましょう。

5.最後に

本エラーはOracleに設定されたジョブが失敗した時に発生するエラーです。
エラーが発生した際は失敗したジョブの処理内容を確認し、内容に応じた各種調査を実施しましょう。