2022年2月21日月曜日

Autonomous Databaseを繋ぐデータベース・リンクを作成する

 Advanced Queueingのプロパゲーションを実装するために、Autonomous Databaseをデータベース・リンクで繋ぐ必要がありました。

以下、実施した作業を記録します。参照したマニュアルは以下になります。

共有Exadataインフラストラクチャ上のOracle Autonomous Databaseの使用

Autonomous DatabaseからOracle Databaseへのデータベース・リンクの作成

https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/database-links-oracledb.html#GUID-84FB6B85-D60D-4EDC-BB3C-6485B2E5DF4D

作業の前提になります。

データベース・リンクは東京リージョンのAlways FreeのAutonomous Transaction Processingに作成します。データベース・リンクの接続先はAshburnのAlways FreeのAutonomous Transaction Processingのインスタンスです。東京リージョンのインスタンスはAPEXDEV、AshburnのインスタンスはAPEXDEV2とします。双方共にAPEXワークスペースとしてAPEXDEVワークスペース・スキーマとしてAPEXDEVが作成済みとします。


接続先となるインスタンスから自動ログイン・ウォレットを取得する


今回の構成では接続先となるインスタンスはAshburnのAPEXDEV2です。OCIのコンソールから、作成済みのAutonomous Databaseの画面を開きます。

DB接続をクリックします。

開いたドロワーにて、ウォレット・タイプとしてインスタンス・ウォレットを選択し(デフォルト)、ウォレットのダウンロードを実行します。


ウォレット・ファイルへ設定するパスワードの入力が求められます。今回の用途ではパスワードが必要とされる操作は行わないので、とりあえず入力すれば十分です。

ダウンロードをクリックします。


Wallet_データベース名.zip、今回の例ではWallet_APEXDEV2.zipとしてウォレット・ファイルがダウンロードされます。

ダウンロードしたZIPファイルを展開し、cwallet.sso - 自動ログイン・ウォレットが含まれていることを確認します。

ファイルの展開に使用するコマンドの例です。

unzip -d Wallet_APEXDEV2 Wallet_APEXDEV2.zip

% unzip -d Wallet_APEXDEV2 Wallet_APEXDEV2.zip 

Archive:  Wallet_APEXDEV2.zip

  inflating: Wallet_APEXDEV2/README  

  inflating: Wallet_APEXDEV2/cwallet.sso  

  inflating: Wallet_APEXDEV2/tnsnames.ora  

  inflating: Wallet_APEXDEV2/truststore.jks  

  inflating: Wallet_APEXDEV2/ojdbc.properties  

  inflating: Wallet_APEXDEV2/sqlnet.ora  

  inflating: Wallet_APEXDEV2/ewallet.p12  

  inflating: Wallet_APEXDEV2/keystore.jks  

% 


以上でcwallet.sso - 自動ログイン・ウォレットを取り出すことができました。


接続元となるインスタンスに自動ログイン・ウォレットを取り込む



接続元となる東京リージョンのOCIコンソールに接続します。

cwallet.ssoをオブジェクト・ストレージにアップロードします。その後、オブジェクト・ストレージ上のcwallet.ssoをAutonomous Databaseのディレクトリ・オブジェクト(CREATE DIRECTORYで作成)の下に配置します。

ストレージオブジェクト・ストレージとアーカイブ・ストレージバケットを開きます。


cwallet.ssoをアップロードするバケットを作成します。Autonomous Databaseにcwallet.ssoをダウンロードした後に削除する予定です。

バケットの作成をクリックします。


一時的な利用なので、バケットの設定はデフォルトのまま変更せず、作成を実行します。


作成したバケットを開きます。


リソースオブジェクトを開き、アップロードを実行します。


コンピュータからファイルを選択に、先ほどダウンロードしたcwallet.ssoを指定します。アップロードを実行します。


ファイルのアップロードが終了すると、ボタンが閉じるに変ります。閉じるをクリックします。


cwallet.ssoがアップロードされます。右端にある操作メニューを開き、事前承認済リクエストの作成を実行します。


事前承認済リクエスト・ターゲットオブジェクトアクセス・タイプオブジェクトの読取りを許可有効期限はデフォルトで7日後になっているので、日付を本日付けに変更した上で時刻に30分から1時間程度加えます

