はじめに
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をコピーし、メモしておきます。
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ノードの状態を確認してみます。
DBノードの状態が「起動中」になりました。
同様に、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ノードの状態を確認してみます。
DBノードの状態が「停止中」になりました。
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ノードが起動されたかを確認してみます。
対象の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ノードが停止されたかを確認してみます。
対象の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プロシージャ