Oracle DB インスタンスの一般的なスケジューリングタスクの実行 - Amazon Relational Database Service

Oracle DB インスタンスの一般的なスケジューリングタスクの実行

SYSが所有する一部のスケジューラジョブは、通常のデータベースオペレーションを妨げる可能性があります。Oracle Support は、これらのジョブを無効にするか、スケジュールを変更することを推奨します。Amazon RDS パッケージrdsadmin.rdsadmin_dbms_schedulerを使用して、SYSが所有する Oracle スケジューラジョブのタスクを実行します。

rdsadmin.rdsadmin_dbms_scheduler手順は、以下の Amazon RDS for Oracle DB エンジンバージョンでサポートされています。

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c

  • Oracle Database 12c リリース 2 (12.2) で、12.2.0.2.ru-2019-07.rur-2019-07.r1 もしくはそれ以降の 12.2 バージョン

  • Oracle Database 12c リリース 1 (12.1) で、12.1.0.2.v17 もしくはそれ以降の 12.1 バージョン

Oracle Scheduler プロシージャの共通パラメータ

Oracle Scheduler のタスクを実行するには、Amazon RDS パッケージ rdsadmin.rdsadmin_dbms_scheduler を使用します。いくつかのパラメータは、パッケージ内のすべてのプロシージャに共通です。パッケージ内の共通パラメータは以下のとおりです。

パラメータ名 データ型 有効な値 デフォルト 必須 説明

name

varchar2

'SYS.BSLN_MAINTAIN_STATS_JOB','SYS.CLEANUP_ONLINE_IND_BUILD'

はい

変更するジョブの名前。

注記

現在、SYS.CLEANUP_ONLINE_IND_BUILD および SYS.BSLN_MAINTAIN_STATS_JOB ジョブのみを変更できます。

attribute

varchar2

'REPEAT_INTERVAL','SCHEDULE_NAME'

はい

変更する属性。

ジョブの繰り返し間隔を変更するには、'REPEAT_INTERVAL' を指定します。

ジョブのスケジュール名を変更するには、'SCHEDULE_NAME' を指定します。

value

varchar2

使用される属性に応じて、有効なスケジュール間隔またはスケジュール名。

はい

属性の新しい値。

DBMS_SCHEDULER ジョブの変更

Oracle 手順dbms_scheduler.set_attributeを使用して、Oracle スケジューラの特定のコンポーネントを変更します。詳細については、Oracle ドキュメントの「DBMS_SCHEDULER」と「SET_ATTRIBUTE プロシージャ」を参照してください。

Amazon RDS DB インスタンスを使用するときは、オブジェクト名にスキーマ名 SYS を付加します。次の例では、Monday ウィンドウオブジェクトのリソースプラン属性を設定します。

BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'SYS.MONDAY_WINDOW', attribute => 'RESOURCE_PLAN', value => 'resource_plan_1'); END; /

自動タスクメンテナンスウィンドウの変更

Amazon RDS for Oracle インスタンスは、メンテナンスウィンドウのデフォルト設定で作成されます。オプティマイザ統計収集などの自動メンテナンスタスクは、これらのウィンドウで実行されます。デフォルトでは、メンテナンスウィンドウは Oracle Database リソースマネージャーをオンにします。

DBMS_SCHEDULERパッケージを使用して。ウィンドウを変更します。次のような理由から、メンテナンスウィンドウの設定を変更する必要がある場合があります。

  • メンテナンスジョブを別の時間に実行するか、異なる設定で実行するか、まったく実行しないようにする。例えば、ウィンドウの継続時間を変更したり、繰り返し時間と間隔を変更したりできます。

  • メンテナンス中にリソースマネージャーを有効にしたときの、パフォーマンスへの影響を回避する必要があります。例えば、デフォルトのメンテナンスプランが指定されていて、データベースがロードされている間にメンテナンスウィンドウが開いた場合、resmgr:cpu quantumのような待機イベントを表示する必要があります。この待機イベントは、データベースリソースマネージャーに関連しています。利用開始の方法には、次のオプションがあります。

    • DB インスタンスのオフピーク時にメンテナンスウィンドウがアクティブであることを確認します。

    • デフォルトのメンテナンスプランを無効にするには、空の文字列にresource_plan属性を設定します。

    • パラメータグループのresource_manager_planパラメータをFORCE:に設定します。インスタンスでエンタープライズエディションを使用している場合、この設定により、データベースリソースマネージャープランがアクティブ化されなくなります。

