

# Oracle DB インスタンスの一般的なスケジューリングタスクの実行
<a name="Appendix.Oracle.CommonDBATasks.Scheduler"></a>

`SYS`が所有する一部のスケジューラジョブは、通常のデータベースオペレーションを妨げる可能性があります。このような場合、Oracle サポートはスケジュールを変更することを推奨しています。`SYS` ジョブを有効または無効にする必要がある場合は、本番環境に実装する前に、テスト環境のスケジュールされたジョブでオペレーションをテストします。Amazon RDS パッケージ`rdsadmin.rdsadmin_dbms_scheduler`を使用して、`SYS`が所有する Oracle スケジューラジョブのタスクを実行します。

`rdsadmin.rdsadmin_dbms_scheduler` 手順は、以下の表に示す Amazon RDS for Oracle DB エンジンバージョンでサポートされています。このパッケージを使用する場合は、表に示されている `SYS` ジョブを指定できます。


| データベースリリース | デフォルトで有効のジョブ | デフォルトで無効のジョブ | 
| --- | --- | --- | 
| Oracle Database 19c |  <pre>BSLN_MAINTAIN_STATS_JOB<br />CLEANUP_NON_EXIST_OBJ<br />CLEANUP_ONLINE_IND_BUILD<br />CLEANUP_ONLINE_PMO<br />CLEANUP_TAB_IOT_PMO<br />CLEANUP_TRANSIENT_PKG<br />CLEANUP_TRANSIENT_TYPE<br />DRA_REEVALUATE_OPEN_FAILURES<br />FILE_SIZE_UPD<br />ORA$AUTOTASK_CLEAN<br />PMO_DEFERRED_GIDX_MAINT_JOB<br />PURGE_LOG<br />RSE$CLEAN_RECOVERABLE_SCRIPT<br />SM$CLEAN_AUTO_SPLIT_MERGE</pre>  |  <pre>FGR$AUTOPURGE_JOB<br />FILE_WATCHER<br />HM_CREATE_OFFLINE_DICTIONARY<br />LOAD_OPATCH_INVENTORY<br />ORA$PREPLUGIN_BACKUP_JOB<br />XMLDB_NFS_CLEANUP_JOB</pre>  | 
| Oracle Database 21c |  <pre>BSLN_MAINTAIN_STATS_JOB<br />CLEANUP_NON_EXIST_OBJ<br />CLEANUP_ONLINE_IND_BUILD<br />CLEANUP_ONLINE_PMO<br />CLEANUP_TAB_IOT_PMO<br />CLEANUP_TRANSIENT_PKG<br />CLEANUP_TRANSIENT_TYPE<br />DRA_REEVALUATE_OPEN_FAILURES<br />FILE_SIZE_UPD<br />ORA$AUTOTASK_CLEAN<br />PMO_DEFERRED_GIDX_MAINT_JOB<br />PURGE_LOG</pre>  |  <pre>FGR$AUTOPURGE_JOB<br />FILE_WATCHER<br />HM_CREATE_OFFLINE_DICTIONARY<br />LOAD_OPATCH_INVENTORY<br />ORA$PREPLUGIN_BACKUP_JOB<br />ORA$_ATSK_AUTOSTS<br />XMLDB_NFS_CLEANUP_JOB</pre>  | 

## Oracle Scheduler プロシージャの共通パラメータ
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.CommonParameters"></a>

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


****  

