Autonomous Database間のDBLINKの自分用メモ


#■この記事で記載すること

Autonomous Database（ADB）を用いた以下２つのパターンのDBLINK接続について、自分用メモとして記載します。
- ADBからADBへのDBLINK接続（Public IPアドレスを利用）
- ADBからADBへのDBLINK接続（VCN:Private IPアドレスを利用）

[Oracle DatabaseのDBLINK自分用メモまとめページ](https://qiita.com/TakuyaAma/items/c217a8445e99f3059214)で記載した、DBLINKの基本接続の内容を前提としてます。必要に応じて参照ください。

#■ADBからADBへのDBLINK接続（Public IPアドレスを利用）

##● システム構成イメージ

ADB（ローカル）--[TCPS] --> ADB（リモート）

※システム構成図に変更予定

##● システム構成説明

- ADB（ローカル）とADB（リモート）を「指定されたIPおよびVCNからのセキュア・アクセスを許可」ネットワークアクセスで構成(Public IPアドレス構成)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/67f78ec1-26f8-176d-0cfa-10ee4b6fb122.png)
※Public IPアドレス構成だが、ADB間の通信はインターネットを経由せずクラウド内通信となる
- ADB（ローカル）とADB（リモート）をTPCS接続でDBLINK接続

##● 設定例

- 前提
- ADB（ローカル）にADB（リモート）接続用ウォレットファイルを登録
- DBLINK用のクレデンシャルの登録
- DBLINK作成

###- 前提

ここでは、以下を前提として設定例を記載します。

- ADBが２つ作成されている
 - ローカル：ADB1
 - リモート：ADB2 
- Object Storage/Bucketが作成されている
 - ADB(リモート)接続用のウォレットファイルアップロード用Bucket（bucketA）
- bucketAへのクレデンシャルがADB1に登録されている



###- ADB1にADB2接続用ウォレットファイルを登録

- ターゲット（テーブルのコピー元）となるAutonomous Databaseのクライアント資格証明のダウンロード
- ダウンロードしたファイルを展開してcwallet.ssoをbucketにアップロード

上記設定方法は、[こちら](https://qiita.com/TakuyaAma/items/3b9f9a48b3b1ef9b2e8d#adb%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A)を参照

###- DBLINK用のクレデンシャルの登録

ウォレットファイル格納用ディレクトリ・オブジェクトの作成

```sql:ADB1
CREATE DIRECTORY ADB_DBLINK_DIR AS 'ADB_DBLINK_DIR';
```

ウォレットファイルをディレクトリ・オブジェクトにとりこみ

```sql:ADB1
BEGIN 
     DBMS_CLOUD.GET_OBJECT(
	credential_name => 'ADB1_OS_CRED',	
        object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/idqyzd41fwn7/b/bucketA/o/cwallet.sso',
        directory_name => 'ADB_DBLINK_DIR'); 
END;
/
```

データベースリンクのためのクレデンシャルの作成

```sql:ADB1
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'ADB_DBLINK_CRED',
    username => 'ADMIN',
    password => 'WelCome123#123#'
  );
END;
/
```

###- DBLINK作成

DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKプロシージャを使用して、DBリンクを作成

- 接続情報の収集
以下情報をADB-Dのウォレットファイル内のtnsnames.oraから収集

| 項目 | 情報 |
|:-|:-|
| hostname | adb.us-ashburn-1.oraclecloud.com |
| port | 1522 |
| service_name  | xxxxxxxxxxx_ADB2_medium.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 |

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

```sql:ADB1
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
          db_link_name => 'ADB_DBLINK', 
          hostname => 'adb.us-ashburn-1.oraclecloud.com', 
          port => '1522',
          service_name => 'xxxxxxxxxxxx_ADB2_medium.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 => 'ADB_DBLINK_CRED',
          directory_name => 'ADB_DBLINK_DIR');
END;
/
```

- 接続確認

ADB-DのTableをADB-SにDBLINK経由（CTAS）で作成

```sql:ADB1
CREATE TABLE customer
AS
SELECT * FROM SH.CUSTOMERS@ADB_DBLINK;

SELECT COUNT(*) FROM CUSTOMER;

55500
```

```sql:ADB2
SELECT COUNT(*) FROM SH.CUSTOMERS;

55500
```

#■ADBからADBへのDBLINK接続（VCN:Private IPアドレスを利用）

##● システム構成イメージ

ADB（ローカル）--[TCPS] --> 中継サーバ --[TCPS]--> ADB（リモート）

※システム構成図に変更予定

##● システム構成説明

- ADB（ローカル）とADB（リモート）を「仮想クラウド・ネットワーク」ネットワークアクセスで構成(Private IPアドレス構成)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/0843e349-b62e-18dd-5d33-9bda2c2a1803.png)
- ADB（ローカル）とADB（リモート）を中継サーバを介してTPCS接続でDBLINK接続

