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 Scheduler プロシージャの共通パラメータ
Oracle Scheduler のタスクを実行するには、Amazon RDS パッケージ rdsadmin.rdsadmin_dbms_scheduler
を使用します。いくつかのパラメータは、パッケージ内のすべてのプロシージャに共通です。パッケージ内の共通パラメータは以下のとおりです。
パラメータ名 | データ型 | 有効な値 | デフォルト | 必須 | 説明 |
---|---|---|---|---|---|
|
varchar2 |
|
— |
はい |
変更するジョブの名前。 注記現在、 |
|
varchar2 |
|
– |
はい |
変更する属性。 ジョブの繰り返し間隔を変更するには、 ジョブのスケジュール名を変更するには、 |
|
varchar2 |
使用される属性に応じて、有効なスケジュール間隔またはスケジュール名。 |
– |
はい |
属性の新しい値。 |
DBMS_SCHEDULER ジョブの変更
Oracle 手順dbms_scheduler.set_attribute
を使用して、Oracle スケジューラの特定のコンポーネントを変更します。詳細については、Oracle ドキュメントの「DBMS_SCHEDULER
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:
に設定します。インスタンスでエンタープライズエディションを使用している場合、この設定により、データベースリソースマネージャープランがアクティブ化されなくなります。
-
メンテナンスウィンドウの設定を変更するには
-
Oracle SQL クライアントを使用して、データベースに接続します。
-
スケジューラウィンドウの現在の設定をクエリします。
次の例では、
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
-
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
現在のタイムゾーン設定を変更するには
-
SQL Developer などのクライアントを使用してデータベースに接続します。詳細については、「Oracle SQL Developer を使用した DB インスタンスへの接続」を参照してください。
-
デフォルトのタイムゾーンを以下のように設定し、
をお客様のタイムゾーンに置き換えます。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