メンテナンスウィンドウの設定を変更するには
  1. Oracle SQL クライアントを使用して、データベースに接続します。

  2. スケジューラウィンドウの現在の設定をクエリします。

    次の例では、MONDAY_WINDOWの設定をクエリします。

    SELECT ENABLED, RESOURCE_PLAN, DURATION, REPEAT_INTERVAL FROM DBA_SCHEDULER_WINDOWS WHERE WINDOW_NAME='MONDAY_WINDOW';

    次の出力は、ウィンドウがデフォルト値を使用していることを示しています。

    ENABLED RESOURCE_PLAN DURATION REPEAT_INTERVAL --------------- ------------------------------ ---------------- ------------------------------ TRUE DEFAULT_MAINTENANCE_PLAN +000 04:00:00 freq=daily;byday=MON;byhour=22 ;byminute=0; bysecond=0
  3. DBMS_SCHEDULERパッケージを使用して、ウィンドウを変更します。

    次の例では、リソースプランを null に設定して、リソースマネージャーがメンテナンスウィンドウ中に実行されないようにします。

    BEGIN -- disable the window to make changes DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); -- specify the empty string to use no plan DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'RESOURCE_PLAN', value=>''); -- re-enable the window DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

    次の例では、ウィンドウの最大時間を 2 時間に設定します。

    BEGIN DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'DURATION', value=>'0 2:00:00'); DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

    次の例では、繰り返し間隔を毎週月曜日の午前 10 時に設定します。

    BEGIN DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'REPEAT_INTERVAL', value=>'freq=daily;byday=MON;byhour=10;byminute=0;bysecond=0'); DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

Oracle Scheduler ジョブのタイムゾーンの設定

Oracle Scheduler のタイムゾーンを変更するには、Oracle プロシージャ dbms_scheduler.set_scheduler_attribute を使用できます。dbms_scheduler パッケージの詳細については、Oracle ドキュメントの DBMS_SCHEDULER および SET_SCHEDULER_ATTRIBUTE を参照してください。

現在のタイムゾーン設定を変更するには
  1. SQL Developer などのクライアントを使用してデータベースに接続します。詳細については、「Oracle SQL Developer を使用した DB インスタンスへの接続」を参照してください。

  2. デフォルトのタイムゾーンを以下のように設定し、time_zone_name をお客様のタイムゾーンに置き換えます。

    BEGIN DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE( attribute => 'default_timezone', value => 'time_zone_name' ); END; /

以下の例では、タイムゾーンをアジア/上海に変更します。

以下に示すように、まず現在のタイムゾーンをクエリします。

SELECT VALUE FROM DBA_SCHEDULER_GLOBAL_ATTRIBUTE WHERE ATTRIBUTE_NAME='DEFAULT_TIMEZONE';

出力は、現在のタイムゾーンが ETC/UTC であることを示しています。

VALUE ------- Etc/UTC

次に、タイムゾーンをアジア/上海に設定します。

BEGIN DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE( attribute => 'default_timezone', value => 'Asia/Shanghai' ); END; /

システムのタイムゾーンの変更の詳細については、「Oracle のタイムゾーン」を参照してください。

SYS が所有する Oracle Scheduler ジョブの無効化

SYS ユーザーが所有する Oracle Scheduler ジョブを無効にするには、rdsadmin.rdsadmin_dbms_scheduler.disable プロシージャを使用します。

このプロシージャでは、Oracle Scheduler タスクの共通パラメータ name を使用します。詳細については、「Oracle Scheduler プロシージャの共通パラメータ」を参照してください。

次の例では、SYS.CLEANUP_ONLINE_IND_BUILD Oracle Scheduler ジョブを無効にします。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.disable('SYS.CLEANUP_ONLINE_IND_BUILD'); END; /

SYS が所有する Oracle Scheduler ジョブを有効にする

SYS が所有する Oracle Scheduler ジョブを有効にするには、rdsadmin.rdsadmin_dbms_scheduler.enable プロシージャを使用します。

