#■この記事で記載すること
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用のクレデンシャルの登録
ウォレットファイル格納用ディレクトリ・オブジェクトの作成
CREATE DIRECTORY ADB_DBLINK_DIR AS 'ADB_DBLINK_DIR';
ウォレットファイルをディレクトリ・オブジェクトにとりこみ
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;
/
データベースリンクのためのクレデンシャルの作成
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 |
- データベース・リンクを作成
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)で作成
CREATE TABLE customer
AS
SELECT * FROM SH.CUSTOMERS@ADB_DBLINK;
SELECT COUNT(*) FROM CUSTOMER;
55500
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経由に更新
― 中継サーバ、ターゲットDB(ADB2)のFirewallの更新
中継サーバのFirewall(VCN/Public subnetのセキュリティリスト)を変更
ADB1から中継サーバへの信を許可するイングレスルールを追加
ADB2のFirewall(VCN/Private subnetのセキュリティリスト)を変更
中継サーバからADB2への通信を許可するイングレスルールを追加
###- 中継サーバのデプロイ
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のクリア
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の作成
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