| パラメータ名 | データ型 | 有効な値 | デフォルト | 必須 | 説明 | 
| --- | --- | --- | --- | --- | --- | 
|  `name`  |  varchar2  |  「[Oracle DB インスタンスの一般的なスケジューリングタスクの実行](#Appendix.Oracle.CommonDBATasks.Scheduler)」の表に記載されている手順   |  —  |  はい  |  変更するジョブの名前。  | 
|  `attribute`  |  varchar2  |  `'REPEAT_INTERVAL'`,`'SCHEDULE_NAME'`  |  –  |  はい  |  変更する属性。 ジョブの繰り返し間隔を変更するには、`'REPEAT_INTERVAL'` を指定します。 ジョブのスケジュール名を変更するには、`'SCHEDULE_NAME'` を指定します。  | 
|  `value`  |  varchar2  |  使用される属性に応じて、有効なスケジュール間隔またはスケジュール名。  |  –  |  はい  |  属性の新しい値。  | 

## DBMS\$1SCHEDULER ジョブの変更
<a name="Appendix.Oracle.CommonDBATasks.ModifyScheduler"></a>

Oracle 手順`dbms_scheduler.set_attribute`を使用して、Oracle スケジューラの特定のコンポーネントを変更します。詳細については、Oracle ドキュメントの「[DBMS\$1SCHEDULER](https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72235)」と「[SET\$1ATTRIBUTE プロシージャ](https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72399)」を参照してください。

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

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

## 自動タスクメンテナンスウィンドウの変更
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.maintenance-windows"></a>

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

`DBMS_SCHEDULER`パッケージを使用して。ウィンドウを変更します。次のような理由から、メンテナンスウィンドウの設定を変更する必要がある場合があります。
+ メンテナンスジョブを別の時間に実行するか、異なる設定で実行するか、まったく実行しないようにする。例えば、ウィンドウの継続時間を変更したり、繰り返し時間と間隔を変更したりできます。
+ メンテナンス中にリソースマネージャーを有効にしたときの、パフォーマンスへの影響を回避する必要があります。例えば、デフォルトのメンテナンスプランが指定されていて、データベースがロードされている間にメンテナンスウィンドウが開いた場合、`resmgr:cpu quantum`のような待機イベントを表示する必要があります。この待機イベントは、データベースリソースマネージャーに関連しています。次のオプションがあります。
  + DB インスタンスのオフピーク時にメンテナンスウィンドウがアクティブであることを確認します。
  + デフォルトのメンテナンスプランを無効にするには、空の文字列に`resource_plan`属性を設定します。
  + パラメータグループの`resource_manager_plan`パラメータを`FORCE:`に設定します。インスタンスでエンタープライズエディションを使用している場合、この設定により、データベースリソースマネージャープランがアクティブ化されなくなります。

**メンテナンスウィンドウの設定を変更するには**

1. Oracle SQL クライアントを使用して、データベースに接続します。

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

   次の例では、`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
   ```

1. `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 ジョブのタイムゾーンの設定
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.TimeZone"></a>

Oracle Scheduler のタイムゾーンを変更するには、Oracle プロシージャ `dbms_scheduler.set_scheduler_attribute` を使用できます。`dbms_scheduler` パッケージの詳細については、Oracle ドキュメントの [DBMS\$1SCHEDULER](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SCHEDULER.html) および [SET\$1SCHEDULER\$1ATTRIBUTE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SCHEDULER.html#GUID-2AB97BF7-7154-4E6C-933F-B2659B18A907) を参照してください。

**現在のタイムゾーン設定を変更するには**

1. SQL Developer などのクライアントを使用してデータベースに接続します。詳細については、「[Oracle SQL Developer を使用した DB インスタンスへの接続](USER_ConnectToOracleInstance.SQLDeveloper.md)」を参照してください。

1. デフォルトのタイムゾーンを以下のように設定し、`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 のタイムゾーン](Appendix.Oracle.Options.Timezone.md)」を参照してください。

## SYS が所有する Oracle Scheduler ジョブの無効化
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.Disabling"></a>

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

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

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

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

## SYS が所有する Oracle Scheduler ジョブを有効にする
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.Enabling"></a>

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

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

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

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

## CALENDAR タイプのジョブに対する Oracle Scheduler の繰り返し間隔の変更
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.Modifying_Calendar"></a>

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

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

詳細については、「[Oracle Scheduler プロシージャの共通パラメータ](#Appendix.Oracle.CommonDBATasks.Scheduler.CommonParameters)」を参照してください。

次の例では、`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 の繰り返し間隔の変更
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.Modifying_Named"></a>

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

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

詳細については、「[Oracle Scheduler プロシージャの共通パラメータ](#Appendix.Oracle.CommonDBATasks.Scheduler.CommonParameters)」を参照してください。

次の例では、`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 ジョブ作成のオートコミットをオフにする
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.autocommit"></a>

`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
```