ジョブ・クラスとデータベース・スケジューラ (2026/01/30)
ジョブ・クラスとデータベース・スケジューラ (2026/01/30)
https://blog.go-faster.co.uk/2026/01/jobclasses1.html
この投稿は、Oracleデータベース・スケジューラでのジョブ・クラスの使用について説明するシリーズの最初の部分です。
- ジョブクラスとデータベーススケジューラ
- ジョブクラスを使用したスケジューラジョブ(DBMS_SCHEDULER)のデモンストレーション
- ジョブクラスを使用した並列実行タスク (DBMS_PARALLEL_EXECUTE) のデモンストレーション
はじめに
データベーススケジューラを使用してバッチジョブを実行する場合は、ジョブごとにジョブクラスを指定することをお勧めします。これは、すべてのジョブにジョブクラスを作成する必要がある場合でも当てはまります。カスタムリソースマネージャープランを開発した場合、セッションは通常、セッション属性(データベースサービス、データベースユーザー、クライアントマシン、クライアントプログラム、クライアントOSユーザー、モジュール、またはアクション)のマッピングルールによってコンシューマグループにマッピングされます。また、ジョブクラス内のジョブを特定のコンシューマグループおよびデータベースサービスに明示的にマッピングすることもできます。
例えば、アプリケーションは、オンライン処理の一部として、あるいはスケジュールされたバッチ処理の一部としてなど、異なる場所で同じコードを実行することがあります。そして、異なるコンシューマグループにマッピングすることで、それぞれに異なる優先順位付けが必要になります。アプリケーションインストルメンテーションでは、オンライン実行を1つのコンシューマグループにマッピングできますが、スケジューラジョブ経由の実行は、ジョブクラスを介して明示的に別のコンシューマグループにマッピングできます。
スケジューラジョブを作成する際にジョブクラスを指定するには、コードの一部を変更する必要があります。ジョブクラスの属性は、追加のコード変更を必要とせずにいつでも変更できます。
まだカスタムリソースマネージャープランを開発していない場合は、少なくともデフォルトのリソースプランを使用してください。パフォーマンスメトリックは、CPUが不足していることを示すため、処理の優先順位付けのためにカスタムリソースマネージャープランが必要になる場合があります。
ジョブクラスとは何ですか?
- コメント
- ログ履歴の保持: ジョブのログが保持される日数。
- ログ レベル: オフ、失敗した実行、実行、完全。
- リソースコンシューマグループ: ジョブクラス内のジョブのコンシューマグループを明示的に設定します。コンシューマグループを明示的に設定すると、他のマッピングは常にオーバーライドされます。
- データベースサービス: ジョブクラス内のジョブがアフィニティを持つデータベースサービス。一部のサービスは特定の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;
/- ジョブクラス属性(DBMS_SCHEDULER: ジョブクラス属性値)も参照してください。
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
特権
ジョブクラスの実行権限
GRANT EXECUTE ON sys.my_job_class TO GFC_BATCH_USER ;
GRANT EXECUTE ON sys.my_job_class TO GFC_GENERIC_READONLY;- 「DBMS_SCHEDULER.CREATE_JOB_CLASSで定義されたジョブクラスは、スキーマユーザーではなくユーザーSYSによって所有されています(エラーメッセージ自体を見ると推測できます)。」 - Oracleサポートノート2087507.1「ジョブクラスの作成後、SET_ATTRIBUTEを使用して新しいジョブクラスを既存のジョブに割り当てると、ORA-27476が発生します」を参照してください。
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;
/次の投稿では、スケジューラ ジョブと並列タスクにジョブ クラスを設定する方法を説明します。
コメント
コメントを投稿