はじめに
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プロシージャ