Autononomous Database：RACを構成する複数ノードを指定してDBリンクを作成できるようになったので試してみた

# はじめに

Autonomous DatabaseからRAC構成のOracle Databaseに対してデータベース・リンク（DBリンク）を作成する際、従来はRAC内の特定の1つのノードを指定してDBリンクを作成する必要がありましたが、今回の機能強化で、RACを構成する複数のノードを指定してDBリンクが作成できるようになりました。
これにより、RAC構成のOracle Databaseに対するDBリンクを使用する際、Oracle RACの高可用性を活用することができるようになりました。

ということで、早速試してみました。
今回の検証は、同じサブネット上にRAC構成のBase DBとAutonomous Databaseのプライベート・エンドポイントを配置し、相互に通信できるようにセキュリティ・リストの設定を行った上で実施しました。

# 1. DBリンクで使用するクレデンシャルの作成

SQL*PlusからadminユーザとしてAutonomous Databaseに接続します。
```
[opc@client ~]$ sqlplus admin/Demo#1Demo#1@adb

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Dec 13 05:47:16 2023
Version 21.12.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Tue Dec 12 2023 07:37:46 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> 
```
DBリンクで使用するクレデンシャルを作成します。
usernameにはDBリンク経由で接続するDBユーザ名、passwordにはそのDBユーザのパスワードを指定します。
```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_CREDENTIAL(
  3          credential_name => 'RAC_DB_LINK_CRED',
  4          username => 'HR',
  5          password => 'Demo#1Demo#1');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> 
```

# 2.RAC構成のOracle Databaseに対するデータベース・リンクの作成

RAC構成のデータベースに対するDBリンクを作成します。

従来は以下のような形で、単一のノードのみが指定可能でした。

```
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
         db_link_name => 'PRIVATE_ENDPOINT_LINK', 
         hostname => 'exampleHostname',
         port => '1522',
         service_name => 'exampleServiceName',
         ssl_server_cert_dn => NULL,
         credential_name => 'PRIVATE_ENDPOINT_CRED',
         directory_name => NULL,
         private_target => TRUE);
END;
/
```
今回のアップデートで、以下のように、パラメータrac_hostnamesにRACを構成する複数のノードを指定できるようになりました。
```
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
         db_link_name => 'PRIVATE_ENDPOINT_LINK', 
         rac_hostnames => '["sales1-svr1.example.adb.us-ashburn-1.oraclecloud.com", 
                            "sales1-svr2.example.adb.us-ashburn-1.oraclecloud.com", 
                            "sales1-svr3.example.adb.us-ashburn-1.oraclecloud.com"]', 
         port => '1522',
         service_name => 'exampleServiceName',
         ssl_server_cert_dn => NULL,
         credential_name => 'PRIVATE_ENDPOINT_CRED',
         directory_name => NULL,
         private_target => TRUE);
END;
/
```


今回は2ノードRAC構成のBase DBを用意し、そちらのPDB（PDB1）をターゲットとしました。
パラメータrac_hostnamesにRACを構成する各ノードのホスト名（rac19c1.mypublicsubnet.myvcn.oraclevcn.com、rac19c2.mypublicsubnet.myvcn.oraclevcn.com）を記述します。
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
  3          db_link_name => 'RAC_DB_LINK',
  4          rac_hostnames => '["rac19c1.mypublicsubnet.myvcn.oraclevcn.com",
  5                             "rac19c2.mypublicsubnet.myvcn.oraclevcn.com"]',
  6          port => '1521',
  7          service_name => 'pdb1.mypublicsubnet.myvcn.oraclevcn.com',
  8          ssl_server_cert_dn => NULL,
  9          credential_name => 'RAC_DB_LINK_CRED',
 10          directory_name => NULL,
 11          private_target => TRUE);
 12  END;
 13  /

PL/SQL procedure successfully completed.

SQL> 
```
SQL*Plusを終了します。
```
SQL> exit          
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
[opc@client ~]$
```

# 3. 動作確認
まずは、RACを構成する両方のノードが使用可能で、インスタンスが起動している状態での動作を確認します。
![スクリーンショット 2023-12-13 18.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9f3730c6-e157-058a-cf43-4e32a9d5ae99.png)

SQL*PlusからAutonomous Databaseに接続し、DBリンク経由で検索を実行してみます。
```
[opc@client ~]$ sqlplus admin/Demo#1Demo#1@adb

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Dec 13 10:00:12 2023
Version 21.12.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Dec 13 2023 09:44:38 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> SELECT COUNT(*) FROM employees@RAC_DB_LINK;

  COUNT(*)
----------
       107

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
[opc@client ~]$
```
問題なく結果が返ってきました。

次に、ノード1（rac19c1）を停止して、同様にDBリンク経由で検索を実行してみます。
![スクリーンショット 2023-12-13 18.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ff90ea76-c462-b1e5-ed1a-9a8596111a7d.png)

```
[opc@client ~]$ sqlplus admin/Demo#1Demo#1@adb

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Dec 13 10:05:01 2023
Version 21.12.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Dec 13 2023 10:00:12 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> SELECT COUNT(*) FROM employees@RAC_DB_LINK_VIP;

  COUNT(*)
----------
       107

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
[opc@client ~]$
```
今度は、ノード2（rac19c2）を停止して、同様にDBリンク経由で検索を実行してみます。
![スクリーンショット 2023-12-13 18.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2c1b8dae-25e4-2d7f-7a9e-7573e1a0a43b.png)

```
[opc@client ~]$ sqlplus admin/Demo#1Demo#1@adb

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Dec 13 10:20:12 2023
Version 21.12.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Dec 13 2023 10:05:01 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> SELECT COUNT(*) FROM employees@RAC_DB_LINK;

  COUNT(*)
----------
       107

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
[opc@client ~]$
```
こちらも問題なく結果が返ってきました。

以上で、RACを構成する複数のノードを指定してDBリンクが作成できるようになり、
Autonomous DatabaseからRAC構成のOracle Databaseに対するDBリンクを使用する際にOracle RACの高可用性を活用できるようになったことが確認できました。

# 参考情報
・[Create Database Links to Oracle Databases on a Private Endpoint without a Wallet](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-database-links-target-oracle-db.html#GUID-67B611A2-2866-49F2-A580-0D6A6EE83A04)