CDB/PDBのユースケースとセキュリティ・AWRの確認

### はじめに
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が独立してリソースを消費

### ユースケース: 大手飲食(プリン屋)店チェーンでの活用

**企業背景:**
 - 大手飲食店チェーンは、全国に多数の店舗を展開し、各店舗で独自に運営されている
 - オンライン予約、デリバリーサービス、社内の経理や人事の管理など、さまざまなビジネス機能がある
 - これらの機能を効率的に管理し、リソースを最大限に活用するため、全社的なデータベースインフラの一元管理したい。(１つデータベースのみの管理だと運用コストもメリットある)

「プリンは栄養たっぷりん。言うてな！！！」

**CDBによる管理:** 
 - **CDBの役割** : 企業全体のデータベースインフラを統括するために、1つのCDBを導入。このCDBには、**共通**のシステム設定、全社的なデータ、セキュリティポリシーが含まれる

**PDBによる店舗ごとのデータ管理:**
 - **PDBの役割** : 各店舗やサービスに対して**個別**のPDBを割り当て、そのPDB内で店舗固有のデータを管理。これにより、データの独立性が確保される

#### 店舗ごとのPDBの作成
①東京店と大阪店用のPDBの作成
```sql
-- 東京店舗専用の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

```sql
[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のオープン
```sql
-- 東京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 の権限を付与します。
```sql
-- 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 にアクセスしようとすると、権限が不足しているためエラーが発生します。
```sql
-- 東京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の画面だと以下のようになります。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/eb2728e5-7176-9790-190c-688cc937ba56.png)

### 各PDBのリソース消費とAWRを活用したパフォーマンス確認
ここでは、AWR（Automatic Workload Repository）を活用して、各PDBのパフォーマンスを確認する手順を示します。今回は、ユーザ権限の設定を簡単にするため、sys ユーザを使用しています。

① 東京PDBのAWRスナップショット作成と確認
```sql
-- 東京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だと以下のような画面になります。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/045dda00-3fc8-d6a2-9c8a-e7a4fe0ff796.png)


② 東京PDBのAWRレポート生成

```sql
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(
    l_dbid      => 452263435,
    l_inst_num  => 1,
    l_bid       => 1,  -- スナップショット開始ID
    l_eid       => 2   -- スナップショット終了ID
    ));
```
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/ba7f76c8-b3cd-e435-6d9c-59cbc740f773.png)


③ 大阪PDBのAWRスナップショット作成と確認
後続のレポート生成に必要な SNAP_ID, DBID, INSTANCE_NUMBER を取得しています。
SQL Developerだと以下のような画面になります。(②の東京の時と同じですね。)
```sql
-- 大阪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;
```

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/40e7001e-b09f-3df0-219c-d7b2221001b9.png)

④ 大阪PDBのAWRレポート生成

```sql
-- 大阪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
    ));
```

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/b933cb7b-a042-e84d-7b61-0c437abdae8b.png)

**東京店舗と大阪店舗のPDBのパフォーマンス比較**
これらの手順を通じて、東京店舗と大阪店舗のPDBそれぞれのパフォーマンスを確認し、比較することが可能です。AWRレポートには、CPU使用率やSQLパフォーマンスなど、さまざまなパフォーマンス指標が含まれています。

これにより、どちらの店舗がリソースをより効率的に使用しているか、またはチューニングが必要かを判断することができます。

#### おわりに
おわりです。