[Database] DBMS_SCHEDULER jobs stuck after upgrade to 11.2? Check this parameter!

お客様とご一緒するといつも新しいことを学ぶものですね。この情報は、RAC環境でアップグレードする予定であれば、非常に価値があるかもしれません。アップグレード後、DBMS_SCHEDULERジョブがスケジュールされているにも関わらず実行されないという現象に当たるかと思います。あたかも何かの理由でスケジューラが止まったかのように思われますが、これは11gR2で振る舞いが変わったjob_queue_processesパラメータが理由なのです。このパラメータは長い間そのままになっていましたが、11gR2アップグレードガイドのAppendix Aから重要な記述を抜粋します(重要な箇所を赤字にしています)。

JOB_QUEUE_PROCESSES パラメータ
http://download.oracle.com/docs/cd/E16338_01/server.112/b56310/changes.htm#BGBFEAFC

Oracle Database 11gリリース1(11.1)以上では、JOB_QUEUE_PROCESSES初期化パラメータは基本パラメータから基本パラメータ以外に変更になりました。データベースを正しく効率的に実行するためにほとんどのデータベースで必要とされているのは、基本パラメータの設定のみです。デフォルト値も、0から1000に変更されます。
Oracle Database 11gリリース2(11.2)以上では、JOB_QUEUE_PROCESSES0に設定すると、DBMS_SCHEDULERおよびDBMS_JOBジョブが実行されません。以前は、JOB_QUEUE_PROCESSES0に設定すると、DBMS_JOBジョブは実行されませんでしたが、DBMS_SCHEDULERジョブは影響を受けることなく実行されました。 


クラスタ内の単一のノードを指定して、DBMS_JOBのジョブを実行することにしている方にとっては大きな変更点かと思われます。11gR1以前では、こうしたDBMS_JOBのジョブを実行したくない全てのノードで、job_queue_processesをゼロに設定すればよかったのです(10.2.0.4では問題なく動作していました)が、11gR2からは、
すべての DBMS_SCHEDULER ジョブは1つのノード上でしか実行せず、ジョブを他ノードのキューに入れると、それらのジョブは実行しない、という振る舞いに変わりました。
これは、アップグレード後にプロセスを再コンパイルするためにutlrp.sqlが作成するパラレルスレーブを含みます。

解決策は、JOB_QUEUE_PROCESSESがクラスタ内のすべてのノード上で非ゼロ値に設定されていることを確認することです。これでスケジューラは動くようになり、ジョブが正しく実行されます。
この話の教訓は、アップグレードガイドの動作の変更のセクションを読んで確認することです!おそらくこれは、イソップの寓話の道徳ほどのものではありませんが、アップグレード時には覚えておいて損はしないでしょう。


原文はこちら。
http://blogs.oracle.com/UPGRADE/entry/dbms_scheduler_jobs_stuck_after

0 件のコメント:

コメントを投稿