6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI】ADBからBaseDBへTCPSでDB Link接続する手順

6
Posted at

はじめに

Oracle Autonomous Database から Oracle Base Database Service 上の Oracle Database へ接続したい場合、Database Link を使うことで、ADB 側から BaseDB 側の表を参照できます。

本記事では、Autonomous Database から Base Database Service 19c へ TCPS / Wallet を使って Database Link 接続する手順をまとめます。

主な流れは以下です。

  1. Base Database Service を作成する
  2. BaseDB 側に接続用ユーザーと検証用表を作成する
  3. ADB から BaseDB へ到達できるようにネットワークを設定する
  4. BaseDB 側で TCPS リスナーと Wallet を設定する
  5. BaseDB 接続用の cwallet.sso を ADB に配置する
  6. ADB 側で Credential と Database Link を作成する
  7. DB Link 経由で疎通確認する

前提条件

この記事では、以下が準備済みであることを前提にします。

  • Autonomous Database が作成済みであること
  • Base Database Service を作成する VCN / Subnet が作成済みであること
  • ADB と BaseDB の両方に SQL 実行できる環境があること
  • BaseDB に SSH 接続できること
  • Object Storage に cwallet.sso を一時的にアップロードできること
  • ADB から Object Storage のオブジェクトを取得するための Credential があること

本記事では例として以下を使います。

項目
BaseDB バージョン Oracle Database 19c
BaseDB の PDB 名 PDB1
BaseDB 接続ユーザー ORA_APP
TCPS ポート 2484
DB Link 名 BASEDB19C_LINK
Wallet 用 ADB Directory BASEDB19C_WALLET_DIR
ADB 側 Credential 名 BASEDB19C_LINK_CRED

実際に作業する際は、IP アドレス、ホスト名、PDB サービス名、Object Storage の URI などを自分の環境に置き換えてください。

1. Base Database Service を作成する

OCI コンソールのナビゲーションメニューから、
Oracle AI Database > Oracle Base Database Service に移動します。

DBシステムの作成」をクリックします。

image.png

必要な項目を入力して、DB システムを作成します。

今回は例として、基本的にはデフォルト設定のまま、以下のような構成で作成します。

  • Oracle Database バージョン: 19c
  • Oracle Database ソフトウェア・エディション: Standard Edition
  • Subnet: Public Subnet
  • PDB 名: pdb1

image.png

設定例です。

項目 値の例
DBシステム名 DBSystem-2026043XXXX
コンパートメント 任意
Oracle Database ソフトウエア・エディション Standard Edition
ホスト名接頭辞 DB0430
データベース名 DB0430
PDB名 pdb1

作成できました。

image.png

BaseDB に SSH 接続します。

ssh -i <秘密鍵ファイルのパス> opc@<DB_SYSTEM_IP>
sudo su - oracle
sqlplus / as sysdba

IPアドレスは、ノードの中に記載されています。
image.png

2. BaseDB 側の準備

2-1. PDB に接続する

SQL*Plus で現在の接続先を確認します。

show con_name;
show pdbs;

CDB$ROOT と表示される場合は、PDB ではなく CDB ルートに接続しています。
DB Link でアクセスさせたい PDB に接続し直します。

alter session set container=PDB1;
show con_name;

PDB1 と表示されれば OK です。

2-2. 接続用ユーザーを作成する

BaseDB 側に、ADB から DB Link で接続するためのユーザーを作成します。

ここでは ORA_APP ユーザーを作成します。

CREATE USER ora_app IDENTIFIED BY "your_password"
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

必要な権限を付与します。

GRANT CREATE SESSION TO ora_app;
GRANT CREATE TABLE TO ora_app;
GRANT CREATE VIEW TO ora_app;
GRANT CREATE SEQUENCE TO ora_app;
GRANT CREATE PROCEDURE TO ora_app;

検証用に表を作成する場合は、ORA_APP で接続します。

conn ora_app/"your_password"@PDB1

2-3. 検証用テーブルを作成する

ADB から DB Link 経由で参照できることを確認するため、BaseDB 側に検証用テーブルを作成します。