OCIコンソールにてグループやポリシーの設定を行うことにより、オブジェクト・ストレージからcwallet.ssoをダウンロードする許可を与えることもできます。

cwallet.ssoはDBMS_CLOUD.GET_OBJECTを呼び出してAutonomous Databaseにダウンロードするまでオブジェクト・ストレージ上に載っていればよく、すぐに作業は終了するため、事前承認済リクエストを使うことにしています。


生成された事前承認済リクエストのURLをコピーし、閉じるをクリックします。


接続元となるAutonomous Databaseのデータベース・アクションに、管理者ユーザーADMINで接続します。

以下のSQLを実行し、ディレクトリDBLINK_WALLET_APEXDEV2_DIRを作成します。AshburnのATPインスタンスAPEXDEV2へ接続するために使用するcwallet.ssoは、このディレクトリ以下に配置します。

create directory DBLINK_WALLET_APEXDEV2_DIR as 'wallet_apexdev2';


オブジェクト・ストレージよりcwallet.ssoをダウンロードします。DBMS_CLOUD.GET_OBJECTを呼び出します。

begin
dbms_cloud.get_object(
object_uri => 'https://事前承認済リクエストのURL/cwallet.sso'
,directory_name => 'DBLINK_WALLET_APEXDEV2_DIR'
);
end;


以下のSELECT文を実行し、ダウンロードされたファイルを確認します。DBMS_CLOUD.LIST_FILESを呼び出します。

select * from dbms_cloud.list_files('DBLINK_WALLET_APEXDEV2_DIR');


以上でデータベース・リンクの作成に必要な、cwallet.ssoの取り込みが完了しました。

作成したオブジェクト・ストレージのバケットおよびオブジェクト・ストレージ上のcwallet.ssoは不要なので、削除しておきます。



データベース・リンクを作成する



APEXのワークスペース・スキーマAPEXDEVにて、データベース・リンクの作成を行います。その作業が行えるように、スキーマAPEXDEVに必要な権限を与えます。

データベース・アクションで、管理者ユーザーADMINにて実行します。

grant read on directory DBLINK_WALLET_APEXDEV2_DIR to apexdev;
grant execute on dbms_cloud_admin to apexdev;
grant execute on dbms_cloud to apexdev;
grant create database link to apexdev;


接続先のユーザー名、パスワードを保持するクリデンシャルを、CRED_APEXDEV2_APEXDEVとして作成します。DBMS_CLOUD.CREATE_CREDENTIALを呼び出します。

APEXのSQLワークショップSQLコマンドより実行します。

begin
dbms_cloud.create_credential(
credential_name => 'CRED_APEXDEV2_APEXDEV'
, username => 'APEXDEV'
, password => 'パスワード'
);
end;


作成されたクリデンシャルを確認します。ビューUSER_CREDENTIALSを検索します。

select * from user_credentials;


データベース・リンクを作成するプロシージャDBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKを呼び出します。db_link_nameDBLINK_APEXDEV2とします。

引数として指定するhostnameportservice_namessl_server_cert_dnは展開したウォレット・ファイル(Wallet_データベース名.zip、今回の例ではWallet_APEXDEV2.zip)に含まれるtnsnames.oraの内容から取得します。

今回はAlways Freeのインスタンスが接続先なので、サービスとしてはLOWのみが有効です。そのため、apexdev2_lowのエントリに含まれる値を使います。

% cat tnsnames.ora 

apexdev2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=adbuniqueid_apexdev2_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))


apexdev2_low = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=adbuniqueid_apexdev2_low.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))


apexdev2_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=adbuniqueid_apexdev2_medium.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))


apexdev2_tp = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=adbuniqueid_apexdev2_tp.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))


apexdev2_tpurgent = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=adbuniqueid_apexdev2_tpurgent.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))


credential_nameは先ほど作成したCRED_APEXDEV2_APEXDEVdirectory_nameにはDBLINK_WALLET_APEXDEV2_DIRを指定します。

begin
dbms_cloud_admin.create_database_link(
db_link_name => 'DBLINK_APEXDEV2'
,hostname => 'adb.us-ashburn-1.oraclecloud.com'
,port => 1522
,service_name => 'adbuniqueid_apexdev2_low.adb.oraclecloud.com'
,ssl_server_cert_dn => 'CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US'
,credential_name => 'CRED_APEXDEV2_APEXDEV'
,directory_name => 'DBLINK_WALLET_APEXDEV2_DIR'
);
end;


