hatenob

プログラムって分からないことだらけ

Oracle 12cプラガブルデータベースって何?

前回インストールした12c。
とりあえず、コンテナデータベースを作成し、1つのプラガブルデータベースを作成しました。
何者かも分からずに。
細かいことは置いといて、自分の理解のためにざっくりとまとめます。

位置づけ

このプラガブルデータベースが、Oracle 12cの目玉であるマルチテナントの実現方法である模様。なんとなく、メタデータアーキテクチャに特化したような機能なのかと思っていたけれど違った。
Enterprise EditionのMultitenantオプションの購入が必要。
EEクラスの機能ということで、単一インスタンスで運用しているような環境には無用ということかな。
検証環境はSEで作ったつもりだったけれど、入るには入るみたいです。

概要

コンテナデータベースの下に、複数のプラガブルデータベースを定義して使うことができるみたい。プラガブルの名前通り、プラグ/アンプラグができ、別のコンテナデータベースに差し替えて使えるそうな。

プロセス

psでプロセスを見ると、あくまでコンテナデータベース分しかプロセスはあがらないみたい。

[oracle@centos64-12c ~]$ ps -ef | grep ora_
oracle    1320     1  0 21:53 ?        00:00:00 ora_pmon_orcl
oracle    1322     1  0 21:53 ?        00:00:00 ora_psp0_orcl
oracle    1324     1  2 21:54 ?        00:00:08 ora_vktm_orcl
oracle    1328     1  0 21:54 ?        00:00:00 ora_gen0_orcl
oracle    1330     1  0 21:54 ?        00:00:00 ora_mman_orcl
oracle    1334     1  0 21:54 ?        00:00:00 ora_diag_orcl
oracle    1336     1  0 21:54 ?        00:00:00 ora_dbrm_orcl
oracle    1338     1  0 21:54 ?        00:00:00 ora_dia0_orcl
oracle    1340     1  0 21:54 ?        00:00:00 ora_dbw0_orcl
oracle    1342     1  0 21:54 ?        00:00:00 ora_lgwr_orcl
oracle    1344     1  0 21:54 ?        00:00:00 ora_ckpt_orcl
oracle    1346     1  0 21:54 ?        00:00:00 ora_lg00_orcl
oracle    1348     1  0 21:54 ?        00:00:00 ora_smon_orcl
oracle    1350     1  0 21:54 ?        00:00:00 ora_lg01_orcl
oracle    1352     1  0 21:54 ?        00:00:00 ora_reco_orcl
oracle    1354     1  0 21:54 ?        00:00:00 ora_lreg_orcl
oracle    1356     1  0 21:54 ?        00:00:00 ora_mmon_orcl
oracle    1358     1  0 21:54 ?        00:00:00 ora_mmnl_orcl
oracle    1360     1  0 21:54 ?        00:00:00 ora_d000_orcl
oracle    1362     1  0 21:54 ?        00:00:00 ora_s000_orcl
oracle    1374     1  0 21:54 ?        00:00:00 ora_tmon_orcl
oracle    1376     1  0 21:54 ?        00:00:00 ora_tt00_orcl
oracle    1378     1  0 21:54 ?        00:00:00 ora_smco_orcl
oracle    1380     1  0 21:54 ?        00:00:00 ora_aqpc_orcl
oracle    1410     1  0 21:54 ?        00:00:01 ora_cjq0_orcl
oracle    1412     1  0 21:54 ?        00:00:00 ora_w000_orcl
oracle    1447     1  0 21:54 ?        00:00:00 ora_qm02_orcl
oracle    1451     1  0 21:54 ?        00:00:00 ora_q002_orcl
oracle    1453     1  0 21:54 ?        00:00:00 ora_q003_orcl
oracle    1455     1  0 21:54 ?        00:00:00 ora_q004_orcl

ファイル構成

物理ファイルは?というと、コンテナとプラガブルデータベースで別々に作られてました。プラガブルデータベース単位でディレクトリができるみたい。

/u01/app/oracle/oradata/orcl/control01.ctl
/u01/app/oracle/oradata/orcl/redo01.log
/u01/app/oracle/oradata/orcl/redo02.log
/u01/app/oracle/oradata/orcl/redo03.log
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/temp01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/pdb1/pdb1_users01.dbf
/u01/app/oracle/oradata/orcl/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/orcl/pdb1/system01.dbf
/u01/app/oracle/oradata/orcl/pdb1/temp01.dbf
/u01/app/oracle/oradata/orcl/pdbseed/pdbseed_temp01.dbf
/u01/app/oracle/oradata/orcl/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/orcl/pdbseed/system01.dbf

データファイル

実際に接続してデータファイルを見てみると、プラガブルデータベースの時は自分のものしか見えないみたい。

SQL> conn system/Oracle12c@orcl
接続されました。
SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/pdbseed/system01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/orcl/pdb1/system01.dbf
/u01/app/oracle/oradata/orcl/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/orcl/pdb1/pdb1_users01.dbf

9行が選択されました。

SQL> conn system/Oracle12c@pdb1
接続されました。
SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/pdb1/system01.dbf
/u01/app/oracle/oradata/orcl/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/orcl/pdb1/pdb1_users01.dbf

ユーザ(スキーマ

pdb1にappというユーザを作っていますが、それがどう見えるかというと、プラガブルデータベースで閉じているようで、コンテナデータベースからすら見えません。

SQL> conn system/Oracle12c@orcl
接続されました。
SQL> select username from dba_users where account_status = 'OPEN';

USERNAME
------------------------------
SYS
SYSTEM

SQL> conn system/Oracle12c@pdb1
接続されました。
SQL> select username from dba_users where account_status = 'OPEN';

USERNAME
------------------------------
APP
PDBADMIN
SYS
SYSTEM

何が嬉しいのか

新機能や特徴、「こんなに素晴らし」というのはOracle社のサイトや各種メディア記事で確認できます。
これまで、DBの分離はインスタンススキーマか、という単位での分離でしたが、プラガブルデータベース単位で分離することで、独立性を高めながらもリソースを有効活用することができるようになったのかな。
イメージはWebLogicで採用されているドメインモデル(管理サーバと管理対象サーバ)に近い。
スキーマ単位の分離だと運用上不都合があったような環境では有効に使われるのだと思う。
例えば、アプリ単位でDB管理者がいるような時で、他のアプリ情報を見せたくなかったりといったようなセキュリティ事情とか。
バックアップ・リストアであれば、データファイルは別々なので個別運用できるみたいだけど、起動停止やパッチ適用のタイミングなんかの運用を別にしたいような時には向かないっぽい。
パッケージをPaaSやSaaSで提供して、DB管理はユーザごとに別々、なんて使い方はできるんだろうな。

プラグ/アンプラグは検証環境の都合と今のところ興味がないので今は触れないでおきます。