CREATE TABLE ora_app.ORA_LAB_CUSTOMERS (
  C_CUSTKEY     NUMBER,
  C_NAME        VARCHAR2(100),
  C_NATIONKEY   NUMBER,
  C_MKTSEGMENT  VARCHAR2(50),
  C_ACCTBAL     NUMBER,
  RN            NUMBER
);

CREATE TABLE ORA_SALES_ORDER (
  ORDER_ID          NUMBER,
  C_CUSTKEY         NUMBER,
  ORDER_DATE        DATE,
  CHANNEL           VARCHAR2(20),
  PRODUCT_CATEGORY  VARCHAR2(30),
  ORDER_AMOUNT      NUMBER
);

CREATE TABLE ORA_MARKETING_TOUCH (
  TOUCH_ID         NUMBER,
  C_CUSTKEY        NUMBER,
  CAMPAIGN_NAME    VARCHAR2(100),
  SENT_DATE        DATE,
  OPENED_FLAG      CHAR(1),
  CLICKED_FLAG     CHAR(1),
  RESPONSE_STATUS  VARCHAR2(20)
);

CREATE TABLE ORA_SUPPORT_CASE (
  CASE_ID             NUMBER,
  C_CUSTKEY           NUMBER,
  OPENED_DATE         DATE,
  ISSUE_TYPE          VARCHAR2(30),
  PRIORITY            VARCHAR2(10),
  STATUS              VARCHAR2(10),
  SATISFACTION_SCORE  NUMBER
);

作成できました。

image.png

3. ADB から BaseDB へ接続できるようにする

3-1. ADB のアウトバウンド IP を確認する

ADB から BaseDB へ接続するため、まず ADB のアウトバウンド IP を確認します。

ADB に ADMIN で接続し、以下を実行します。

SELECT jt.ip AS adb_outbound_ip
FROM v$pdbs p,
     JSON_TABLE(
       p.cloud_identity,
       '$.OUTBOUND_IP_ADDRESS[*]'
       COLUMNS ip VARCHAR2(64) PATH '$'
     ) jt;

結果の例です。

ADB_OUTBOUND_IP
---------------
xxx.xxx.xxx.xxx

image.png

この IP アドレスを、BaseDB 側の Security List または NSG の許可ルールに使います。

3-2. BaseDB 側の NSG / Security List を変更する

BaseDB が所属する Public Subnet の Security List、または DB System に紐づいている NSG で、ADB からの TCPS 接続を許可します。

設定内容は以下です。

項目
方向 Ingress
ソース ADB のアウトバウンド IP /32
プロトコル TCP
宛先ポート 2484

例です。

Source: xxx.xxx.xxx.xxx/32
Protocol: TCP
Destination Port: 2484

4. BaseDB で TCPS を有効化する

ADB から BaseDB へ TCPS で Database Link 接続するために、BaseDB 側で TCPS リスナーと Wallet を設定します。

今回の考え方は以下です。

  • BaseDB 側に Server Wallet を作成する
  • ADB 側に渡すための Client Wallet を作成する
  • Server 証明書と Client 証明書を交換する
  • BaseDB の Listener / sqlnet に Server Wallet を設定する
  • ADB 側には Client Wallet の cwallet.sso を配置する

4-1. 現在の Listener 設定を確認する

BaseDB の OS にログインし、oracle ユーザーでリスナー状態を確認します。

lsnrctl status

TCPS がまだ有効でない場合は、TCPS のエンドポイントは表示されません。
最終的には以下のようなエンドポイントが見える状態を目指します。

(PROTOCOL=tcps)(HOST=db0430...)(PORT=2484)

4-2. TCPS 用 Wallet ディレクトリを作成する

BaseDB に SSH 接続します。

ssh opc@<DB_SYSTEM_IP>

root 権限で Wallet 用ディレクトリを作成します。

sudo mkdir -p /u01/app/oracle/tcps_wallet/server
sudo mkdir -p /u01/app/oracle/tcps_wallet/client
sudo mkdir -p /u01/app/oracle/tcps_wallet/certs

sudo chown -R oracle:oinstall /u01/app/oracle/tcps_wallet

