私はAutonomous かnon-Autonomousか、それが問題だ。 (2022/08/31)

私はAutonomous かnon-Autonomousか、それが問題だ。 (2022/08/31)

https://database-heartbeat.com/2021/08/31/isautonomous/



はじめに


データベースをOracle Cloudに移行するお客様が増えている中、お客様の環境にはオンプレミス、Oracle Database Cloud Service、Oracle Autonomous Databaseの3つが混在しています。


DBAや開発者は通常、SQLスクリプトを使用してデータベース内のいくつかのタスクを自動化します。場合によっては、あるタスクはAutonomousデータベースだけで実行し、別のタスクは非Autonomousデータベースだけで実行したいと考えることもあります。スクリプトの一貫性を維持し、異なるバージョンのメンテナンスのオーバーヘッドを避けるために、スクリプトのバージョンを1つにすることは良い習慣です。そして、それに基づいて、特定のSQLやPL/SQLコードを実行するかどうかを決定します。


私はお客様や同僚と議論する中で、このブログポストで紹介・議論したい様々なアプローチを見てきました。もしあなたがベストソリューションに興味があるなら、アプローチ5へ直接ジャンプしてください。



環境について


  •     Oracle Autonomous Database on Shared Infrastructure(共有インフラ上のOracle Autonomous Database)
  •     オンプレミスのデータベースをエミュレートするために、OCI Compute上でMarketplaceのOracle Databaseを実行



Autonomousで動作しているかどうかを確認するためのアプローチ


アプローチ1:パラメータ値を確認


Autonomous Databasesでロックダウンプロファイルが設定されているなど、データベースパラメータが特定の値に設定されているかどうかを確認します。

SQL> select value from v$parameter where name = 'pdb_lockdown';
VALUE
-------
DWCS


しかし、まだ使っていなければ、いずれは非Autonomous DatabaseデータベースでもPDBロックダウンプロファイルを使い始めるかもしれないので、これはあまり信頼できる方法ではない。


アプローチ2:DBMS_CLOUDパッケージの存在を確認


DBMS_CLOUD PL/SQLパッケージはすべてのOracle Autonomous Databasesで利用可能で、Object Storageに保存されたデータにアクセスできるようにします。

SQL> select owner, object_name, object_type
from dba_objects
where object_name = 'DBMS_CLOUD';
 
OWNER                OBJECT_NAME          OBJECT_TYPE
-------------------- -------------------- --------------------
PUBLIC               DBMS_CLOUD           SYNONYM
C##CLOUD$SERVICE     DBMS_CLOUD           PACKAGE
C##CLOUD$SERVICE     DBMS_CLOUD           PACKAGE BODY


しかし、データベースバージョン19.9から、DBMS_CLOUDはAutonomousでないデータベースでも利用できるようになりました。それでも所有者を確認することはできますが、非Autonomous DatabaseにDBMS_CLOUDをインストールする際に、同じ名前のC###CLOUD$SERVICEを使用することができます。


アプローチ3:データベースインスタンスの数を確認


Autonomous Database on Shared InfrastructureはExadata Full Racks上で動作するため、Autonomous Databaseサービスが何台のインスタンス上で利用できるかに関わらず、8台のアクティブインスタンスを取得することになります。

SQL> select inst_number, inst_name
from v$active_instances
order by inst_number;
 
INST_NUMBER INST_NAME
----------- ------------------------------------------------------------
          1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod1
          2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod2
          3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod3
          4 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod4
          5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod5
          6 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod6
          7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod7
          8 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:ehz1pod8
 
8 rows selected.


しかし、あなたの環境では、他の8ノードRACがあるかもしれません。インスタンス名がxで始まり、pod1~pod8で終わっていることを確認しても、データベースに影響を与えない範囲でOracleがバックグラウンドでこれらの設定を変更する可能性があるため、100%信頼できるわけではありません。


アプローチ4:サービス名を確認


Oracle Autonomous Databasesは、あらかじめ定義されたサービス名を提供しています。

SQL> select name
from cdb_services
order by name;
 
NAME
----------------------------------------------------------------
VIBPPCKZTXTGJIP_ADBPUBLIC
VIBPPCKZTXTGJIP_ADBPUBLIC_high.adb.oraclecloud.com
VIBPPCKZTXTGJIP_ADBPUBLIC_low.adb.oraclecloud.com
VIBPPCKZTXTGJIP_ADBPUBLIC_medium.adb.oraclecloud.com


このサービス名は変更も削除もできないので、サービス名を照会することでAutonomous Database上で動作しているかどうかを把握することは、かなり信頼性が高いと言えます。しかし、これは100%信頼できるのでしょうか?まあ、非Autonomous Database上で、まったく同じ名前のサービスを作ることはできるだろうが、なぜそんなことをするのか想像もつきません。


アプローチ5:v$pdbsビューのCLOUD_IDENTITYカラムをチェック


幸いなことに、SQLを使用してAutonomous Database上で動作しているかどうかを確認する100%信頼できる方法があります。

SQL> select cloud_identity
from v$pdbs;
 