プロシージャを実行すると、データベース・リンクが作成されます。

作成されたデータベース・リンクを確認します。ビューUSER_DB_LINKSを確認します。

select * from user_db_links;


作成したデータベース・リンクDBLINK_APEXDEV2を介したSELECT文を実行します。

select * from dual@dblink_apexdev2;

応答が帰って来れば(列DUMMYの値X)、データベース・リンクの作成は完了です。



クリーンアップ作業



データベース・リンクを削除するには、プロシージャDBMS_CLOUD_ADMIN.DROP_DATABASE_LINKを呼び出します。

begin
dbms_cloud_admin.drop_database_link(
db_link_name => 'DBLINK_APEXDEV2'
);
end;

クリデンシャルを削除するには、プロシージャDBMS_CLOUD.DROP_CREDENTIALを呼び出します。

begin
dbms_cloud.drop_credential(
credential_name => 'CRED_APEXDEV2_APEXDEV'
);
end;

ディレクトリDBLINK_WALLET_APEXDEV2_DIRよりcwallet.ssoを削除するには、プロシージャDBMS_CLOUD.DELETE_FILEを呼び出します。


ディレクトリDBLINK_WALLET_APEXDEV2_DIRを削除しても、そのディレクトリに含まれるファイル(今回の場合cwallet.sso)は削除されません。確実にファイルを削除するには、ディレクトリを削除する前に、ファイルを削除しておく必要があります。

ディレクトリを削除するには、DROP DIRECTORYを実行します。

drop directory DBLINK_WALLET_APEXDEV2_DIR;


以上がクリーンアップ処理になります。


パブリック・データベース・リンクを作成する



APEXのワークスペース・スキーマではなく、管理ユーザーADMINでパブリック・データベース・リンクを作成する場合は、以下の手順に変ります。

以下の権限は不要になります。

grant read on directory DBLINK_WALLET_APEXDEV2_DIR to apexdev;
grant execute on dbms_cloud_admin to apexdev;
grant execute on dbms_cloud to apexdev;
grant create database link to apexdev;

データベース・アクションSQLより、作業を実施します。

最初に管理者ユーザーADMINにて、クリデンシャルCRED_APEXDEV2_APEXDEVを作成します。

begin
dbms_cloud.create_credential(
credential_name => 'CRED_APEXDEV2_APEXDEV'
, username => 'APEXDEV'
, password => 'パスワード'
);
end;


続いて、データベース・リンクDBLINK_APEXDEV2を作成します。引数public_linkTRUEを指定します。

begin
dbms_cloud_admin.create_database_link(
db_link_name => 'DBLINK_APEXDEV2'
,hostname => 'adb.us-ashburn-1.oraclecloud.com'
,port => 1522
,service_name => 'adbuniqueid_apexdev2_low.adb.oraclecloud.com'
,ssl_server_cert_dn => 'CN=adwc.uscom-east-1.oraclecloud.com, OU=Oracle BMCS US, O=Oracle Corporation, L=Redwood City, ST=California, C=US'
,credential_name => 'CRED_APEXDEV2_APEXDEV'
,directory_name => 'DBLINK_WALLET_APEXDEV2_DIR'
,public_link => TRUE
);
end;


パブリック・データベース・リンクの作成は以上で完了ですが、このままスキーマAPEXDEVよりアクセスすると、以下のエラーが発生します。

ORA-27476: "ADMIN"."CRED_APEXDEV2_APEXDEV"は存在しません


スキーマAPEXDEVよりデータベース・リンクDBLINK_APEXDEV2を利用可能にするために、クリデンシャルのEXECUTE権限を、スキーマAPEXDEVに与えます。

grant execute on CRED_APEXDEV2_APEXDEV to apexdev;


以上で、パブリック・データベース・リンクを利用できるようになります。

パブリック・データベース・リンクを削除する際にも、引数public_linkTRUEを与える必要があります。

begin
dbms_cloud_admin.drop_database_link(
db_link_name => 'DBLINK_APEXDEV2'
,public_link => TRUE
);
end;

Autonomous Database上でデータベース・リンクを作成する手順の紹介は以上になります。