Wallet の作成は oracle ユーザーで行います。

sudo su - oracle
whoami

作業用の変数を設定します。

export BASE=/u01/app/oracle/tcps_wallet

Wallet パスワードを入力します。
入力した値は画面には表示されません。

read -s -p "Wallet password: " WALLET_PWD

入力できているか確認します。

echo ${#WALLET_PWD}

数字が表示されれば OK です。

14

4-3. Server Wallet を作成する

BaseDB の Listener が使用する Server Wallet を作成します。

orapki wallet create \
  -wallet $BASE/server \
  -pwd "$WALLET_PWD" \
  -auto_login

成功すると、以下のようなメッセージが表示されます。

Operation is successfully completed.

次に、Server Wallet に自己署名証明書を作成します。

orapki wallet add \
  -wallet $BASE/server \
  -pwd "$WALLET_PWD" \
  -dn "CN=db0430" \
  -keysize 2048 \
  -self_signed \
  -validity 3650 \
  -sign_alg sha256

ここで指定した DN は、後で ADB 側の DB Link 作成時に使います。

CN=db0430

DB Link 作成時の ssl_server_cert_dn と一致させる必要があります。

4-4. Client Wallet を作成する

Client Wallet は、ADB 側に渡すための Wallet です。

orapki wallet create \
  -wallet $BASE/client \
  -pwd "$WALLET_PWD" \
  -auto_login

Client Wallet にも証明書を作成します。

orapki wallet add \
  -wallet $BASE/client \
  -pwd "$WALLET_PWD" \
  -dn "CN=adb-client" \
  -keysize 2048 \
  -self_signed \
  -validity 3650 \
  -sign_alg sha256

CN=adb-client は、ADB 側クライアント用の証明書名として使っています。

4-5. Server 証明書と Client 証明書を交換する

TCPS / mTLS では、BaseDB 側と ADB 側が互いを信頼できる必要があります。

そのため、以下を行います。

  • Server Wallet に Client 証明書を登録する
  • Client Wallet に Server 証明書を登録する

まず、Server 証明書をファイルに出力します。

orapki wallet export \
  -wallet $BASE/server \
  -pwd "$WALLET_PWD" \
  -dn "CN=db0430" \
  -cert $BASE/certs/server.crt

次に、Client 証明書をファイルに出力します。

orapki wallet export \
  -wallet $BASE/client \
  -pwd "$WALLET_PWD" \
  -dn "CN=adb-client" \
  -cert $BASE/certs/client.crt

Client 証明書を Server Wallet に登録します。

orapki wallet add \
  -wallet $BASE/server \
  -pwd "$WALLET_PWD" \
  -trusted_cert \
  -cert $BASE/certs/client.crt

Server 証明書を Client Wallet に登録します。

orapki wallet add \
  -wallet $BASE/client \
  -pwd "$WALLET_PWD" \
  -trusted_cert \
  -cert $BASE/certs/server.crt

4-6. Wallet を確認する

Server Wallet を確認します。

orapki wallet display \
  -wallet $BASE/server \
  -pwd "$WALLET_PWD"

Client Wallet を確認します。

orapki wallet display \
  -wallet $BASE/client \
  -pwd "$WALLET_PWD"

User CertificatesTrusted Certificates が表示されれば OK です。

ADB に渡す cwallet.sso が作成されていることも確認します。

ls -l $BASE/client/cwallet.sso

BaseDB Listener が使用する Server Wallet も確認します。

ls -l $BASE/server

4-7. Wallet ファイルの権限を調整する

一度 oracle ユーザーから抜けて、root に戻ります。

exit

root で以下を実行します。

chown -R oracle:oinstall /u01/app/oracle/tcps_wallet

chmod 750 /u01/app/oracle/tcps_wallet
chmod 750 /u01/app/oracle/tcps_wallet/server
chmod 750 /u01/app/oracle/tcps_wallet/client

chmod 640 /u01/app/oracle/tcps_wallet/server/cwallet.sso
chmod 640 /u01/app/oracle/tcps_wallet/server/ewallet.p12
chmod 640 /u01/app/oracle/tcps_wallet/client/cwallet.sso
chmod 640 /u01/app/oracle/tcps_wallet/client/ewallet.p12

確認します。

ls -l /u01/app/oracle/tcps_wallet/server
ls -l /u01/app/oracle/tcps_wallet/client

4-8. Listener / sqlnet の設定ディレクトリを確認する

oracle ユーザーに戻ります。

su - oracle
echo $ORACLE_HOME

例です。

/u01/app/oracle/product/19.0.0.0/dbhome_1

この手順では、以降この場所を使います。

export OH=$ORACLE_HOME

Listener 設定ファイルがあるか確認します。

ls -l $OH/network/admin

以下のようなファイルがあるはずです。

listener.ora
sqlnet.ora
tnsnames.ora

TNS_ADMIN が設定されている場合は、そちらが優先されます。

echo $TNS_ADMIN

値が出る場合は、そのディレクトリを使ってください。

ls -l $TNS_ADMIN

以降、設定ディレクトリを変数に入れます。

if [ -n "$TNS_ADMIN" ]; then
  export NET_ADMIN=$TNS_ADMIN
else
  export NET_ADMIN=$ORACLE_HOME/network/admin
fi

echo $NET_ADMIN

期待される表示例です。

/u01/app/oracle/product/19.0.0/dbhome_1/network/admin

設定ファイルをバックアップします。

cp -p $NET_ADMIN/listener.ora $NET_ADMIN/listener.ora.bak.$(date +%Y%m%d_%H%M%S)
cp -p $NET_ADMIN/sqlnet.ora   $NET_ADMIN/sqlnet.ora.bak.$(date +%Y%m%d_%H%M%S)
cp -p $NET_ADMIN/tnsnames.ora $NET_ADMIN/tnsnames.ora.bak.$(date +%Y%m%d_%H%M%S)

バックアップできたか確認します。

ls -l $NET_ADMIN/*.bak.*

4-9. listener.ora に TCPS ポートと Wallet 設定を追加する

listener.ora を編集します。

vi $NET_ADMIN/listener.ora

既存の LISTENER = ... 定義を探し、TCPS の 2484 を追加します。

修正後の例です。

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db0430)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCPS)(HOST = db0430)(PORT = 2484))
    )
  )

次に、listener.ora の末尾に Wallet 設定を追加します。

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/tcps_wallet/server)))

ここで指定するのは、client ではなく、BaseDB の Listener が使う server wallet です。

/u01/app/oracle/tcps_wallet/server

4-10. sqlnet.ora に Wallet 設定を追加する

sqlnet.ora を編集します。

vi $NET_ADMIN/sqlnet.ora

末尾に以下を追加します。

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/tcps_wallet/server)))
SSL_CLIENT_AUTHENTICATION=TRUE
SSL_SERVER_DN_MATCH=ON

ここでも指定するのは、BaseDB 側の Server Wallet です。

/u01/app/oracle/tcps_wallet/server

4-11. listener.ora / sqlnet.ora の内容を確認する

編集ミスがないか確認します。

cat $NET_ADMIN/listener.ora

最低限、以下が含まれていることを確認してください。

(PROTOCOL = TCPS)(HOST = db0430)(PORT = 2484)

または、環境によっては以下のような指定でも構いません。

(PROTOCOL = TCPS)(HOST = 0.0.0.0)(PORT = 2484)

さらに、以下の Wallet ディレクトリが含まれていることを確認します。

DIRECTORY = /u01/app/oracle/tcps_wallet/server

sqlnet.ora も確認します。

cat $NET_ADMIN/sqlnet.ora

以下が含まれていれば OK です。

WALLET_LOCATION =
DIRECTORY = /u01/app/oracle/tcps_wallet/server
SSL_CLIENT_AUTHENTICATION = TRUE

4-12. Listener を再起動する

oracle ユーザーのまま実行します。

まず現在の状態を確認します。

lsnrctl status

Listener を停止します。

lsnrctl stop

Listener を起動します。

lsnrctl start

状態を確認します。

lsnrctl status

lsnrctl status の出力に、以下のような行があるか確認します。

(PROTOCOL=tcps)(HOST=...)(PORT=2484)

例です。

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db0430)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=db0430)(PORT=2484)))

OS 上でも確認できます。

ss -ltnp | grep 2484

権限が足りない場合は、root で確認します。

exit
sudo su -
ss -ltnp | grep 2484

以下のように 2484 が表示されれば OK です。

LISTEN ... :2484 ...

4-13. PDB サービス名を確認する

ADB の DB Link 作成時には、BaseDB の PDB サービス名 が必要です。

lsnrctl statusServices Summary から PDB のサービス名を探します。

例です。

Service "pdb1.subxxxxxxxxxx.vcn.oraclevcn.com" has 1 instance(s).

この場合、DB Link で使う service_name は以下です。

pdb1.sub01130750020.vcn.oraclevcn.com

CDB のサービスではなく、PDB のサービスを使ってください。

5. ADB に Client Wallet を配置する

5-1. BaseDB から cwallet.sso を取り出す

ADB に渡す Wallet ファイルは、Client Wallet 側の cwallet.sso です。

/u01/app/oracle/tcps_wallet/client/cwallet.sso

BaseDB 上で、opc ユーザーが取得できる場所にコピーします。

root で実行します。

sudo su -
cp /u01/app/oracle/tcps_wallet/client/cwallet.sso /home/opc/cwallet.sso
chown opc:opc /home/opc/cwallet.sso
chmod 600 /home/opc/cwallet.sso

自分の PC、または Cloud Shell から取得します。

scp -i <SSH秘密鍵ファイル> opc@<DB_SYSTEM_IP>:/home/opc/cwallet.sso .

5-2. cwallet.sso を Object Storage にアップロードする

取得した cwallet.sso を OCI Object Storage にアップロードします。

例です。

Bucket:
  adb-dblink-wallet

Object name:
  cwallet.sso

ファイル名は以下にします。

cwallet.sso

image.png

Object Storage 上の Wallet ファイルは、ADB に取り込むまでの一時配置として扱います。

cwallet.sso と DB ユーザー / パスワードの組み合わせでターゲット DB へアクセスできるため、共有範囲は最小限にしてください。

アップロードが終わったら、BaseDB 上の一時コピーは削除します。

rm /home/opc/cwallet.sso

5-3. ADB 側に Wallet 格納用ディレクトリを作成する

ここから ADB 側の作業です。

ADB に ADMIN で接続します。

BaseDB 19c 用の Wallet 専用ディレクトリを作成します。

CREATE OR REPLACE DIRECTORY BASEDB19C_WALLET_DIR AS 'basedb19c_wallet_dir';

確認します。

SELECT directory_name, directory_path
FROM all_directories
WHERE directory_name = 'BASEDB19C_WALLET_DIR';

image.png

ADB の DB Link では、1 つのディレクトリに有効な Wallet ファイルは 1 つだけです。
複数の cwallet.sso を使う場合は、Wallet ごとに別ディレクトリを作ります。

5-4. Object Storage から ADB に cwallet.sso を取り込む

Object Storage にアップロードした cwallet.sso を、ADB のディレクトリへ取り込みます。

Object URI の形式は以下です。

https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket>/o/cwallet.sso

大阪リージョンの例です。

https://objectstorage.ap-osaka-1.oraclecloud.com/n/<namespace>/b/adb-dblink-wallet/o/cwallet.sso

ADB で実行します。

BEGIN
  DBMS_CLOUD.GET_OBJECT(
    credential_name => 'OBJ_STORE_CRED',
    object_uri      => 'https://objectstorage.ap-osaka-1.oraclecloud.com/n/<namespace>/b/adb-dblink-wallet/o/cwallet.sso',
    directory_name  => 'BASEDB19C_WALLET_DIR'
  );
END;
/

<namespace><region><bucket> は自分の環境に置き換えてください。

取り込めたか確認します。

SELECT object_name, bytes
FROM DBMS_CLOUD.LIST_FILES('BASEDB19C_WALLET_DIR');

以下が表示されれば OK です。

cwallet.sso

Object Storage 用の Credential がまだない場合は、事前に作成しておきます。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OBJ_STORE_CRED',
    username        => '<OCIユーザー名>',
    password        => '<Auth Token>'
  );
END;
/

6. ADB 側で DB Link を作成する

6-1. BaseDB 接続用 Credential を作成する

ADB 側で、BaseDB の ORA_APP ユーザーへ接続するための Credential を作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'BASEDB19C_LINK_CRED',
    username        => 'ORA_APP',
    password        => 'your_password'
  );
END;
/

確認します。

SELECT credential_name, username
FROM user_credentials
WHERE credential_name = 'BASEDB19C_LINK_CRED';

image.png

6-2. BaseDB 側の SEC_CASE_SENSITIVE_LOGON を確認する

BaseDB 側で SEC_CASE_SENSITIVE_LOGON を確認します。

BaseDB に oracle ユーザーで入り、SQL*Plus を起動します。

sudo su - oracle
sqlplus / as sysdba

確認します。

SHOW PARAMETER sec_case_sensitive_logon;

TRUE なら OK です。

NAME                    TYPE    VALUE
----------------------- ------- -----
sec_case_sensitive_logon boolean TRUE

FALSE の場合は、以下を実行します。

ALTER SYSTEM SET sec_case_sensitive_logon=TRUE SCOPE=BOTH;

Autonomous Database 側では SEC_CASE_SENSITIVE_LOGON が TRUE で固定されているため、ターゲットの非 Autonomous Database 側でも TRUE にしておきます。
FALSE の場合、DB Link 接続時に ORA-28040 になることがあります。

6-3. Database Link を作成する

ADB に ADMIN で接続して実行します。

service_name は、BaseDB の lsnrctl status で確認した PDB サービス名に置き換えてください。

BEGIN
  DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
    db_link_name       => 'BASEDB19C_LINK',
    hostname           => '<BaseDBのIPアドレスまたはホスト名>',
    port               => 2484,
    service_name       => '<BaseDB 19cのPDBサービス名>',
    ssl_server_cert_dn => 'CN=db0430',
    credential_name    => 'BASEDB19C_LINK_CRED',
    directory_name     => 'BASEDB19C_WALLET_DIR'
  );
END;
/

例です。

BEGIN
  DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
    db_link_name       => 'BASEDB19C_LINK',
    hostname           => '138.XX.XX.XX',
    port               => 2484,
    service_name       => 'pdb1.sub01000000000.vcn.oraclevcn.com',
    ssl_server_cert_dn => 'CN=db0430',
    credential_name    => 'BASEDB19C_LINK_CRED',
    directory_name     => 'BASEDB19C_WALLET_DIR'
  );
END;
/

ssl_server_cert_dn は、Server Wallet 作成時に指定した DN と一致させます。

たとえば、Server 証明書を以下のように作った場合、

-dn "CN=db0430"

DB Link 側も以下にします。

ssl_server_cert_dn => 'CN=db0430'

7. DB Link の疎通確認をする

7-1. SELECT 1 で確認する

ADB 側で実行します。

SELECT 1
FROM dual@BASEDB19C_LINK;

以下のように返れば成功です。

         1
----------
         1

image.png


7-2. TCPS で接続できていることを確認する

ADB 側で以下を実行します。

SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS network_protocol
FROM dual@BASEDB19C_LINK;

期待値です。

NETWORK_PROTOCOL
----------------
tcps

7-3. BaseDB 側の表が見えるか確認する

ADB から BaseDB 側の表を参照します。

SELECT COUNT(*)
FROM ORA_APP.ORA_SALES_ORDER@BASEDB19C_LINK;

まだデータ投入前なら 0 件でも OK です。
ここでエラーにならず、件数が返ることが重要です。

image.png

BaseDB 側に作成した表の一覧を確認します。

SELECT owner, table_name
FROM all_tables@BASEDB19C_LINK
WHERE table_name LIKE 'ORA\_%' ESCAPE '\'
ORDER BY owner, table_name;

image.png


8. 任意: ADB から BaseDB にデータを投入する

ここまでで、ADB から BaseDB へ DB Link 経由で接続できるようになりました。

必要に応じて、ADB 側の表や外部表から BaseDB 側の表へデータを投入できます。

ここでは例として、DB Link 経由で BaseDB 側の ORA_LAB_CUSTOMERS に INSERT します。

8-1. DB Link 経由で BaseDB 側に INSERT する

ADB 側から、BaseDB 側の表へ INSERT します。

INSERT INTO ORA_APP.ORA_LAB_CUSTOMERS@BASEDB19C_LINK (
  C_CUSTKEY,
  C_NAME,
  C_NATIONKEY,
  C_MKTSEGMENT,
  C_ACCTBAL,
  RN
)
SELECT
  C_CUSTKEY,
  C_NAME,
  C_NATIONKEY,
  C_MKTSEGMENT,
  C_ACCTBAL,
  RN
FROM STG_ORA_LAB_CUSTOMERS;

COMMIT;

BaseDB 側にデータが入ったことを確認します。

SELECT COUNT(*)
FROM ORA_APP.ORA_LAB_CUSTOMERS@BASEDB19C_LINK;

9. よくある確認ポイント

ORA-12170 やタイムアウトになる

ADB から BaseDB の TCPS ポートに到達できていない可能性があります。

確認ポイントです。

  • BaseDB 側の Security List / NSG で ADB のアウトバウンド IP /32 を許可しているか
  • 宛先ポート 2484 を許可しているか
  • BaseDB の Listener が 2484 で待ち受けているか
  • BaseDB の Public IP またはホスト名が正しいか

BaseDB 側で以下を確認します。

lsnrctl status
ss -ltnp | grep 2484

ORA-12514 になる

DB Link 作成時の service_name が誤っている可能性があります。

lsnrctl statusServices Summary から、CDB ではなく PDB のサービス名を確認します。

lsnrctl status

例です。

Service "pdb1.subxxxxxxxxxx.vcn.oraclevcn.com" has 1 instance(s).

DB Link ではこの PDB サービス名を使います。

ORA-29024 など SSL 関連のエラーになる

Wallet や証明書 DN の指定が一致していない可能性があります。

確認ポイントです。

  • ADB に配置した cwallet.sso は Client Wallet のものか
  • BaseDB の Listener / sqlnet は Server Wallet を参照しているか
  • Server Wallet と Client Wallet で証明書交換をしているか
  • ssl_server_cert_dn が Server 証明書の DN と一致しているか

Server 証明書を以下で作った場合、

-dn "CN=db0430"

DB Link 側は以下にします。

ssl_server_cert_dn => 'CN=db0430'

ORA-01017 や ORA-28040 になる

BaseDB 接続用 Credential のユーザー名 / パスワード、または SEC_CASE_SENSITIVE_LOGON を確認します。

ADB 側の Credential を確認します。

SELECT credential_name, username
FROM user_credentials
WHERE credential_name = 'BASEDB19C_LINK_CRED';

BaseDB 側で確認します。

SHOW PARAMETER sec_case_sensitive_logon;

FALSE の場合は、必要に応じて以下を実行します。

ALTER SYSTEM SET sec_case_sensitive_logon=TRUE SCOPE=BOTH;

まとめ

この記事では、Autonomous Database から Base Database Service 19c へ TCPS で Database Link 接続する手順を整理しました。

ポイントは以下です。

  • ADB のアウトバウンド IP を BaseDB 側の Security List / NSG で許可する
  • BaseDB 側で TCPS リスナーを 2484 で有効化する
  • Server Wallet と Client Wallet を作成し、証明書を相互に登録する
  • ADB 側には Client Wallet の cwallet.sso を配置する
  • DB Link 作成時の ssl_server_cert_dn は Server 証明書の DN と一致させる
  • service_name には CDB ではなく PDB のサービス名を指定する

これで、ADB 側から以下のように BaseDB 側の表を参照できます。

SELECT COUNT(*)
FROM ORA_APP.ORA_SALES_ORDER@BASEDB19C_LINK;

また、必要に応じて ADB 側のデータを DB Link 経由で BaseDB 側へ INSERT することもできます。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?