私は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を使って取得することができます。
その他の情報
コメント
コメントを投稿