ジョブ・クラスとデータベース・スケジューラ (2026/01/30)

ジョブ・クラスとデータベース・スケジューラ  (2026/01/30)

https://blog.go-faster.co.uk/2026/01/jobclasses1.html

この投稿は、Oracleデータベース・スケジューラでのジョブ・クラスの使用について説明するシリーズの最初の部分です。

  1. ジョブクラスとデータベーススケジューラ
  2. ジョブクラスを使用したスケジューラジョブ(DBMS_SCHEDULER)のデモンストレーション
  3. ジョブクラスを使用した並列実行タスク (DBMS_PARALLEL_EXECUTE) のデモンストレーション

はじめに

データベーススケジューラを使用してバッチジョブを実行する場合は、ジョブごとにジョブクラスを指定することをお勧めします。これは、すべてのジョブにジョブクラスを作成する必要がある場合でも当てはまります。カスタムリソースマネージャープランを開発した場合、セッションは通常、セッション属性(データベースサービス、データベースユーザー、クライアントマシン、クライアントプログラム、クライアントOSユーザー、モジュール、またはアクション)のマッピングルールによってコンシューマグループにマッピングされます。また、ジョブクラス内のジョブを特定のコンシューマグループおよびデータベースサービスに明示的にマッピングすることもできます。  

例えば、アプリケーションは、オンライン処理の一部として、あるいはスケジュールされたバッチ処理の一部としてなど、異なる場所で同じコードを実行することがあります。そして、異なるコンシューマグループにマッピングすることで、それぞれに異なる優先順位付けが必要になります。アプリケーションインストルメンテーションでは、オンライン実行を1つのコンシューマグループにマッピングできますが、スケジューラジョブ経由の実行は、ジョブクラスを介して明示的に別のコンシューマグループにマッピングできます。

スケジューラジョブを作成する際にジョブクラスを指定するには、コードの一部を変更する必要があります。ジョブクラスの属性は、追加のコード変更を必要とせずにいつでも変更できます。

まだカスタムリソースマネージャープランを開発していない場合は、少なくともデフォルトのリソースプランを使用してください。パフォーマンスメトリックは、CPUが不足していることを示すため、処理の優先順位付けのためにカスタムリソースマネージャープランが必要になる場合があります。  

ジョブクラスとは何ですか?

ジョブ クラスは、スケジューラ管理者が論理的な目的でジョブをグループ化できるようにする Oracle Scheduler オブジェクトです。これにより、メンバー ジョブに同じ属性値セットを割り当てたり、メンバー ジョブのサービス アフィニティを設定したり、メンバー ジョブのリソース割り当てを設定したり、優先順位付けのためにジョブをグループ化したりすることができます。
参照
ジョブ クラスにはさまざまな属性を設定できます。
  • コメント
  • ログ履歴の保持: ジョブのログが保持される日数。
  • ログ レベル: オフ、失敗した実行、実行、完全。
  • リソースコンシューマグループ: ジョブクラス内のジョブのコンシューマグループを明示的に設定します。コンシューマグループを明示的に設定すると、他のマッピングは常にオーバーライドされます。
  • データベースサービス: ジョブクラス内のジョブがアフィニティを持つデータベースサービス。一部のサービスは特定のRACインスタンスでのみ利用可能であり、このクラスのジョブはそれらのインスタンスでのみ実行されます。
    • ジョブ クラスに resource_consumer_group 属性と service 属性の両方が設定されており、サービスがリソース コンシューマ グループにマップされている場合は、resource_consumer_group 属性が優先されます。
  • 注: リソースマネージャはEnterprise Editionの機能です。ジョブクラスはジョブのログ記録とRACアフィニティも制御します。ジョブクラスはStandard Editionでも利用可能ですが、コンシューマグループの設定は影響しません。 

ジョブクラスの作成/変更

ジョブ クラスは次のようにドロップおよび作成できます。
exec dbms_scheduler.drop_job_class(job_class_name => 'MY_JOB_CLASS', force=>TRUE);

