はじめに
Autonomous Databaseを運用する際、負荷の高い業務時間帯はCPUをスケールアップしてOCPU数を増やし、負荷の低い夜間はCPUをスケールダウンしてOCPU数を減らして運用するケースがあります。
Autonomous Databaseは再起動することなくCPU、ストレージをオンラインでスケールアップ/スケールダウンすることができるため、このCPUのスケールアップ/スケールダウンのスケジューリングをAutonomous Database自体に行わせることができるか検証してみました。
こちらの手順では、リソース・プリンシパルを使用していますので、こちらのドキュメントを参考にして、あらかじめadminユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。
また、こちらの内容はあくまで検証のため、エラーハンドリング等は行っておりません。
本番環境で利用される際は、エラーハンドリング、リトライ処理を実装されることをお勧めします。
1.Autonomous DatabaseのOCIDの確認
コンソールでAutonomous DatabaseのOCIDを確認し、メモしておきます。
現在、こちらのAutotnomous Databaseは1 OCPUで稼働しています。
2.Autonomous DatabaseのOCPU数を変更するPL/SQLブロックの作成
こちらのAutonomous Databaseにデータベース・アクションやSQL*Plusからadminユーザで接続します。
Autonomous DatabaseのOCPU数を変更するPL/SQLブロックを作成して、実行してみます。
・target_adb_ocidにAutonomous DatabaseのOCIDを指定します。
・ocpu_countに設定するOCPU数を指定します。
ocpu_countに2を指定して、現状1 OCPUのAutonomous Databaseを2 OCPUにスケールアップしてみます。
SQL> set serveroutput on
SQL> DECLARE
2 autonomous_database_details dbms_cloud_oci_database_update_autonomous_database_details_t;
3 response_body dbms_cloud_oci_database_autonomous_database_t;
4 response dbms_cloud_oci_db_database_update_autonomous_database_response_t;
5 target_adb_ocid VARCHAR2(200) := 'ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
6 ocpu_count NUMBER := 2;
7
8 BEGIN
9
10 DBMS_OUTPUT.PUT_LINE('OCID:'||target_adb_ocid);
11 DBMS_OUTPUT.PUT_LINE('New OCPU count:'||ocpu_count);
12
13 autonomous_database_details := dbms_cloud_oci_database_update_autonomous_database_details_t();
14 autonomous_database_details.cpu_core_count := ocpu_count;
15
16 response := DBMS_CLOUD_OCI_DB_DATABASE.UPDATE_AUTONOMOUS_DATABASE (
17 autonomous_database_id => target_adb_ocid,
18 update_autonomous_database_details => autonomous_database_details,
19 region => 'ap-tokyo-1',
20 credential_name => 'OCI$RESOURCE_PRINCIPAL'
21 );
22
23 END;
24 /
OCID:ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
New OCPU count:2
PL/SQLプロシージャが正常に完了しました。
SQL>
コンソールでAutonomous Databaseの状態を確認してみます。
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が2になり、ライフサイクル状態が「使用可能」になりました。
PL/SQLブロックでAutonomous Databaseのスケールアップができました。
次にocpu_countに1を指定して、現状2 OCPUのAutonomous Databaseを1 OCPUにスケールダウンしてみます。
SQL> set serveroutput on
SQL> DECLARE
2 autonomous_database_details dbms_cloud_oci_database_update_autonomous_database_details_t;
3 response_body dbms_cloud_oci_database_autonomous_database_t;
4 response dbms_cloud_oci_db_database_update_autonomous_database_response_t;
5 target_adb_ocid VARCHAR2(200) := 'ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
6 ocpu_count NUMBER := 1;
7
8 BEGIN
9
10 DBMS_OUTPUT.PUT_LINE('OCID:'||target_adb_ocid);
11 DBMS_OUTPUT.PUT_LINE('New OCPU count:'||ocpu_count);
12
13 autonomous_database_details := dbms_cloud_oci_database_update_autonomous_database_details_t();
14 autonomous_database_details.cpu_core_count := ocpu_count;
15
16 response := DBMS_CLOUD_OCI_DB_DATABASE.UPDATE_AUTONOMOUS_DATABASE (
17 autonomous_database_id => target_adb_ocid,
18 update_autonomous_database_details => autonomous_database_details,
19 region => 'ap-tokyo-1',
20 credential_name => 'OCI$RESOURCE_PRINCIPAL'
21 );
22
23 END;
24 /
OCID:ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
New OCPU count:1
PL/SQLプロシージャが正常に完了しました。
SQL>
コンソールでAutonomous Databaseの状態を確認してみます。
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が1になり、ライフサイクル状態が「使用可能」になりました。
PL/SQLブロックでAutonomous Databaseのスケールダウンができました。
3.Autonomous DatabaseのOCPU数を変更するストアド・プロシージャの作成
変更後のAutonomous DatabaseのOCPU数を引数として受け取り、Autonomous DatabaseのOCPU数を変更するストアド・プロシージャ"change_adb_ocpu_count"を作成します。
SQL> CREATE OR REPLACE PROCEDURE change_adb_ocpu_count( ocpu_count IN NUMBER )
2 IS
3 autonomous_database_details dbms_cloud_oci_database_update_autonomous_database_details_t;
4 response_body dbms_cloud_oci_database_autonomous_database_t;
5 response dbms_cloud_oci_db_database_update_autonomous_database_response_t;
6
7 target_adb_ocid VARCHAR2(200) := 'ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
8
9 BEGIN
10
11 DBMS_OUTPUT.PUT_LINE('OCID:'||target_adb_ocid);
12 DBMS_OUTPUT.PUT_LINE('New OCPU count:'||ocpu_count);
13
14 autonomous_database_details := dbms_cloud_oci_database_update_autonomous_database_details_t();
15 autonomous_database_details.cpu_core_count := ocpu_count;
16
17 response := DBMS_CLOUD_OCI_DB_DATABASE.UPDATE_AUTONOMOUS_DATABASE (
18 autonomous_database_id => target_adb_ocid,
19 update_autonomous_database_details => autonomous_database_details,
20 region => 'ap-tokyo-1',
21 credential_name => 'OCI$RESOURCE_PRINCIPAL'
22 );
23
24 END;
25 /
プロシージャが作成されました。
SQL>
作成したストアド・プロシージャchange_adb_ocpu_countに引数として2を渡して実行してみます。
SQL> EXECUTE change_adb_ocpu_count(2);
OCID:ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
New OCPU count:2
PL/SQLプロシージャが正常に完了しました。
SQL>
コンソールでAutonomous Databaseの状態を確認してみます。
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が2になり、ライフサイクル状態が「使用可能」になりました。
ストアド・プロシージャchange_adb_ocpu_countを使用して、Autonomous Databaseのスケールアップができました。
次に、作成したストアド・プロシージャchange_adb_ocpu_countに引数として1を渡して実行してみます。
SQL> EXECUTE change_adb_ocpu_count(1);
OCID:ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
New OCPU count:1
PL/SQLプロシージャが正常に完了しました。
SQL>
コンソールでAutonomous Databaseの状態を確認してみます。
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が1になり、ライフサイクル状態が「使用可能」になりました。
ストアド・プロシージャchange_adb_ocpu_countを使用して、Autonomous Databaseのスケールダウンができました。
4.DBMS_SCHEDULERジョブの作成
作成したストアド・プロシージャをDBMS_SCHEDULERのジョブとして登録します。
同様に、Autonomous DatabaseのOCPU数を変更するストアド・プロシージャchange_adb_ocpu_countを毎日日本時間8:00に実行するジョブ"scaleup_adb_job"を作成します。
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => 'SCALEUP_ADB_JOB',
4 job_type => 'STORED_PROCEDURE',
5 job_action => 'ADMIN.CHANGE_ADB_OCPU_COUNT', -- ストアド・プロシージャ名
6 number_of_arguments => 1,
7 start_date => TO_TIMESTAMP_TZ('2022-02-14 8:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), -- 初回実行日時(日本時間2022/2/14 8:00を指定)
8 repeat_interval => 'FREQ=DAILY;INTERVAL=1', -- 実行頻度(毎日実行)
9 auto_drop => FALSE
10 );
11 END;
12 /
PL/SQLプロシージャが正常に完了しました。
SQL>
作成したジョブ"SCALEUP_ADB_JOB"に第1引数として"2"(OCPU数)を渡す設定をします。
SQL> BEGIN
2 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (
3 job_name => 'SCALEUP_ADB_JOB',
4 argument_position => 1,
5 argument_value => 2);
6 END;
7 /
PL/SQLプロシージャが正常に完了しました。
SQL>
作成したジョブ"SCALEUP_ADB_JOB"を有効化します。
SQL> BEGIN
2 DBMS_SCHEDULER.ENABLE('SCALEUP_ADB_JOB');
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL>
Autonomous DatabaseのOCPU数を変更するストアド・プロシージャchange_adb_ocpu_countを毎日日本時間18:00に実行するジョブ"scaledown_adb_job"を作成します。
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => 'SCALEDOWN_ADB_JOB',
4 job_type => 'STORED_PROCEDURE',
5 job_action => 'ADMIN.CHANGE_ADB_OCPU_COUNT', -- ストアド・プロシージャ名
6 number_of_arguments => 1,
7 start_date => TO_TIMESTAMP_TZ('2022-02-14 18:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), -- 初回実行日時(日本時間2022/2/14 18:00を指定)
8 repeat_interval => 'FREQ=DAILY;INTERVAL=1', -- 実行頻度(毎日実行)
9 auto_drop => FALSE
10 );
11 END;
12 /
PL/SQLプロシージャが正常に完了しました。
SQL>
作成したジョブ"SCALEDOWN_ADB_JOB"に第1引数として"1"(OCPU数)を渡す設定をします。
SQL> BEGIN
2 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (
3 job_name => 'SCALEDOWN_ADB_JOB',
4 argument_position => 1,
5 argument_value => 1);
6 END;
7 /
PL/SQLプロシージャが正常に完了しました。
SQL>
作成したジョブ"SCALEDOWN_ADB_JOB"を有効化します。
SQL> BEGIN
2 DBMS_SCHEDULER.ENABLE('SCALEDOWN_ADB_JOB');
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL>
以上で、Autonomous Databaseが自分自身のOCPUのスケールアップ/ダウンを行うようにスケジューリングすることができました。
参考
DBMS_CLOUDでのリソース・プリンシパルの使用
DBMS_CLOUD_OCI_DB_DATABASE.UPDATE_AUTONOMOUS_DATABASEファンクション
DBMS_SCHEDULER.CREATE_JOBプロシージャ
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUEプロシージャ
DBMS_SCHEDULER.ENABLEプロシージャ