[OCI]スケジュールに基づくAutonomous Databaseのスケールアップ/スケールダウンをAutonomous Database自体にやらせてみた

# はじめに

Autonomous Databaseを運用する際、負荷の高い業務時間帯はCPUをスケールアップしてOCPU数を増やし、負荷の低い夜間はCPUをスケールダウンしてOCPU数を減らして運用するケースがあります。

Autonomous Databaseは再起動することなくCPU、ストレージをオンラインでスケールアップ/スケールダウンすることができるため、このCPUのスケールアップ/スケールダウンのスケジューリングをAutonomous Database自体に行わせることができるか検証してみました。

こちらの手順では、リソース・プリンシパルを使用していますので、[こちら](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/resource-principal-use.html#GUID-EE5C24AD-34A5-4474-9B6A-9F606AABBA98)のドキュメントを参考にして、あらかじめadminユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。

また、こちらの内容はあくまで検証のため、エラーハンドリング等は行っておりません。
本番環境で利用される際は、エラーハンドリング、リトライ処理を実装されることをお勧めします。

# 1.Autonomous DatabaseのOCIDの確認
コンソールでAutonomous DatabaseのOCIDを確認し、メモしておきます。
![スクリーンショット 2022-02-14 14.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/066f32a0-a89a-0448-8b25-8192d4b2f2fd.png)
現在、こちらの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:
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の状態を確認してみます。
![スクリーンショット 2022-02-14 13.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/abf5648c-9961-8005-7f12-d9e5738079fc.png)
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が2になり、ライフサイクル状態が「使用可能」になりました。
![スクリーンショット 2022-02-14 13.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d40f9062-a7e5-d73d-ec6f-c81d2a8e6b9f.png)

PL/SQLブロックでAutonomous Databaseのスケールアップができました。

次にocpu_countに1を指定して、現状2 OCPUのAutonomous Databaseを1 OCPUにスケールダウンしてみます。

```sql:
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の状態を確認してみます。
![スクリーンショット 2022-02-14 13.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/40e4c14d-65e5-f5c6-b4cf-0540c58f05a5.png)
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が1になり、ライフサイクル状態が「使用可能」になりました。
![スクリーンショット 2022-02-14 13.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9a25fbfb-b7ea-7a21-a48e-177c525c5b53.png)

PL/SQLブロックでAutonomous Databaseのスケールダウンができました。

# 3.Autonomous DatabaseのOCPU数を変更するストアド・プロシージャの作成
変更後のAutonomous DatabaseのOCPU数を引数として受け取り、Autonomous DatabaseのOCPU数を変更するストアド・プロシージャ"change_adb_ocpu_count"を作成します。

```sql:
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の状態を確認してみます。
![スクリーンショット 2022-02-14 13.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b3c2fc91-cc1d-a942-e24a-7fd0f3b3a410.png)
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が2になり、ライフサイクル状態が「使用可能」になりました。
![スクリーンショット 2022-02-14 14.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f8d7a6c1-65a5-a0d8-646f-bfa4184faf30.png)

ストアド・プロシージャ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の状態を確認してみます。
![スクリーンショット 2022-02-14 14.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/35513ce0-0655-6c36-ce78-0af338b46277.png)
ライフサイクル状態が「スケーリング進行中」になりました。
しばらく待つと、OCPU数が1になり、ライフサイクル状態が「使用可能」になりました。
![スクリーンショット 2022-02-14 14.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/328b0cae-8300-7e35-17b5-d5068671e320.png)

ストアド・プロシージャchange_adb_ocpu_countを使用して、Autonomous Databaseのスケールダウンができました。

# 4.DBMS_SCHEDULERジョブの作成

作成したストアド・プロシージャをDBMS_SCHEDULERのジョブとして登録します。

同様に、Autonomous DatabaseのOCPU数を変更するストアド・プロシージャchange_adb_ocpu_countを毎日日本時間8:00に実行するジョブ"scaleup_adb_job"を作成します。

```sql
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:
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:
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
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:
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:
SQL> BEGIN
  2  	DBMS_SCHEDULER.ENABLE('SCALEDOWN_ADB_JOB');
  3  END;
  4  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

以上で、Autonomous Databaseが自分自身のOCPUのスケールアップ/ダウンを行うようにスケジューリングすることができました。

# 参考

[DBMS_CLOUDでのリソース・プリンシパルの使用](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/resource-principal-use.html#GUID-EE5C24AD-34A5-4474-9B6A-9F606AABBA98)
[DBMS_CLOUD_OCI_DB_DATABASE.UPDATE_AUTONOMOUS_DATABASEファンクション](https://docs.oracle.com/en-us/iaas/pl-sql-sdk/doc/dbms_cloud_oci_db_database.html#ADSDK-GUID-8CD3A90D-8A3E-4FFA-8C69-40BE41B6515F)
[DBMS_SCHEDULER.CREATE_JOBプロシージャ](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_SCHEDULER.html#GUID-7E744D62-13F6-40E9-91F0-1569E6C38BBC)
[DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUEプロシージャ](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_SCHEDULER.html#GUID-8B7CB779-6DE3-414C-999B-B0C82E71A19B)
[DBMS_SCHEDULER.ENABLEプロシージャ](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_SCHEDULER.html#GUID-33CD9F19-8448-4BA8-AAB3-3B82A670085D)