

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行 Oracle 資料庫執行個體的一般排程任務
<a name="Appendix.Oracle.CommonDBATasks.Scheduler"></a>

`SYS` 擁有的部分排程器任務可能會干擾正常的資料庫作業。在這種情況下，Oracle Support 建議您修改排程。如果您需要啟用或停用 `SYS` 任務，請在測試環境中測試排程任務的操作，然後再於生產環境中實作。如要執行 `SYS` 所擁有之 Oracle Scheduler 工作的任務，請使用 Amazon RDS 套件 `rdsadmin.rdsadmin_dbms_scheduler`。

Amazon RDS for Oracle 資料庫引擎版本支援的 `rdsadmin.rdsadmin_dbms_scheduler` 程序會顯示在下表。使用此套件時，您可以指定資料表中列出的 `SYS` 任務。


| 資料庫版本 | 依預設會啟用任務 | 依預設會停用任務 | 
| --- | --- | --- | 
| Oracle 資料庫 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 資料庫執行個體的一般排程任務](#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 Scheduler 的某些元件，請使用 Oracle 程序 `dbms_scheduler.set_attribute`。如需詳細資訊，請參閱 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 資料庫執行個體時，請將結構描述名稱 `SYS` 加至物件名稱的前端。下列範例會設定 Monday 視窗物件的資源計劃屬性。

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

## 修改 AutoTask 維護視窗
<a name="Appendix.Oracle.CommonDBATasks.Scheduler.maintenance-windows"></a>

Amazon RDS for Oracle 執行個體是以維護視窗的預設設定所建立的。在這些視窗期間執行自動維護任務，例如最佳化處理程式統計數字收集。依預設，維護視窗會開啟 Oracle 資料庫資源管理員。

如要修改視窗，請使用 `DBMS_SCHEDULER` 套件。您可能需要修改維護視窗設定，原因如下：
+ 您希望在不同時間執行的維護任務，使用不同的設定，或完全不執行。例如，可能想要修改視窗持續時間，或變更重複時間和間隔。
+ 您想要避免在維護期間啟用資源管理員的效能影響。例如，若已指定預設維護計劃，且在資料庫負載下時開啟維護視窗，您可能會看到等待事件，例如 `resmgr:cpu quantum`。此等待事件與資料庫資源管理員有關。您有下列選項：
  + 確保資料庫執行個體的離峰時間期間維護視窗處於作用中狀態。
  + 藉由將 `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 連線至您的資料庫執行個體](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>

若要開啟 STS 擁有的 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` 類型、系統擁有的 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 任務會使用排程名稱，而非間隔。針對此類型的任務，您必須在主要使用者結構描述中建立新的指定排程。請使用標準的 Oracle `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
```