0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-07-09

はじめに

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

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

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

動的グループの作成例:
動的グループ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を作成します。

複数コアを有効活用できるように、こちらの記事を参考に、ジョブ・クラス(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ファンクションおよびプロシージャ
Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:Database Service API
Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:UpdateAutonomousDatabase
Oracle Cloud Infrastructure Documentation / API Reference and Endpoints:UpdateAutonomousDatabaseDetails
DBMS_SCHEDULER.CREATE_JOBプロシージャ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?