Autonomous Database間のDBLINKの自分用メモ


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

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

Oracle DatabaseのDBLINK自分用メモまとめページで記載した、DBLINKの基本接続の内容を前提としてます。必要に応じて参照ください。

■ADBからADBへのDBLINK接続(Public IPアドレスを利用)

● システム構成イメージ

ADB(ローカル)--[TCPS] --> ADB(リモート)

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

● システム構成説明

  • ADB(ローカル)とADB(リモート)を「指定されたIPおよびVCNからのセキュア・アクセスを許可」ネットワークアクセスで構成(Public IPアドレス構成) ※Public IPアドレス構成だが、ADB間の通信はインターネットを経由せずクラウド内通信となる
  • ADB(ローカル)とADB(リモート)をTPCS接続でDBLINK接続

● 設定例

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

- 前提

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

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

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

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

上記設定方法は、こちらを参照

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

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

ADB1
CREATE DIRECTORY ADB_DBLINK_DIR AS 'ADB_DBLINK_DIR';

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

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;
/

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

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
  • データベース・リンクを作成
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)で作成

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

SELECT COUNT(*) FROM CUSTOMER;

55500
ADB2
SELECT COUNT(*) FROM SH.CUSTOMERS;

55500

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

● システム構成イメージ

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

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

● システム構成説明

  • ADB(ローカル)とADB(リモート)を「仮想クラウド・ネットワーク」ネットワークアクセスで構成(Private IPアドレス構成)
  • 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へのアクセスのみを許可
  • ADBのネットワークを更新 ADB1/ADB2ともに、以下のとおりネットワークを更新

更新前

更新後

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

中継サーバのFirewall(VCN/Public subnetのセキュリティリスト)を変更
ADB1から中継サーバへの信を許可するイングレスルールを追加

ADB2のFirewall(VCN/Private subnetのセキュリティリスト)を変更
中継サーバからADB2への通信を許可するイングレスルールを追加

- 中継サーバのデプロイ

  • 「Oracle Cloud Developer Image」でコンピュートインスタンスを作成
  • ADB1のOutbound IPアドレスを確認
ADB1
SELECT cloud_identity FROM v$pdbs;
  • 中継サーバのport forwardingを設定

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

中継サーバ
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

設定内容の確認

中継サーバ
$ 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のクリア

ADB1
SQL> BEGIN
DBMS_CLOUD_ADMIN.DROP_DATABASE_LINK(
  db_link_name => 'ADB_DBLINK' );
END;
/
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の作成

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> SELECT COUNT(*) FROM SH.CUSTOMERS@ADB_DBLINK;

   COUNT(*)
___________
      55500