begin
  dbms_scheduler.create_job_class
  (job_class_name => 'MY_JOB_CLASS'
  ,resource_consumer_group => 'HIGH_BATCH_GROUP'
  ,comments => 'dmk: A sample job class for demonstration purposes'
  );
END;
/
既存のジョブ クラスの属性は次のように設定およびリセットできます。
BEGIN
  dbms_scheduler.set_attribute
  (name=>'MY_JOB_CLASS'
  ,attribute=>'resource_consumer_group'
  ,value=>'HIGH_BATCH_GROUP');

  dbms_scheduler.set_attribute
  (name=>'MY_JOB_CLASS'
  ,attribute=>'log_history'
  ,value=>1 
  );
END;
/
注:このデモでは、ログの保持期間を1日に設定しています。これは一般的な推奨期間ではありません

ALL_SCHEDULER_JOB_CLASSES をクエリして、ジョブクラスが正しく作成されていることを確認してください。ジョブクラスの所有者は SYS のみであり、他のユーザーは所有できないことに注意してください。

SELECT *
FROM   all_scheduler_job_classes
WHERE  job_class_name like 'MY%CLASS'
ORDER BY 1,2
/
                                                                                    Logging        Log                                                                                 
OWNER            JOB_CLASS_NAME                 RESOURCE_CONSUMER_GROUP  SERVICE    Level      History COMMENTS                                                                        
---------------- ------------------------------ ------------------------ ---------- ---------- ------- -----------------------------------------------------------------
SYS              MY_JOB_CLASS                   HIGH_BATCH_GROUP                    RUNS             1 dmk: A sample job class for demonstration purposes

特権

ジョブクラスの実行権限

ジョブクラスを指定するジョブリクエストを送信するユーザー (ジョブの所有者ではない)には、そのジョブクラスの実行権限が付与されている必要があります。私のテストでは、ジョブはGFC_BATCH_USERが所有していますが、GFC_BATCH_USERとGFC_GENERIC_READONLYの両方によって実行されています。
GRANT EXECUTE ON sys.my_job_class TO GFC_BATCH_USER  ;
GRANT EXECUTE ON sys.my_job_class TO GFC_GENERIC_READONLY;
実行権限を次のように確認します。
SELECT * FROM dba_tab_privs where table_name = 'MY_JOB_CLASS';

GRANTEE              OWNER            TABLE_NAME           GRANTOR              PRIVILEGE  GRA HIE COM TYPE                     INH
-------------------- ---------------- -------------------- -------------------- ---------- --- --- --- ------------------------ ---
GFC_GENERIC_READONLY SYS              MY_JOB_CLASS         SYS                  EXECUTE    NO  NO  NO  JOB CLASS                NO 
GFC_BATCH_USER       SYS              MY_JOB_CLASS         SYS                  EXECUTE    NO  NO  NO  JOB CLASS                NO

コンシューマーグループ権限の切り替え

ジョブクラスは明示的にコンシューマグループを切り替えます。ジョブリクエストを送信するユーザー(ジョブを所有するユーザーではありません)には、コンシューマグループを切り替える権限が必要です。
BEGIN
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP
  (grantee_name   => 'GFC_GENERIC_READONLY'
  ,consumer_group => 'HIGH_BATCH_GROUP'
  ,grant_option   => FALSE);

  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP
  (grantee_name   => 'GFC_BATCH_USER'
  ,consumer_group => 'HIGH_BATCH_GROUP'
  ,grant_option   => FALSE);
END;
/

次の投稿では、スケジューラ ジョブと並列タスクにジョブ クラスを設定する方法を説明します。

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

ミリ秒の問題: BCCグループとOCIが市場データ・パフォーマンスを再定義する方法(AWSに対するベンチマークを使用) (2025/11/13)

OCIのカスタム・ルート表を使用した詳細なルーティング制御 (2025/02/27)