私は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 SYNONYMC##CLOUD$SERVICE DBMS_CLOUD PACKAGEC##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_namefrom v$active_instancesorder 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:ehz1pod88 rows selected.しかし、あなたの環境では、他の8ノードRACがあるかもしれません。インスタンス名がxで始まり、pod1~pod8で終わっていることを確認しても、データベースに影響を与えない範囲でOracleがバックグラウンドでこれらの設定を変更する可能性があるため、100%信頼できるわけではありません。
アプローチ4:サービス名を確認
Oracle Autonomous Databasesは、あらかじめ定義されたサービス名を提供しています。
SQL> select namefrom cdb_servicesorder by name;NAME----------------------------------------------------------------VIBPPCKZTXTGJIP_ADBPUBLICVIBPPCKZTXTGJIP_ADBPUBLIC_high.adb.oraclecloud.comVIBPPCKZTXTGJIP_ADBPUBLIC_low.adb.oraclecloud.comVIBPPCKZTXTGJIP_ADBPUBLIC_medium.adb.oraclecloud.comこのサービス名は変更も削除もできないので、サービス名を照会することでAutonomous Database上で動作しているかどうかを把握することは、かなり信頼性が高いと言えます。しかし、これは100%信頼できるのでしょうか?まあ、非Autonomous Database上で、まったく同じ名前のサービスを作ることはできるだろうが、なぜそんなことをするのか想像もつきません。
アプローチ5:v$pdbsビューのCLOUD_IDENTITYカラムをチェック
幸いなことに、SQLを使用してAutonomous Database上で動作しているかどうかを確認する100%信頼できる方法があります。
SQL> select cloud_identityfrom 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_identityfrom 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)のサービスを提供しています。
-- ADWSQL> select count(*) from cdb_services where name like '%.adb.oraclecloud.com'; COUNT(*)---------- 3-- ATPSQL> 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 ONSQL> 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を使って取得することができます。
その他の情報

コメント
コメントを投稿