はじめに
Oracle Autonomous Database から Oracle Base Database Service 上の Oracle Database へ接続したい場合、Database Link を使うことで、ADB 側から BaseDB 側の表を参照できます。
本記事では、Autonomous Database から Base Database Service 19c へ TCPS / Wallet を使って Database Link 接続する手順をまとめます。
主な流れは以下です。
- Base Database Service を作成する
- BaseDB 側に接続用ユーザーと検証用表を作成する
- ADB から BaseDB へ到達できるようにネットワークを設定する
- BaseDB 側で TCPS リスナーと Wallet を設定する
- BaseDB 接続用の
cwallet.ssoを ADB に配置する - ADB 側で Credential と Database Link を作成する
- 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システムの作成」をクリックします。
必要な項目を入力して、DB システムを作成します。
今回は例として、基本的にはデフォルト設定のまま、以下のような構成で作成します。
- Oracle Database バージョン: 19c
- Oracle Database ソフトウェア・エディション: Standard Edition
- Subnet: Public Subnet
- PDB 名:
pdb1
設定例です。
| 項目 | 値の例 |
|---|---|
| DBシステム名 | DBSystem-2026043XXXX |
| コンパートメント | 任意 |
| Oracle Database ソフトウエア・エディション | Standard Edition |
| ホスト名接頭辞 | DB0430 |
| データベース名 | DB0430 |
| PDB名 | pdb1 |
作成できました。
BaseDB に SSH 接続します。
ssh -i <秘密鍵ファイルのパス> opc@<DB_SYSTEM_IP>
sudo su - oracle
sqlplus / as sysdba
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
);
作成できました。
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
この 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 Certificates や Trusted 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 status の Services 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
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';
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';
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
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 です。
ここでエラーにならず、件数が返ることが重要です。
BaseDB 側に作成した表の一覧を確認します。
SELECT owner, table_name
FROM all_tables@BASEDB19C_LINK
WHERE table_name LIKE 'ORA\_%' ESCAPE '\'
ORDER BY owner, table_name;
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 status の Services 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 することもできます。











