Oracleの自動メンテナンスタスク(autotask)を管理するSQL(11g以降をメインに記載)。
自動メンテナンスタスクの有効/無効の変更と、
実行するメンテナンス・ウィンドウを変更する操作ができれば大抵は事足りる。
もっと細かい設定がしたければ、マニュアルをみる。
よく使うOracle SQL/コマンドまとめ
自動化メンテナンス・タスクの状態の確認
SELECT * FROM DBA_AUTOTASK_WINDOW_CLIENTS;
※一括で有効/無効にした場合、後述するステータスが変更されない(12.1.0.2で確認 :バグ?)。
WINDOW_ACTIVE:ウィンドウが現在アクティブ(オープンしている)かどうか(TRUE | FALSE)
AUTOTASK_STATUS: 自動メンテナンス・タスク・サブシステムのステータス
自動メンテナンスタスクを一括で無効/有効にする
EXECUTE DBMS_AUTO_TASK_ADMIN.DISABLE; --無効にする場合
EXECUTE DBMS_AUTO_TASK_ADMIN.ENABLE; --有効にする場合
※一括で有効/無効にした場合、後述するステータスが変更されない(12.1.0.2で確認 :バグ?)。
自動メンテナンスタスクを個別に無効/有効にする
EXECUTE DBMS_AUTO_TASK_ADMIN.DISABLE('メンテナンスタスク名(CLIENT_NAME)',NULL,NULL); --無効にする場合
EXECUTE DBMS_AUTO_TASK_ADMIN.ENABLE 'メンテナンスタスク名(CLIENT_NAME)',NULL,NULL); --有効にする場合
※メンテナンスタスク名(CLIENT_NAME)は、次に紹介するSQLで確認する。
11gや12cでは、以下の3つがデフォルトで作成されている。
auto optimizer stats collection:統計情報の収集
auto space advisor:セグメントアドバイザ
sql tuning advisor:SQLチューニングアドバイザ(Enterprise Editionのみ)
自動メンテナンスタスク名(CLIENT_NAME)の確認
SELECT CLIENT_NAME, STATUS, WINDOW_GROUP FROM DBA_AUTOTASK_CLIENT;
※STATUS:メンテナンスタスクの有効/無効状態。一括で有効/無効操作をした場合、ステータスの値が変わらない(12.1.0.2で確認:バグ?)
WINDOW_GROUP:アクティブなメンテナンス・ウィンドウのウィンドウ・グループ名
ウィンドウ・グループ名と属するメンテナンス・ウィンドウの確認
SELECT WINDOW_GROUP_NAME, WINDOW_NAME
FROM DBA_SCHEDULER_WINGROUP_MEMBERS;
※ DBMS_AUTO_TASK_ADMIN.GET_CLIENT_ATTRIBUTESで取得したウィンドウ・グループ名がどのメンテナンス・ウィンドウに紐付いているかをこれで確認する。
メンテナンス・ウィンドウの開始時間と有効期間の確認
FROM DBA_AUTOTASK_SCHEDULE;
※WINDOW_NAMEが開始される時間と有効な期間(何時間か)を確認できる。
メンテナンス・ウィンドウの変更
※ウィンドウを変更する際は、事前にDBMS_SCHEDULER.DISABLEを使用してそのウィンドウを無効にし、終了した後にDBMS_SCHEDULER.ENABLEを使用して再度有効にする必要がある。現在オープン中のウィンドウを変更した場合は、そのウィンドウの次回オープンまで変更内容が反映されない。
・SUNDAY_WINDOWの期間(DURATION)を4時間に変更する例
BEGIN
DBMS_SCHEDULER.DISABLE(NAME=>'SUNDAY_WINDOW');
DBMS_SCHEDULER.SET_ATTRIBUTE(
NAME=>'SUNDAY_WINDOW',
ATTRIBUTE =>'DURATION',
VALUE=>NUMTODSINTERVAL(4, 'HOUR')
);
DBMS_SCHEDULER.ENABLE(NAME=>'SUNDAY_WINDOW');
END;
/
・MONDAY_WINDOWの開始日を2017年3月15日以降に変更する例
BEGIN
DBMS_SCHEDULER.DISABLE(NAME=>'MONDAY_WINDOW');
DBMS_SCHEDULER.SET_ATTRIBUTE(
NAME=>'MONDAY_WINDOW',
ATTRIBUTE =>'START_DATE',
VALUE=>TO_TIMESTAMP_TZ('2017/03/15','YYYY/MM/DD')
);
DBMS_SCHEDULER.ENABLE(NAME=>'MONDAY_WINDOW');
END;
/
・FRIDAY_WINDOWの開始時間を23時に変更する例
BEGIN
DBMS_SCHEDULER.DISABLE(NAME=>'FRIDAY_WINDOW');
DBMS_SCHEDULER.SET_ATTRIBUTE(
NAME=>'FRIDAY_WINDOW',
ATTRIBUTE=>'REPEAT_INTERVAL',
VALUE=>'FREQ=WEEKLY;BYDAY=MON;BYHOUR=23;BYMINUTE=0;BYSECOND=0'
);
DBMS_SCHEDULER.ENABLE(NAME=>'FRIDAY_WINDOW');
END;
/