前回勉強用にOracle環境の構築を行いました。
その構築した環境を利用してマルチテナントアーキテクチャのデータベースを構築します。
マルチテナント・アーキテクチャとは
Oracle Database独自のコンテナ技術になります。
マルチテナントアーキテクチャはCDB(コンテナデータベース)が必須であり、CDBを利用することで複数のDBを集中管理できる構成になります。
今までのマルチテナント(コンテナ)ではないDBは非CDBと呼ばれています。
非CDBは21c以降で廃止されるため、Oracle Databaseを構築する上でマルチテナントアーキテクチャは避けて通れなくなります。
PDB(プラガブルデータベース)実装概要
CDBは管理用のDBのため、データファイルを格納するのはPDB(プラガブルデータベース)になります。
CDBを作成するとCDBルートとシードPDBの2つが自動で作成されます。
CDBルートは管理用のコンテナ、シードPDBはPDBのテンプレートです。
今回は最もシンプルな構成である下記を作成します。
・CDBルート (CDB$ROOT)
・シードPDB (PDB$SEED)
・PDB (PDB1)
CDBルート及びシードPDBは既に作成されているのでPDBのみ構築します。
PDBの作成はシードPDBをコピーして「PDB1」を作成します。

PDB(プラガブルデータベース)実装
SQL*Plusに接続します。
CREATE PLUGGABLE DATABASE文を使うため、SYSDBAシステム権限を持つsysユーザで接続します。
[root@DockerBuild Oracle]# docker compose exec db sqlplus sys/Oracle123@ORCLCDB as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 20 09:45:12 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
show con_nameコマンドで現在接続しているコンテナを確認します。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
Oracleのデータファイルの格納場所を確認します。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/system01.dbf
/opt/oracle/oradata/ORCLCDB/sysaux01.dbf
/opt/oracle/oradata/ORCLCDB/undotbs01.dbf
/opt/oracle/oradata/ORCLCDB/users01.dbf
PDBのデータファイルを格納するディレクトリを作成します。
SQL> host mkdir /opt/oracle/oradata/ORCLCDB/pdb1
CREATE PLUGGABLE DATABASE文に「FILE_NAME_CONVERT」を指定することでPDBシードからPDBを作成します。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY Oracle123
2 FILE_NAME_CONVERT = ('/opt/oracle/oradata/ORCLCDB/pdbseed/','/opt/oracle/oradata/ORCLCDB/pdb1/');
Pluggable database created.
show pdbsコマンドでPDBの状態がMOUNTEDになっていること確認します。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORACLE123 READ WRITE NO
4 PDB1 MOUNTED
ALTER PLUGGABLE DATABASE文でPDBをOPENします。
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;
Pluggable database altered.
再度show pdbsでREAD WRITEになっていることを確認します。
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORACLE123 READ WRITE NO
4 PDB1 READ WRITE NO
接続先のセッションをPDB1に切り替えます。
SQL> ALTER SESSION SET CONTAINER=PDB1;
テーブル作成
試しにPDBでテーブルを作成します。
SQL> CREATE TABLE test_table
2 (
3 id NUMBER GENERATED ALWAYS AS IDENTITY,
4 Name VARCHAR2(10),
5 Org VARCHAR2(50),
6 Dt DATE,
7 CONSTRAINT pk1 PRIMARY KEY(id)
8 );
Table created.
DESCRIBEコマンドでテーブル定義を確認します。
SQL> desc test_table
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NAME VARCHAR2(10)
ORG VARCHAR2(50)
DT DATE
INSERT文でデータを挿入します。
SQL> INSERT INTO test_table values(DEFAULT, 'Tama', 'TamayaLab', TO_DATE('2025-03-01','YYYY-MM-DD'));
1 row created.
SELECT文でテーブル内データを確認します。
SQL> col ORG format A20
SQL> select * from test_table;
ID NAME ORG DT
---------- ---------- -------------------- ---------
1 Tama TamayaLab 01-MAR-25
最後に
Dockerとマルチテナントアーキテクチャの組み合わせでDBを作成するとポートフォワーディングやリソース管理が煩雑になりそうだなと思いました。
ここからRAC構成など考えていくと頭を抱えたくなりますね。
DBの用途や冗長構成についてしっかりと設計しないといけないと感じました。