[OCI]RDS for Oracle からAutonomous Databaseに対してデータベース・リンクを作成してデータを参照する手順を検証してみた

# はじめに
こちらのマニュアルに記載があるように、Autonomous Databaseに対してデータベース・リンクを作成する際には、データベース・リンクを作成するデータベースにAutonomous Databaseのウォレット・ファイルを配置し、CREATE DATABASE LINK文のUSING句で使用する接続文字列でウォレットのディレクトリ・パスを指定する必要があります。

https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/database-links-inbound.html#GUID-EB369724-29CE-452E-8EC1-2E0B33AE0A49


今回は、ウォレットファイルを使用してRDS for OracleのDBインスタンスからAutonomous Databaseに対するデータベース・リンクを作成する手順を検証してみました。
（こちらの内容はあくまで検証ですので、この内容をもとにした問合せ等はご遠慮ください。）

※この記事とは逆に、Autonomous DatabaseからRDS for Oracleに対するデータベース・リンクを作成する手順の検証に関する記事はこちらです。

https://qiita.com/500InternalServerError/items/c2d5734ec01a1176500f


# 1. Autonomous Databaseのウォレットの取得
OCIコンソールでAutonomous Databaseの詳細画面にアクセスし、「データベース接続」をクリックします。
![スクリーンショット 2023-10-25 11.36.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9df168cf-50f4-7acf-6430-bf8972e24098.png)

ウォレット・タイプが「インスタンス・ウォレット」になっていることを確認し、「ウォレットのダウンロード」をクリックします。
![スクリーンショット 2023-10-25 11.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d457e59b-e4e5-5cb3-4c8a-a9df3bf971e1.png)

ダウンロードしたZIPファイルを解凍し、cwallet.ssoファイルが含まれていることを確認します。
![スクリーンショット 2023-10-25 11.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/885094be-1861-4b0d-5d72-e8fbaf4a25cf.png)

# 2. S3へのウォレットファイルのアップロード
AWSマネジメントコンソールでAmazon S3の「Buckets」の画面にアクセスし、「Create bucket」をクリックします。
![スクリーンショット 2023-10-25 11.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/dac5b7ba-e96d-64d2-47a4-605fc9b2f7ae.png)

バケット名を入力し、画面下部の「Create bucket」をクリックしてバケットを作成します。
ここでは、バケット名をadbwalletとしました。
![スクリーンショット 2023-10-25 11.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/61c83c91-dcf2-4769-484e-9d0a5c00140e.png)

バケットが作成されたら、「View details」をクリックして、バケットの詳細画面に移動します。
![スクリーンショット 2023-10-25 11.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cffa7e47-2ca9-4677-b4a4-9c0cd41fff63.png)

「Upload」をクリックします。
![スクリーンショット 2023-10-25 11.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/61bc4bbf-d33d-a60f-1e1c-b9a9d2062ee1.png)

「Add Files」をクリックします。
![スクリーンショット 2023-10-25 11.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/615a1a46-36f2-4cda-7e68-9c6f294b94fb.png)

先ほど確認した「cwallet.sso」ファイルを選択します。
![スクリーンショット 2023-10-25 11.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/45c7e50e-20d1-5aa1-5a53-a5c0c8284e1f.png)

cwallet.ssoがリストに表示されたことを確認し、画面下部の「Upload」をクリックします。
![スクリーンショット 2023-10-25 11.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6cece12b-9083-f9eb-9193-776688010859.png)

S3バケットにウォレットファイルcwallet.ssoがアップロードできました。
![スクリーンショット 2023-10-25 11.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/204d7e3a-92e7-feed-a1c5-6f501c15de5c.png)

# 3. RDS for Oracleへのウォレットファイルのダウンロード
こちらの手順に従って、RDS for OracleのDBインスタンスでAmazon S3統合を有効にします。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html


今回はあくまで検証目的のため、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](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/database-links-inbound.html#GUID-EB369724-29CE-452E-8EC1-2E0B33AE0A49)
・[Amazon S3 統合](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.html)
・[Oracle DB インスタンスのその他のタスクの実行](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.CommonDBATasks.Misc.html)