※ 2021/04/21現在では、ADB（ローカル）とADB（リモート）を「仮想クラウド・ネットワーク」ネットワークアクセスで構成(Private IPアドレス構成)する場合は、中継サーバ経由とする必要があり、将来的に、「Private IP Address同士でDBLINKを確立できる方法」が提供される予定
※ 本手順は一例で、上記中継サーバを経由する方法以外にもCMAN（Oracle Connection Manager）を用いる方法などがある

##● 設定例

※ 本設定例では、「ADBからADBへのDBLINK接続（Public IPアドレスを利用）」が完了していることを前提に設定を進めます。

- 前提
- ウォレットファイルの作成、配置
- 「ADBからADBへのDBLINK接続（Public IPアドレスを利用）」で作成したADBのネットワークアクセスをVCN経由に更新
- 中継サーバのデプロイ
- DBLINKの作成

###- 前提

ここでは、以下を前提として設定例を記載します。

- 以下の要素を持ったVCNが構成されている
 - Publicサブネット
 - Privateサブネット
 - Internet Gateway
 - NAT Gateway
- ADBが2ノードデプロイ済み

###- 「ADBからADBへのDBLINK接続（Public IPアドレスを利用）」で作成したADBのネットワークアクセスをVCN経由に更新

- NSG（Network Security Groups）の作成
VCN経由からADBへのアクセスのみを許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/f448110b-f5a9-9870-0432-3ac442b74288.png)
- ADBのネットワークを更新
ADB1/ADB2ともに、以下のとおりネットワークを更新

更新前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/849bfee8-0e6c-751c-33b1-45adb48588d3.png)
更新後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/b53a2a68-dd75-8b0a-bacc-0a0f693f1030.png)

― 中継サーバ、ターゲットDB（ADB2）のFirewallの更新

中継サーバのFirewall（VCN/Public subnetのセキュリティリスト）を変更
ADB1から中継サーバへの信を許可するイングレスルールを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/17002410-4c1b-2576-fb03-653173266bec.png)
ADB2のFirewall（VCN/Private subnetのセキュリティリスト）を変更
中継サーバからADB2への通信を許可するイングレスルールを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/3d280cf5-dbd0-5ae9-b81f-b767fb3d2207.png)

###- 中継サーバのデプロイ

- 「Oracle Cloud Developer Image」でコンピュートインスタンスを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/bdd305ad-539a-cb37-f286-be2454c734a2.png)
- ADB1のOutbound IPアドレスを確認

```sql:ADB1
SELECT cloud_identity FROM v$pdbs;
```

- 中継サーバのport forwardingを設定

上記で確認したIPアドレスとADB2のPrivate IPアドレスを用いてFirewallを設定

```bash:中継サーバ
sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address="(ADB1のOutbound IPアドレス)" forward-port to-addr="(ADB2のPrivate IPアドレス)" to-port="1522" protocol="tcp" port="1522"'
sudo firewall-cmd --add-masquerade
sudo firewall-cmd --runtime-to-permanent
```

設定内容の確認

```bash:中継サーバ
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="(ADB1のOutbound IPアドレス)" forward-port port="1522" protocol="tcp" to-port="1522" to-addr="10.0.1.173"
```

###- DBLINKの作成

既存DBLINKのクリア

```sql:ADB1
SQL> BEGIN
DBMS_CLOUD_ADMIN.DROP_DATABASE_LINK(
  db_link_name => 'ADB_DBLINK' );
END;
/
```
```SQL
SQL> SELECT COUNT(*) FROM SH.CUSTOMERS@ADB_DBLINK;

Error starting at line : 1 in command -
SELECT COUNT(*) FROM SH.CUSTOMERS@ADB_DBLINK
Error at Command Line : 1 Column : 35
Error report -
SQL Error: ORA-02019: connection description for remote database not found
02019. 00000 -  "connection description for remote database not found"
*Cause:
*Action:
```

DBLINKの作成

```sql:ADB1
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
          db_link_name => 'ADB_DBLINK', 
          hostname => '(中継サーバのPublic IPアドレス)', 
          port => '1522',
          service_name => 'xxxxxxxxxxxxx_ADB2_medium.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 => 'ADB_DBLINK_CRED',
          directory_name => 'ADB_DBLINK_DIR');
END;
/
```
```sql
SQL> SELECT COUNT(*) FROM SH.CUSTOMERS@ADB_DBLINK;

   COUNT(*)
___________
      55500
```