Autonomous Database：DBMS_SCHEDULERによる定期実行ジョブの前後に行うOCPUのスケールアップ/ダウンを自動化する

# はじめに
Autonomous Databaseにおいて、PL/SQLプロシージャ等でバッチ処理を行う際に、処理の開始前にOCPUの設定値を大きな値に変更し、スケールアップが完了してからバッチ処理を開始、処理終了後にOCPUの設定値を下げたいといったケースがあります。

そこで今回は、APIをコールしてOCPU数の設定変更を行い、スケールアップが完了したら動作を終了するPL/SQLプロシージャを作成します。
このプロシージャをDBMS_SCHEDULERジョブとして定期的に実行するプロシージャ内で使用することで、バッチ処理の前後でOCPU数を変更できます。

なお、この記事ではリソース・プリンシパルを使用しますので、こちらのマニュアルに従って、使用するAutonomous Databaseを含む動的グループを作成し、作成した動的グループに対してAutonomous Databaseに対する操作を許可するポリシーを作成する必要があります。

https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/resource-principal-prereq.html#GUID-3CF59CED-F7DF-46AF-B3CF-E703ED0BB3EE

動的グループの作成例：
動的グループadb_groupを作成し、一致ルールとして以下を入力
（resource.idにAutonomous DatabaseのOCIDを指定）
```
resource.id='ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxx'
```

ポリシーの例：
動的グループadb_groupに属するリソースに、テナンシ内の全てのAutonomous Databaseの管理を許可する
```
allow dynamic-group adb_group to manage autonomous-databases in tenancy
```

※こちらの内容は2023/7月現在の検証内容です。あくまで検証目的のためエラーハンドリング等を実装しておりません。実際の環境で使用する際は、充分な検証を実施し、自己責任でお願いします。


# 1. OCPUの設定値を変更しスケーリングが完了したら動作を終了するPL/SQLプロシージャの作成

APIをコールして、プロシージャを実行するAutonomous DatabaseのOCPUの設定値を変更し、スケーリング処理が完了したら動作を終了するPL/SQLプロシージャchange_ocpu_countを作成します。
実行する際は、新しいOCPUの設定値を引数として渡して実行します。
```
CREATE OR REPLACE PROCEDURE change_ocpu_count ( ocpu_count IN NUMBER )
IS
    adb_ocid      VARCHAR2(200);
    adb_region    VARCHAR2(100);
    resp          DBMS_CLOUD_TYPES.RESP;
    body          JSON_OBJECT_T := JSON_OBJECT_T('{}');
    status_array  DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T := DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T('SUCCEEDED');
BEGIN
-- v$pdbsビューからAutonomous DatabaseのOCIDとリージョンを取得
    SELECT JSON_VALUE(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.DATABASE_OCID'))
        INTO adb_region, adb_ocid FROM v$pdbs;
-- リクエスト・ボディ内の変更後のOCPU数（cpuCoreCount）に引数の値をセット
    body.put('cpuCoreCount', ocpu_count);
-- DBMS_CLOUD.SEND_REQUESTファンクションでAPIをコール（ステイタスがSUCCEEDEDになるまで待って終了）
    resp := DBMS_CLOUD.SEND_REQUEST(
                  credential_name    => 'OCI$RESOURCE_PRINCIPAL',
                  uri                => 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid,
                  method             => DBMS_CLOUD.METHOD_PUT,
                  body               => UTL_RAW.CAST_TO_RAW(body.to_clob),
                  async_request_url  => 'https://iaas.'||adb_region||'.oraclecloud.com/20160918/workRequests',
                  wait_for_states    => status_array,
                  timeout            => 600
            );
END;
/
```

# 2. 作成したプロシージャを使用してバッチ処理を行うPL/SQLプロシージャを作成
バッチ処理を実行する前にOCPUの設定値を2に変更し、スケーリング終了後にバッチ処理を実行、バッチ処理終了後にOCPUの設定値を1に変更するPL/SQLプロシージャの例は以下のようになります。

```
CREATE OR REPLACE PROCEDURE daily_batch
IS
BEGIN
  change_ocpu_count(2);

-- 実際のバッチ処理をここに記述
  daily_batch_main;

  change_ocpu_count(1);
END;
/
```

# 3. DBMS_SCHEDULERジョブの作成
プロシージャdaily_batchを毎日8時に自動実行するDBMS_SCHEDULERジョブdaily_batch_jobを作成します。

複数コアを有効活用できるように、[こちら](https://qiita.com/500InternalServerError/items/78652981a89dc12e2d24)の記事を参考に、ジョブ・クラス（job_class）にMEDIUMやHIGH等を指定して、ジョブ内のSQLがパラレル実行されるようにします。
```
BEGIN
	DBMS_SCHEDULER.CREATE_JOB (
 	    job_name           =>  'DAILY_BATCH_JOB',
 	    job_type           =>  'STORED_PROCEDURE',
 	    job_action         =>  'ADMIN.DAILY_BATCH', 
 	    start_date         =>  TO_TIMESTAMP_TZ('2023-07-09 08:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'),
 	    repeat_interval    =>  'FREQ=DAILY;INTERVAL=1',
 	    auto_drop          =>  FALSE,
 	    enabled            =>  TRUE,
        job_class          =>  'HIGH'
 	);
END;
/
```

# 参考情報
・[DBMS_CLOUD SEND_REQUESTファンクションおよびプロシージャ](https://docs.oracle.com/ja-jp/iaas/autonomous-database/doc/ref-dbms_cloud-rest-apis.html#GUID-B063870D-6C1F-4F33-B354-885B73C81D37)
・[Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:Database Service API](https://docs.oracle.com/en-us/iaas/api/#/en/database/20160918/)
・[Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:UpdateAutonomousDatabase](https://docs.oracle.com/en-us/iaas/api/#/en/database/20160918/AutonomousDatabase/UpdateAutonomousDatabase)
・[Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:UpdateAutonomousDatabaseDetails](https://docs.oracle.com/en-us/iaas/api/#/en/database/20160918/datatypes/UpdateAutonomousDatabaseDetails)
・[DBMS_SCHEDULER.CREATE_JOBプロシージャ](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_SCHEDULER.html#GUID-7E744D62-13F6-40E9-91F0-1569E6C38BBC)