1
1

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.

[OCI]Always FreeのAutonomous Databaseのみを使用してDBCSインスタンスの自動起動/停止をスケジューリングしてみた

Last updated at Posted at 2022-02-14

はじめに

PL/SQL SDKとDBMS_SCHEDULERによるジョブの自動実行を組み合わせて、Always FreeのAutonomous Databaseのみを使用してDatabase Cloud Serviceの自動起動/停止をスケジューリングしてみました。

こちらの手順では、リソース・プリンシパルを使用していますので、こちらのドキュメントを参考にして、あらかじめadminユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。

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

1.自動起動/停止の対象となるDBノードの情報を格納するテーブルの作成

自動起動/停止の対象となるDBノードの情報を格納するテーブル"dbnode_list"を作成します。

SQL> CREATE TABLE dbnode_list
  2  (
  3  	dbnode_ocid VARCHAR2(128),
  4  	enable_flg NUMBER NOT NULL,
  5  	PRIMARY KEY (dbnode_ocid)
  6   );

表が作成されました。

SQL>

2.自動起動/停止の対象となるDBノードの情報をテーブルに追加

対象となるDBノードのOCIDをdbnode_listテーブルに追加します。

DBCS(DBシステム VM)の場合、DBノードのOCIDを指定して起動/停止を行います。
自動起動/停止の対象となるDBノードのOCIDをコピーし、メモしておきます。
スクリーンショット 2022-02-14 8.37.17.png

dbnode_ocid列に自動起動/停止の対象となるDBノードのOCIDを、enable_flgに1をセットします。
※enable_flgに0を入れると、レコードを削除せずに自動起動/停止の対象から外せるようにしています。

SQL> INSERT INTO dbnode_list VALUES ('ocid1.dbnode.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',1);

1行が作成されました。

SQL> INSERT INTO dbnode_list VALUES ('ocid1.dbnode.oc1.ap-tokyo-1.yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',1);

1行が作成されました。

SQL> COMMIT;

コミットが完了しました。

SQL> 

以上で準備が整いました。

3.対象DBノードを起動/停止するPL/SQLブロックの作成

dbnode_listテーブルから起動対象となるDBノードのOCIDのリストを取得し、行数分だけループしてDBノードを起動するPL/SQLブロックを作成しました。

SQL> set serveroutput on
SQL> DECLARE
  2   response_body	dbms_cloud_oci_database_db_node_t;
  3   response		dbms_cloud_oci_db_database_db_node_action_response_t;
  4  
  5   CURSOR target_ocid_cur IS SELECT * FROM dbnode_list WHERE enable_flg = 1;
  6   target_ocid target_ocid_cur%ROWTYPE;
  7  
  8  BEGIN
  9   OPEN target_ocid_cur;
 10    LOOP
 11     FETCH target_ocid_cur into target_ocid;
 12     EXIT WHEN target_ocid_cur%NOTFOUND;
 13  
 14      DBMS_OUTPUT.PUT_LINE('OCID:'||target_ocid.dbnode_ocid);
 15  
 16      response := DBMS_CLOUD_OCI_DB_DATABASE.db_node_action (
 17       db_node_id => target_ocid.dbnode_ocid,
 18       action => 'START',
 19       region => 'ap-tokyo-1',
 20       credential_name => 'OCI$RESOURCE_PRINCIPAL'
 21      );
 22    END LOOP;
 23   CLOSE target_ocid_cur;
 24  END;
 25  /
OCID:ocid1.dbnode.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OCID:ocid1.dbnode.oc1.ap-tokyo-1.yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

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

SQL> 

問題なく実行されました。
コンソールでDBノードの状態を確認してみます。
スクリーンショット 2022-02-14 8.44.46.png
スクリーンショット 2022-02-14 8.44.57.png
DBノードの状態が「起動中」になりました。