CLOUD_IDENTITY
----------------------------------------------------------------------------------------------------------------------------------
{
  "DATABASE_NAME" : "ADBPUBLIC",
  "REGION" : "eu-frankfurt-1",
  "TENANT_OCID" : "OCID1.TENANCY.OC1..AAAAAAAAHWQ3YKAWJ2W6H72ERRKTEGOYCRUTMF3TVJBWKVM75QZVJLW4TO6A",
  "DATABASE_OCID" : "OCID1.AUTONOMOUSDATABASE.OC1.EU-FRANKFURT-1.ABTHELJSTULZNVIUOORCDGZI23J5RKVUE3FRER6BVD54SOH5ST7KLSJAQ97A",
  "COMPARTMENT_OCID" : "ocid1.compartment.oc1..aaaaaaaabpe3gy2keoxpobzij76k2uxhq4uskq6nilcmxeydsliyqxnbvdhq",
  "OUTBOUND_IP_ADDRESS" :
  [
    "132.145.239.59"
  ]
}

CLOUD_IDENTITY カラムは、Autonomous 以外のデータベースには存在しません。

SQL> select cloud_identity
from v$pdbs;
 
       *
ERROR at line 1:
ORA-00904: "CLOUD_IDENTITY": invalid identifier


将来、他のクラウドデータベースにこのカラムが含まれた場合でも、"AUTONOMOUSDATABASE "という文字列を含むOCIDを見れば、これがAutonomous Databaseであるかどうかを100%の信頼度で判断することができます。



Autonomous Databaseのワークロードの種類を判断


Autonomous Transaction Processing(ATP)、Autonomous Data Warehouse(ADW)、Autonomous JSON(AJD)、Autonomous APEX(APX)など、SQLでAutonomous Databaseのワークロードの種類を特定できないかという質問を受けることがあります。


v$pdbs ビューの CLOUD_IDENTITY カラムは、残念ながらこの情報を提供しません。


私たちが知っている限り、ADW はクライアント接続用に 3 つの事前定義されたデータベース サービス(_low、_medium、_high)を提供し、ATP は 5 つ(_low、_medium、_high、_tp、_tpurgent)のサービスを提供しています。

-- ADW
SQL> select count(*) from cdb_services where name like '%.adb.oraclecloud.com';
 
  COUNT(*)
----------
         3
 
-- ATP
SQL> select count(*) from cdb_services where name like '%.adb.oraclecloud.com';
 
  COUNT(*)
----------
         5


しかし、Autonomous JSONとAPEXも同じ5つの事前定義されたサービスを持っており、このクエリの結果を使用してATPと区別することはできません。


最良の方法は、DBMS_CLOUD.SEND_REQUESTプロシージャを使用して、Autonomous Database内からREST API呼び出しを設定し、Autonomous Databaseについて利用可能なすべての情報を取得することです。


資格情報、1回限りのアクティビティを作成します。

SQL> BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'CLOUD_CRED',
        user_ocid => 'ocid1.user.oc1..aaaaaaaasnkrajs53vdpaiksdewotv4eyfhs6paxjpgrza2qfqrztrdyofwa',
        tenancy_ocid => 'ocid1.tenancy.oc1..aaaaaaaahwq3ykawj2w6h72errlkbgoycrutmf3tvkiukvm64qzvjlw4to6a',
        private_key => '-----BEGIN RSA PRIVATE KEY----- xxx -----END RSA PRIVATE KEY-----',
        fingerprint => 'be:6e:54:5b:f7:43:85:8a:00:b5:e5:5c:51:91:0f:65');
END;
/


Autonomous DatabaseのOCIDを指定して、GETリクエストを送信してください。

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
    resp DBMS_CLOUD_TYPES.resp;
    autonomous_database_ocid VARCHAR2(512) := 'ocid1.autonomousdatabase.oc1.eu-frankfurt-1.antheljtgxomteaaz7zgf7cpfwkzzmbjzwluu3n2jaunpo73koubxk3gvypa';
BEGIN
    resp := DBMS_CLOUD.send_request(
        credential_name => 'CLOUD_CRED',
        uri     => 'https://iaas.eu-frankfurt-1.oraclecloud.com/20160918/autonomousDatabases/'||autonomous_database_ocid,
        method  => DBMS_CLOUD.METHOD_GET,
        headers => JSON_OBJECT('opc-request-id' value 'get-autonomous-database')
    );
    dbms_output.put_line('response: ' || DBMS_CLOUD.get_response_text(resp));
END;
/


レスポンスに含まれる「dbWorkload」値を探します。これは以下のようになります。

  • For ATP: “dbWorkload”:”OLTP”
  • For ADW: “dbWorkload”:”DW”
  • For AJD: “dbWorkload”:”AJD”
  • For APX: “dbWorkload”:”APEX”



まとめ


SQLスクリプトがOracle Autonomous Databaseで実行されているか、非Autonomous Databaseで実行されているかを判断する必要がある場合がある。それに基づいて、特定のコードを実行するかどうかを決定する必要があります。データベースからSQLステートメントを使用してこの情報を取得するには、多くのアプローチがあります。最も信頼できるのは、v$pdbsビューのCLOUD_IDENTITYカラムに問い合わせる方法です。


REST APIコールを使用することで、OCIリソースに任意のリクエストを送ることができ、それを使って、ワークロードの種類など、Autonomous Databaseに関するすべての情報を、Autonomous Database自体からSQLを使って取得することができます。



その他の情報

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)