はじめに
Oracle DatabaseのCDB(コンテナデータベース)とPDB(プラガブルデータベース)の概要について説明し、それらがどのように活用されているかを、ユースケースを基にまとめています。
CDB/PDBの概要
まず、CDBとPDBの基本的な概念を確認し、企業での具体的な活用例を紹介します。
CDB/PDBの基本概要
- CDB(コンテナデータベース): 複数のPDBを格納する大きなコンテナの役割を果たすデータベース
- PDB(プラガブルデータベース): CDB内に格納される個別の小さなデータベース。各PDBは独立して動作し、CDBから切り離して移動できる柔軟性を持ちます
プラガブルとは「plug + available」の組み合わせで、電源プラグのように取り外し可能であることを意味します。CDBが大きな箱であり、PDBはその中に収まる個別の小さな箱です。
コンテナ側の方が大きいので、dockerなどでコンテナ使ってるインフラエンジニアからしたら、少し違和感ありますね。
項目 | CDB(コンテナデータベース) | PDB(プラガブルデータベース) |
---|---|---|
役割 | 複数のPDBを格納し、リソースを共有 | CDB内で独立して動作するデータベース |
主な用途 | 企業全体のデータベースインフラ管理 | 個別のアプリケーションやサービスごとのデータ管理 |
管理者 | CDB管理者が全体を管理 | PDB管理者が個別のPDBを管理 |
セキュリティ | グローバルセキュリティポリシーを適用 | PDBごとに個別のセキュリティ設定が可能 |
リソース管理 | リソースの効率的な共有と分配 | 各PDBが独立してリソースを消費 |
ユースケース: 大手飲食(プリン屋)店チェーンでの活用
企業背景:
- 大手飲食店チェーンは、全国に多数の店舗を展開し、各店舗で独自に運営されている
- オンライン予約、デリバリーサービス、社内の経理や人事の管理など、さまざまなビジネス機能がある
- これらの機能を効率的に管理し、リソースを最大限に活用するため、全社的なデータベースインフラの一元管理したい。(1つデータベースのみの管理だと運用コストもメリットある)
「プリンは栄養たっぷりん。言うてな!!!」
CDBによる管理:
- CDBの役割 : 企業全体のデータベースインフラを統括するために、1つのCDBを導入。このCDBには、共通のシステム設定、全社的なデータ、セキュリティポリシーが含まれる
PDBによる店舗ごとのデータ管理:
- PDBの役割 : 各店舗やサービスに対して個別のPDBを割り当て、そのPDB内で店舗固有のデータを管理。これにより、データの独立性が確保される
店舗ごとのPDBの作成
①東京店と大阪店用のPDBの作成
-- 東京店舗専用のPDBを作成するSQL
SQLCREATE PLUGGABLE DATABASE tokyo_store_pdb
ADMIN USER pdb_admin IDENTIFIED BY Welcome123
FILE_NAME_CONVERT = ('/u02/oradata/CDB1/pdbseed/', '/u02/oradata/CDB1/tokyo_store_pdb/');
-- 大阪店舗専用のPDBを作成する
CREATE PLUGGABLE DATABASE osaka_store_pdb
ADMIN USER pdb_admin IDENTIFIED BY Welcome123
FILE_NAME_CONVERT = ('/u02/oradata/CDB1/pdbseed/', '/u02/oradata/CDB1/osaka_store_pdb/');
このコマンド実行後に以下のようにPDBが作成されます。
・/u02/oradata/CDB1/osaka_store_pdb
・/u02/oradata/CDB1/tokyo_store_pdb
[oracle@ip-10-1-10-221 CDB1]$ pwd
/u02/oradata/CDB1
[oracle@ip-10-1-10-221 CDB1]$ ll
total 2677484
-rw-r-----. 1 oracle oinstall 18923520 Aug 11 06:16 control01.ctl
-rw-r-----. 1 oracle oinstall 18923520 Aug 11 06:16 control02.ctl
drwxr-x---. 2 oracle oinstall 6 Jul 7 09:36 onlinelog
drwxr-x---. 2 oracle oinstall 111 Aug 11 06:15 osaka_store_pdb ←ここ
drwxr-x---. 2 oracle oinstall 104 Feb 12 2021 pdb1
drwxr-x---. 2 oracle oinstall 111 Feb 12 2021 pdbseed
-rw-r--r--. 1 oracle oinstall 52429312 Aug 11 06:16 redo01.log
-rw-r--r--. 1 oracle oinstall 52429312 Aug 11 05:57 redo02.log
-rw-r--r--. 1 oracle oinstall 52429312 Aug 11 06:00 redo03.log
-rw-r-----. 1 oracle oinstall 880812032 Aug 11 06:12 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 1017126912 Aug 11 06:15 system01.dbf
-rw-r-----. 1 oracle oinstall 113254400 Aug 11 06:00 temp01.dbf
drwxr-x---. 2 oracle oinstall 111 Aug 11 06:11 tokyo_store_pdb ←ここ
-rw-r-----. 1 oracle oinstall 639639552 Aug 11 06:12 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 5251072 Aug 11 06:05 users01.dbf
[oracle@ip-10-1-10-221 CDB1]$
②それぞれのPDBのオープン
-- 東京PDBをオープンする
ALTER PLUGGABLE DATABASE tokyo_store_pdb OPEN;
-- 大阪PDBをオープンする
ALTER PLUGGABLE DATABASE osaka_store_pdb OPEN;
各PDBのセキュリティ確認
次に、各PDBでのセキュリティ設定を確認し、特定のユーザーが他のPDBにアクセスしようとした際に発生するエラーについて説明します。
最初の表に記載したセキュリティの箇所の実機確認です。
以下のSQLの手順で、tokyo_store_pdb に接続し、tokyo_user を作成しましす。tokyo_user には、CONNECT と RESOURCE の権限を付与します。
-- tokyo_store_pdbに接続
ALTER SESSION SET CONTAINER = tokyo_store_pdb;
-- 現在のPDB(データベース)を確認
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS CURRENT_PDB FROM DUAL;
-- 現在の接続ユーザーを確認
SELECT USER FROM DUAL;
-- 東京PDBでユーザーを作成
CREATE USER tokyo_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO tokyo_user;
次に、この tokyo_user が大阪のPDBである osaka_store_pdb にアクセスしようとすると、権限が不足しているためエラーが発生します。
-- 東京PDBに接続しているユーザーで大阪PDBにアクセスしようとする
ALTER SESSION SET CONTAINER = osaka_store_pdb;
エラー・レポート -
ORA-01031: 権限が不足しています
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without
the necessary privileges.
*Action: Ask your database administrator or designated security
administrator to grant you the necessary privileges
※SQL Developerの画面だと以下のようになります。
各PDBのリソース消費とAWRを活用したパフォーマンス確認
ここでは、AWR(Automatic Workload Repository)を活用して、各PDBのパフォーマンスを確認する手順を示します。今回は、ユーザ権限の設定を簡単にするため、sys ユーザを使用しています。
① 東京PDBのAWRスナップショット作成と確認
-- 東京PDBのAWRスナップショットを作成
ALTER SESSION SET CONTAINER = tokyo_store_pdb;
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
-- スナップショットIDを確認
SELECT SNAP_ID, DBID, INSTANCE_NUMBER, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME
FROM DBA_HIST_SNAPSHOT
ORDER BY DBID, SNAP_ID;
後続のレポート生成に必要な SNAP_ID, DBID, INSTANCE_NUMBER を取得しています。
SQL Developerだと以下のような画面になります。
② 東京PDBのAWRレポート生成
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(
l_dbid => 452263435,
l_inst_num => 1,
l_bid => 1, -- スナップショット開始ID
l_eid => 2 -- スナップショット終了ID
));
③ 大阪PDBのAWRスナップショット作成と確認
後続のレポート生成に必要な SNAP_ID, DBID, INSTANCE_NUMBER を取得しています。
SQL Developerだと以下のような画面になります。(②の東京の時と同じですね。)
-- 大阪PDBのAWRスナップショットを作成
ALTER SESSION SET CONTAINER = osaka_store_pdb;
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
-- スナップショットIDを確認
SELECT SNAP_ID, DBID, INSTANCE_NUMBER, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME
FROM DBA_HIST_SNAPSHOT
ORDER BY DBID, SNAP_ID;
④ 大阪PDBのAWRレポート生成
-- 大阪PDBのAWRレポートを生成
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(
l_dbid => 69103283,
l_inst_num => 1,
l_bid => 1, -- スナップショット開始ID
l_eid => 2 -- スナップショット終了ID
));
東京店舗と大阪店舗のPDBのパフォーマンス比較
これらの手順を通じて、東京店舗と大阪店舗のPDBそれぞれのパフォーマンスを確認し、比較することが可能です。AWRレポートには、CPU使用率やSQLパフォーマンスなど、さまざまなパフォーマンス指標が含まれています。
これにより、どちらの店舗がリソースをより効率的に使用しているか、またはチューニングが必要かを判断することができます。
おわりに
おわりです。