少し待つと、DBノードの状態が「使用可能」になりました。
スクリーンショット 2022-02-14 8.45.55.png
スクリーンショット 2022-02-14 8.45.40.png

同様に、dbnode_listテーブルから停止対象となるDBノードのOCIDのリストを取得し、行数分だけループしてDBノードを停止するPL/SQLブロックを作成しました。

SQL> DECLARE
  2   response_body	dbms_cloud_oci_database_db_node_t;
  3   response		dbms_cloud_oci_db_database_db_node_action_response_t;
  4  
  5   CURSOR target_ocid_cur IS SELECT * FROM dbnode_list WHERE enable_flg = 1;
  6   target_ocid target_ocid_cur%ROWTYPE;
  7  
  8  BEGIN
  9   OPEN target_ocid_cur;
 10    LOOP
 11     FETCH target_ocid_cur into target_ocid;
 12     EXIT WHEN target_ocid_cur%NOTFOUND;
 13  
 14      DBMS_OUTPUT.PUT_LINE('OCID:'||target_ocid.dbnode_ocid);
 15  
 16      response := DBMS_CLOUD_OCI_DB_DATABASE.db_node_action (
 17       db_node_id => target_ocid.dbnode_ocid,
 18       action => 'STOP',
 19       region => 'ap-tokyo-1',
 20       credential_name => 'OCI$RESOURCE_PRINCIPAL'
 21      );
 22    END LOOP;
 23   CLOSE target_ocid_cur;
 24  END;
 25  /
OCID:ocid1.dbnode.oc1.ap-tokyo-1.anxhiljrssl65iqastfccxy7uy7jhsbew5kie2dcd32lrra
sjhw2fk7sf3ba
OCID:ocid1.dbnode.oc1.ap-tokyo-1.anxhiljrssl65iqaqh34fzzskhnmkazprirl42wuuift7ca
grfg5rqo5nsga

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

SQL>

問題なく実行されました。
コンソールでDBノードの状態を確認してみます。
スクリーンショット 2022-02-14 8.34.18.png
スクリーンショット 2022-02-14 8.34.03.png
DBノードの状態が「停止中」になりました。

少し待つと、DBノードの状態が「停止済」になりました。
スクリーンショット 2022-02-14 9.08.14.png
スクリーンショット 2022-02-14 9.08.46.png

4.対象DBノードを起動/停止するストアド・プロシージャの作成

対象のDBノードを起動するストアド・プロシージャ "start_dbnode" を作成します。

SQL> CREATE OR REPLACE PROCEDURE start_dbnode
  2  IS
  3   response_body	dbms_cloud_oci_database_db_node_t;
  4   response		dbms_cloud_oci_db_database_db_node_action_response_t;
  5   CURSOR target_ocid_cur IS SELECT * FROM dbnode_list WHERE enable_flg = 1;
  6   target_ocid target_ocid_cur%ROWTYPE;
  7  
  8  BEGIN
  9   OPEN target_ocid_cur;
 10    LOOP
 11     FETCH target_ocid_cur into target_ocid;
 12     EXIT WHEN target_ocid_cur%NOTFOUND;
 13  
 14      response := DBMS_CLOUD_OCI_DB_DATABASE.db_node_action (
 15       db_node_id => target_ocid.dbnode_ocid,
 16       action => 'START',
 17       region => 'ap-tokyo-1',
 18       credential_name => 'OCI$RESOURCE_PRINCIPAL'
 19      );
 20    END LOOP;
 21   CLOSE target_ocid_cur;
 22  END;
 23  /

プロシージャが作成されました。

SQL>

ストアド・プロシージャstart_dbnodeを実行してみます。

SQL> EXECUTE start_dbnode;

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

SQL>

問題なく実行されました。
コンソールでDBノードが起動されたかを確認してみます。
スクリーンショット 2022-02-14 8.44.46.png
スクリーンショット 2022-02-14 8.44.57.png
対象のDBノードが起動されていることが確認できました。

同様に、対象のDBノードを停止するストアド・プロシージャ "stop_dbnode" を作成します。

SQL> CREATE OR REPLACE PROCEDURE stop_dbnode
  2  IS
  3   response_body	dbms_cloud_oci_database_db_node_t;
  4   response		dbms_cloud_oci_db_database_db_node_action_response_t;
  5  
  6   CURSOR target_ocid_cur IS SELECT * FROM dbnode_list WHERE enable_flg = 1;
  7   target_ocid target_ocid_cur%ROWTYPE;
  8  
  9  BEGIN
 10   OPEN target_ocid_cur;
 11    LOOP
 12     FETCH target_ocid_cur into target_ocid;
 13     EXIT WHEN target_ocid_cur%NOTFOUND;
 14  
 15      response := DBMS_CLOUD_OCI_DB_DATABASE.db_node_action (
 16       db_node_id => target_ocid.dbnode_ocid,
 17       action => 'STOP',
 18       region => 'ap-tokyo-1',
 19       credential_name => 'OCI$RESOURCE_PRINCIPAL'
 20      );
 21    END LOOP;
 22   CLOSE target_ocid_cur;
 23  END;
 24  /

プロシージャが作成されました。

SQL>

ストアド・プロシージャstop_dbnodeを実行してみます。

SQL> EXECUTE stop_dbnode;

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

SQL>

問題なく実行されました。

コンソールで対象のDBノードが停止されたかを確認してみます。
スクリーンショット 2022-02-14 8.34.18.png
スクリーンショット 2022-02-14 8.34.03.png
対象のDBノードが停止されていることが確認できました。

5.DBMS_SCHEDULERジョブの作成

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

DBノードを起動するストアド・プロシージャstart_dbnodeを毎日日本時間8:00に実行するジョブ"start_dbnode_job"を作成します。

SQL> BEGIN
  2    DBMS_SCHEDULER.CREATE_JOB (
  3     job_name           =>  'START_DBNODE_JOB',
  4     job_type           =>  'STORED_PROCEDURE',
  5     job_action         =>  'ADMIN.START_DBNODE', -- ストアド・プロシージャ名
  6     start_date         =>  TO_TIMESTAMP_TZ('2022-02-13 08:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), -- 初回実行日時(日本時間2022/2/13 8:00を指定)
  7     repeat_interval    =>  'FREQ=DAILY;INTERVAL=1', -- 実行頻度(毎日実行)
  8     auto_drop          =>  FALSE,
  9     enabled            =>  TRUE
 10     );
 11  END;
 12  /

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

SQL>

同様に、DBノードを停止するストアド・プロシージャstop_dbnodeを毎日日本時間18:00に実行するジョブ"stop_dbnode_job"を作成します。

SQL> BEGIN
  2    DBMS_SCHEDULER.CREATE_JOB (
  3     job_name           =>  'STOP_DBNODE_JOB',
  4     job_type           =>  'STORED_PROCEDURE',
  5     job_action         =>  'ADMIN.STOP_DBNODE', -- ストアド・プロシージャ名
  6     start_date         =>  TO_TIMESTAMP_TZ('2022-02-13 18:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), -- 初回実行日時(日本時間2022/2/13 18:00を指定)
  7     repeat_interval    =>  'FREQ=DAILY;INTERVAL=1', -- 実行頻度(毎日実行)
  8     auto_drop          =>  FALSE,
  9     enabled            =>  TRUE
 10     );
 11  END;
 12  /

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

SQL>

以上で、Autonomous Databaseを使用してDBノードの自動起動/停止をスケジューリングすることができました。

参考情報

DBMS_CLOUDでのリソース・プリンシパルの使用
DBMS_CLOUD_OCI_DB_DATABASE.DB_NODE_ACTIONファンクション
DBMS_SCHEDULER.CREATE_JOBプロシージャ

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?