はじめに
こちらのマニュアルに記載があるように、Autonomous Databaseに対してデータベース・リンクを作成する際には、データベース・リンクを作成するデータベースにAutonomous Databaseのウォレット・ファイルを配置し、CREATE DATABASE LINK文のUSING句で使用する接続文字列でウォレットのディレクトリ・パスを指定する必要があります。
今回は、ウォレットファイルを使用してRDS for OracleのDBインスタンスからAutonomous Databaseに対するデータベース・リンクを作成する手順を検証してみました。
(こちらの内容はあくまで検証ですので、この内容をもとにした問合せ等はご遠慮ください。)
※この記事とは逆に、Autonomous DatabaseからRDS for Oracleに対するデータベース・リンクを作成する手順の検証に関する記事はこちらです。
1. Autonomous Databaseのウォレットの取得
OCIコンソールでAutonomous Databaseの詳細画面にアクセスし、「データベース接続」をクリックします。

ウォレット・タイプが「インスタンス・ウォレット」になっていることを確認し、「ウォレットのダウンロード」をクリックします。

ダウンロードしたZIPファイルを解凍し、cwallet.ssoファイルが含まれていることを確認します。

2. S3へのウォレットファイルのアップロード
AWSマネジメントコンソールでAmazon S3の「Buckets」の画面にアクセスし、「Create bucket」をクリックします。

バケット名を入力し、画面下部の「Create bucket」をクリックしてバケットを作成します。
ここでは、バケット名をadbwalletとしました。

バケットが作成されたら、「View details」をクリックして、バケットの詳細画面に移動します。

先ほど確認した「cwallet.sso」ファイルを選択します。

cwallet.ssoがリストに表示されたことを確認し、画面下部の「Upload」をクリックします。

S3バケットにウォレットファイルcwallet.ssoがアップロードできました。

3. RDS for Oracleへのウォレットファイルのダウンロード
こちらの手順に従って、RDS for OracleのDBインスタンスでAmazon S3統合を有効にします。
今回はあくまで検証目的のため、RDS for OracleのadminユーザでAutonomous Databaseに対するデータベース・リンクを作成してみます。
SQL*Plusを使用して、adminユーザとしてRDS for Oracleのインスタンスに接続します。
[opc@tools ~]$ sqlplus 'admin/Demo#1Demo#1@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database-1.hogehogehoge.ap-northeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=orcl)))'
SQL*Plus: Release 19.0.0.0.0 - Production on 水 10月 25 12:20:42 2023
Version 19.16.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.20.0.0.0
に接続されました。
SQL>
rdsadmin.rdsadmin_util.create_directoryプロシージャを使用して、ディレクトリ・オブジェクトを作成します。
ここではディレクトリオブジェクトの名前をADBWALLETとしました。
SQL> exec rdsadmin.rdsadmin_util.create_directory('ADBWALLET');
PL/SQLプロシージャが正常に完了しました。
SQL>
rdsadmin.rdsadmin_s3_tasks.download_from_s3ファンクションを使用して、バケットadbwallet内にあるウォレットファイルcwallet.ssoをディレクトリADBWALLETにダウンロードします。
SQL> SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
2 p_bucket_name => 'adbwallet',
3 p_s3_prefix => 'cwallet.sso',
4 p_directory_name => 'ADBWALLET')
5 AS TASK_ID FROM DUAL;
TASK_ID
--------------------------------------------------------------------------------
1698204528159-653
SQL>
rdsadmin.rds_file_util.listdirファンクションを使用して、ディレクトリADBWALLETの内容を確認します。
SQL> SELECT * FROM TABLE (rdsadmin.rds_file_util.listdir(p_directory => 'ADBWALLET'));
FILENAME
--------------------------------------------------------------------------------
TYPE FILESIZE MTIME
---------- ---------- -------------------
01/
directory 4096 2023/10/25 03:34:18
cwallet.sso
file 5349 2023/10/25 03:34:18
SQL>
cwallet.ssoがADBWALLET内にあることが確認できました。
上記のような結果が出力された場合、cwallet.ssoのディレクトリ・パスは
/rdsdata/userdirs/01/
となります。
(/rdsdata/userdir/は固定値)
4. Autonomous Databaseに対するデータベース・リンクの作成
RDS for OracleのDBインスタンスの初期化パラメータglobal_namesがFALSEであることを確認します。
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL>
※RDS for Oracleでは初期化パラメータglobal_namesはデフォルトでOFFになっていました。
RDS for OracleからAutonomous Databaseへのデータベース・リンクを作成します。
ここでは、データベースリンクの名前をadb_linkとし、接続先のAutonomous DatabaseのDBユーザはadminとしました。
CREATE DATABASE LINK文のUSING句で指定する接続文字列は、最初にダウンロードしたウォレットの中にあるtnsnames.oraのエントリから作成します。
今回はLOWサービスの接続文字列
(description=
(retry_count=20)
(retry_delay=3)
(address=
(protocol=tcps)
(port=1522)
(host=adb.ap-tokyo-1.oraclecloud.com)
)
(connect_data=
(service_name=xxxxxxxxxxxxxxx_xxxxxxxx_low.adb.oraclecloud.com)
)
(security=(ssl_server_dn_match=yes))
)
をもとに、
(security=(ssl_server_dn_match=yes))
の部分を
(security=(MY_WALLET_DIRECTORY=/rdsdbdata/userdirs/01)(ssl_server_dn_match=yes))
のように変更し、MY_WALLET_DIRECTORYに3.で取得したcwallet.ssoファイルのディレクトリ・パスを設定します。
これにより、Autonomous Databaseに対してデータベース・リンクを使用して接続する際に、ディレクトリADBWALLETに格納されているウォレットファイルcwallet.ssoが使用されるようになります。
SQL> CREATE DATABASE LINK adb_link
2 CONNECT TO admin IDENTIFIED BY Demo#1Demo#1
3 USING '(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=jym1f5owgdmcult_freeatp_low.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/rdsdbdata/userdirs/01)(ssl_server_dn_match=yes)))';
データベース・リンクが作成されました。
SQL>
作成したデータベース・リンクadb_linkを使用して、Autonomous Database内のデータを参照してみます。
SQL> SELECT * FROM dept_ext@adb_link;
NAME CREATED_USER_ID
---------- ---------------
userA 1
userB 2
SQL>
Autonomous Database上のadminスキーマ内の表dept_extの内容がRDS for OracleのDBインスタンスから参照できました。
まとめ
RDS for OracleからAutonomous Databaseに対してデータベース・リンクを作成してデータを参照できることが確認できました。
今回はRDS for Oracle、Autonomous Databaseがいずれもパブリックエンドポイントを持つパターンでしたが、両方がプライベート・エンドポイント構成になっている場合でも、それぞれのサブネット間でネットワーク的に疎通でき、双方で名前解決が可能な状態であれば同様の手順でデータベース・リンクを作成可能と思われます。
参考資料
・Create Database Links from Other Databases to Autonomous Database
・Amazon S3 統合
・Oracle DB インスタンスのその他のタスクの実行

