はじめに
SQLでAutonomous Databaseのステータス(AVAILABLE、STOPPED、STARTING、UPDATING等)が確認できると何かと便利なので、指定したAutonomous Databaseのステータスを返すストアド・ファンクションを作成してみました。
Autonomous DatabaseがあるリージョンとAutonomous DatabaseのOCIDを引数として渡すと、指定されたAutonoumos Databaseのステータス(Lifecycle State)を返すファンクションget_adb_stateを作成します。
ここではAPIアクセスの認証にAutonomous Databaseのリソース・プリンシパルを使用しています。
CREATE OR REPLACE FUNCTION get_adb_state ( adb_region IN VARCHAR2, adb_ocid IN VARCHAR2)
RETURN VARCHAR2
IS
request_uri VARCHAR2(300);
resp DBMS_CLOUD_TYPES.resp;
BEGIN
-- 指定したAutonomous Databaseの情報を取得するAPIをコールするためのURIの生成
request_uri := 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid;
-- Autonomous Databaseの情報を取得するAPIをコール
resp := DBMS_CLOUD.SEND_REQUEST(
credential_name => 'OCI$RESOURCE_PRINCIPAL',
uri => request_uri,
method => DBMS_CLOUD.METHOD_GET
);
-- 取得したAutonomous Databaseの情報内のlifecycleStateの値を戻す
RETURN json_value(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.lifecycleState');
END;
/
SQL*Plusから作成してみます。
SQL> CREATE OR REPLACE FUNCTION get_adb_state ( adb_region IN VARCHAR2, adb_ocid IN VARCHAR2)
2 RETURN VARCHAR2
3 IS
4 request_uri VARCHAR2(300);
5 resp DBMS_CLOUD_TYPES.resp;
6 BEGIN
7 request_uri := 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid;
8 resp := DBMS_CLOUD.SEND_REQUEST(
9 credential_name => 'OCI$RESOURCE_PRINCIPAL',
10 uri => request_uri,
11 method => DBMS_CLOUD.METHOD_GET
12 );
13 RETURN json_value(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.lifecycleState');
14 END;
15 /
ファンクションが作成されました。
SQL>
問題なく作成できましたので、早速実行してみます。
get_adb_stateファンクションにAutonomous DatabaseがあるリージョンとAutonomous DatabaseのOCIDを渡して実行してみました。
ここではap-osaka-1(=大阪リージョン)と大阪リージョンにあるAutonomous DatabaseのOCIDを指定しています。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
AVAILABLE
SQL>
ステータスが「AVAILABLE」であることがわかりました。
コンソールでAutonomous Databaseのステータスを確認してみます。
「使用可能」であることが確認できました。
こちらのAutonomous Databaseを停止して、get_adb_stateファンクションの結果が変化するかを確認してみます。
コンソールで「停止中」となっている状態では、get_adb_stateファンクションの結果が「STOPPING」になりました。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
STOPPING
SQL>
コンソールで「停止済」となっている状態では、get_adb_stateファンクションの結果が「STOPPED」になりました。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
STOPPED
SQL>
こちらのAutonomous Databaseを起動します。
コンソールで「起動中」となっている状態では、get_adb_stateファンクションの結果が「STARTING」になりました。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
STARTING
SQL>
Autonomous Databaseが使用可能になるのを待ちます。
get_adb_stateファンクションの結果が「STARTING」に戻りました。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
AVAILABLE
SQL>
こちらのAutonomous Databaseはリフレッシュ可能クローンなので、リフレッシュを実行してみます。
リフレッシュ中はコンソールでは「更新中」と表示されます。
コンソールで「更新中」となっている状態では、get_adb_stateファンクションの結果が「UPDATING」になりました。
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;
ADB_STATE
--------------------------------------------------------------------------------
UPDATING
SQL>
まとめ
指定したAutonomous Databaseの状態(Lifecycle State)を返すストアド・ファンクションを作成できました。
めでたし、めでたし。
参考資料
・API Reference and Endpoints:Database Service API
・API Reference and Endpoints:GetAutonomousDatabase
・DBMS_CLOUD.SEND_REQUEST
・DBMS_CLOUD.GET_RESPONSE_TEXT