CDB構成でPDB間のDBLINKを作成する方法

CDB/PDB(マルチテナント)

OracleのCDB(Container Database)構成では、PDB(Pluggable Database)間でデータ連携を行うにはDBLINK(データベースリンク)の利用が便利です。

本記事では、PDB01からPDB02へDBLINKを作成し、テーブルを参照する方法を、tnsnames.ora の作成から順を追って丁寧に解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


■ 0. tnsnames.ora の作成

DBLINK作成にはTNS名が必要です。まず、$ORACLE_HOME/network/admin/tnsnames.ora に以下の設定を追記します。

# PDB01 への接続定義
PDB01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB01)
)
)

# PDB02 への接続定義
PDB02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB02)
)
)

🔍 HOSTSERVICE_NAME は実環境に合わせて設定してください。
ローカル環境であれば localhost、ポートは通常 1521 です。

設定後、接続確認を行います:

$ tnsping PDB01
$ tnsping PDB02

■ 構成イメージ(テキスト図)

[CDB$ROOT]

├── [PDB01] ── user1(DBLINK作成・使用)
│ │
│ └── dblink_to_pdb02(→ PDB02 へ接続)

└── [PDB02] ── user2(接続先)

└── employees表(PDB01から参照)

■ 1. PDB構成確認

SQL> show pdbs;

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
4 PDB02 READ WRITE NO

■ 2. PDB02に接続先ユーザーとテーブルを作成

-- PDB02に接続
SQL> ALTER SESSION SET CONTAINER = PDB02;

-- ユーザー作成
SQL> CREATE USER user2 IDENTIFIED BY password;

-- 必要な権限と表領域使用権限を付与
SQL> GRANT CONNECT, CREATE TABLE TO user2;
SQL> ALTER USER user2 QUOTA UNLIMITED ON USERS;

◉ user2でログイン → テーブル作成とデータ挿入

-- user2でログイン
SQL> CONNECT user2/password@PDB02

-- テーブル作成
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100)
);

-- データ挿入
INSERT INTO employees VALUES (1, '佐藤太郎');
INSERT INTO employees VALUES (2, '鈴木花子');
COMMIT;

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


■ 3. PDB01でDBLINK用ユーザーを作成

-- PDB01に接続
SQL> ALTER SESSION SET CONTAINER = PDB01;

-- ユーザー作成
SQL> CREATE USER user1 IDENTIFIED BY password;

-- DBLINK作成用権限を付与
SQL> GRANT CONNECT, CREATE DATABASE LINK TO user1;

■ 4. user1でDBLINKを作成してPDB02を参照

-- user1でログイン
SQL> CONNECT user1/password@PDB01

-- DBLINK作成(PDB02へ接続)
CREATE DATABASE LINK dblink_to_pdb02
CONNECT TO user2 IDENTIFIED BY password
USING 'PDB02';

-- DBLINK経由でデータ参照
SELECT * FROM employees@dblink_to_pdb02;

-- 実行結果
EMP_ID | EMP_NAME
-------+----------
1 | 佐藤太郎
2 | 鈴木花子
【DBLINK の使用例】

[oracle@v19single ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora ★tnsnames.ora 作成
[oracle@v19single ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
PDB01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB01)
)
)

PDB02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB02)
)
)
[oracle@v19single ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 26 11:45:41 2025
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle. All rights reserved.



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
4 PDB02 READ WRITE NO
SQL> ALTER SESSION SET CONTAINER = PDB02; ★PDB02 に接続

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
PDB02
SQL> CREATE USER user2 IDENTIFIED BY password; ★ユーザー作成

ユーザーが作成されました。

SQL> GRANT CONNECT, CREATE TABLE TO user2;

権限付与が成功しました。

SQL> ALTER USER user2 QUOTA UNLIMITED ON USERS;

ユーザーが変更されました。

SQL> CONNECT user2/password@PDB02
接続されました。
SQL> CREATE TABLE employees ( ★テーブル作成
2 emp_id NUMBER PRIMARY KEY,
3 emp_name VARCHAR2(100)
4 );

SQL> INSERT INTO employees VALUES (1, '佐藤太郎');

1行が作成されました。

SQL> INSERT INTO employees VALUES (2, '鈴木花子');

1行が作成されました。

SQL> set lin 1000 pages 1000
SQL> col emp_name for a20
SQL> SELECT * FROM employees;

EMP_ID EMP_NAME
---------- --------------------
1 佐藤太郎
2 鈴木花子

SQL> commit;

コミットが完了しました。

SQL> CONNECT / as sysdba
接続されました。
SQL> ALTER SESSION SET CONTAINER = PDB01; ★PDB01 へ接続

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
PDB01
SQL> CREATE USER user1 IDENTIFIED BY password; ★ユーザー作成

ユーザーが作成されました。

SQL> GRANT CONNECT, CREATE DATABASE LINK TO user1;

権限付与が成功しました。

SQL> CREATE DATABASE LINK dblink_to_pdb02 ★DBLINK 作成
2 CONNECT TO user2 IDENTIFIED BY password
3 USING 'PDB02';

データベース・リンクが作成されました。

SQL> SELECT * FROM employees@dblink_to_pdb02; ★PDB02 に作成したテーブルを select

EMP_ID EMP_NAME
---------- --------------------
1 佐藤太郎
2 鈴木花子

■ 補足・注意点

項目
DBLINKはCDB$ROOTではなくPDBで作成する必要あり
tnsnames.ora の設定は必須(TNS名が必要)
表領域エラー(ORA-01950)は QUOTA UNLIMITED で対応
本記事では PRIVATE DBLINK(ユーザー専用)を使用

■ まとめ

  • PDB間のデータ参照にはDBLINKを使うことで柔軟に連携できる
  • TNS構成(tnsnames.ora)が最重要ポイント
  • 表領域の使用権限忘れがエラーの原因になるので注意


[参考]
SQL言語リファレンス – CREATE DATABASE LINK

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました