【Oracle Database 19c】マルチテナント・アーキテクチャ PDB作成

Database

前回勉強用に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の用途や冗長構成についてしっかりと設計しないといけないと感じました。