このプロシージャでは、Oracle Scheduler タスクの共通パラメータ name を使用します。詳細については、「Oracle Scheduler プロシージャの共通パラメータ」を参照してください。

次の例では、SYS.CLEANUP_ONLINE_IND_BUILD Oracle Scheduler ジョブを有効にします。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.enable('SYS.CLEANUP_ONLINE_IND_BUILD'); END; /

CALENDAR タイプのジョブに対する Oracle Scheduler の繰り返し間隔の変更

CALENDAR タイプ の SYS 所有の Oracle Scheduler ジョブの繰り返し間隔を変更するには、rdsadmin.rdsadmin_dbms_scheduler.disable プロシージャを使用します。

このプロシージャでは、以下の Oracle Scheduler タスクの共通パラメータを使用します。

  • name

  • attribute

  • value

詳細については、「Oracle Scheduler プロシージャの共通パラメータ」を参照してください。

次の例では、SYS.CLEANUP_ONLINE_IND_BUILD Oracle Scheduler ジョブの繰り返し間隔を変更します。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_attribute( name => 'SYS.CLEANUP_ONLINE_IND_BUILD', attribute => 'repeat_interval', value => 'freq=daily;byday=FRI,SAT;byhour=20;byminute=0;bysecond=0'); END; /

NAMED タイプのジョブに対する Oracle Scheduler の繰り返し間隔の変更

一部の Oracle Scheduler ジョブでは、間隔ではなくスケジュール名が使用されます。このようなタイプのジョブの場合、マスターユーザースキーマに新しい名前付きスケジュールを作成する必要があります。これを行うには、スタンダードの sys.dbms_scheduler.create_schedule プロシージャを使用します。また、rdsadmin.rdsadmin_dbms_scheduler.set_attribute procedure を使用して、新しい名前付きスケジュールをジョブに割り当てます。

このプロシージャでは、以下の Oracle Scheduler タスクの共通パラメータを使用します。

  • name

  • attribute

  • value

詳細については、「Oracle Scheduler プロシージャの共通パラメータ」を参照してください。

次の例では、SYS.BSLN_MAINTAIN_STATS_JOB Oracle Scheduler ジョブの繰り返し間隔を変更します。

BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE ( schedule_name => 'rds_master_user.new_schedule', start_date => SYSTIMESTAMP, repeat_interval => 'freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=0;byminute=0;bysecond=0', end_date => NULL, comments => 'Repeats daily forever'); END; / BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_attribute ( name => 'SYS.BSLN_MAINTAIN_STATS_JOB', attribute => 'schedule_name', value => 'rds_master_user.new_schedule'); END; /

Oracle Scheduler ジョブ作成のオートコミットをオフにする

DBMS_SCHEDULER.CREATE_JOB が Oracle Scheduler ジョブを作成すると、すぐにジョブが作成され、変更がコミットされます。次の操作を行うには、Oracle Scheduler ジョブの作成をユーザートランザクションに組み込むことが必要な場合があります。

  • ユーザートランザクションがロールバックされたら、Oracle Schedule ジョブをロールバックします。

  • メインユーザートランザクションがコミットされたら、Oracle Scheduler ジョブを作成します。

rdsadmin.rdsadmin_dbms_scheduler.set_no_commit_flag プロシージャを使用してこの動作をオンにできます。この手順では、パラメータは使用しません。このプロシージャは、次の RDS for Oracle リリースで使用できます。

  • 21.0.0.0.ru-2022-07.rur-2022-07.r1 以上

  • 19.0.0.0.ru-2022-07.rur-2022-07.r1 以上

次の例では、Oracle Scheduler のオートコミットをオフにし、Oracle Scheduler ジョブを作成してから、トランザクションをロールバックします。オートコミットがオフになっているため、データベースは Oracle Scheduler ジョブの作成もロールバックします。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_no_commit_flag; DBMS_SCHEDULER.CREATE_JOB(job_name => 'EMPTY_JOB', job_type => 'PLSQL_BLOCK', job_action => 'begin null; end;', auto_drop => false); ROLLBACK; END; / PL/SQL procedure successfully completed. SELECT * FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME='EMPTY_JOB'; no rows selected