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 * 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;
引数として指定するhostname、port、service_name、ssl_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_APEXDEV、directory_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)、データベース・リンクの作成は完了です。
クリーンアップ作業
begin
dbms_cloud_admin.drop_database_link(
db_link_name => 'DBLINK_APEXDEV2'
);
end;
begin
dbms_cloud.drop_credential(
credential_name => 'CRED_APEXDEV2_APEXDEV'
);
end;
ディレクトリ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_linkにTRUEを指定します。
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_linkにTRUEを与える必要があります。
begin
dbms_cloud_admin.drop_database_link(
db_link_name => 'DBLINK_APEXDEV2'
,public_link => TRUE
);
end;
Autonomous Database上でデータベース・リンクを作成する手順の紹介は以上になります。
完