本コンテンツはORACLE MASTER Gold DBA 2019(Oracle Database AdministrationⅡ)の試験トピックであるOracle Multitenant Architectureに関する内容をご紹介します。今回は「アプリケーション・コンテナへのアプリケーション・インストール」の問題を解きながら詳しく解説していきます。

————————————————-

それでは問題文を確認していきましょう。

次の構成を確認してください。

•    CDB1はコンテナ・データベースです。
•    TOYS_ROOTはCDB1に含まれるアプリケーション・ルート・コンテナです。
•    TOYS_ROOT配下にROBOTS, DOLLSアプリケーションPDBが作成されています。
•    アプリケーションコンテナのPDBはすべてOPENしています。

 

TOYS_ROOTアプリケーション・ルート・コンテナに接続して次のコマンドを実行しました。

SQL> create user APP_U1 identified by oracle_4U;

SQL> alter pluggable database application APP_AP1 begin install ‘1.0’;

SQL> create user APP_U2 identified by oracle_4U;

SQL> alter pluggable database application APP_AP1 end install ‘1.0’;

コマンドの結果として正しい内容を述べているものはどれですか(2つ選択してください)。
尚、コマンドはすべて正常に実行されたものとします。

1.    ROBOTS, DOLLSにAPP_U2ユーザーのみ作成されています。
2.    ROBOTS, DOLLSにAPP_U1ユーザーのみ作成されています。
3.    ROBOTS, DOLLSにAPP_U1ユーザーおよびAPP_U2ユーザーが作成されています。
4.    ROBOTS, DOLLSにAPP_U1ユーザーおよびAPP_U2ユーザーは作成されていません。
5.    TOYS_ROOTにAPP_U1ユーザーのみ作成されています。
6.    TOYS_ROOTにAPP_U1ユーザーおよびAPP_U2ユーザーが作成されています。

(解説)

今回はアプリケーションコンテナへの「アプリケーションのインストール」について学習をしていきましょう。アプリケーションコンテナについての説明は「第7回:アプリケーション・コンテナの使用」で解説していますのでアプリケーションコンテナをまだよく理解していない方は第7回の内容を先にご確認ください。

第7回でも解説しましたが、ここで扱う「アプリケーション」というのはユーザー側が使用するアプリケーション・プログラムではなくOracle Database内に定義するオブジェクトのことを指すと考えてください。このオブジェクトのことを「アプリケーション共通オブジェクト」と言い、同期処理を行うことでアプリケーションPDBで共有して使用が可能になります。まずは第7回でも紹介したアプリケーションのインストールのイメージ図を以下に乗せておきましょう。

まず初めにアプリケーションのインストール処理はアプリケーション・ルートに対して行います。その後、「同期処理」を行うことでインストールした共通オブジェクトをアプリケーションPDBで使用可能となります。インストール&同期処理の一連の流れを以下で確認しておきましょう。

  1. アプリケーション・ルートに接続する
  2. アプリケーションのインストール開始宣言(BEGIN INSTALL)
  3. アプリケーションのインストール
  4. アプリケーションのインストール終了宣言(END INSTALL)
  5. アプリケーションPDBでのアプリケーションの同期処理

手順1~5の操作方法の詳細も確認するために、実機の操作ログをこの後記載します。今回、実機操作で使用したアプリケーションコンテナは問題文に沿ったリソース名で作成しました。またインストールするアプリケーションの内容は以下のスクリプト「script_toys_app.sql」に記載されているSQL文を実行することとします。

スクリプト:script_toys_app.sql

create tablespace toys_tbs datafile size 100M autoextend on next 10M maxsize 200M;
create user toys_owner1 identified by oracle_4U container=all;
grant create session, dba to toys_owner1;
alter user toys_owner1 default tablespace toys_tbs;
create table toys_owner1.sales_data1 sharing=metadata 
(year       number(4),
 region     varchar2(10),
 quarter    varchar2(4),
 revenue    number)

それでは内容を見ていきましょう。

SQL> show con_name  ※現在のコンテナがCDBルートであることを確認

CON_NAME
——————————
CDB$ROOT

SQL> show pdbs

CON_ID  CON_NAME             OPEN MODE     RESTRICTED
——— ———————- —————– ———-
         2 PDB$SEED              READ ONLY        NO
         3 PDB1                      READ WRITE      NO
         4 TOYS_ROOT            READ WRITE      NO     ※アプリケーション・ルート
         5 TOYS_ROOT$SEED  READ WRITE      NO
         6 ROBOTS                 READ WRITE      NO     ※アプリケーションPDB
         7 DOLLS                   READ WRITE      NO     ※アプリケーションPDB

SQL> alter session set container=toys_root;  ※アプリケーション・ルートにセッション切り替え

Session altered.

SQL> alter pluggable database application toys_app1 begin install ‘1.0’;
※アプリケーションのインストール開始宣言
  アプリケーション名はTOYS_APP1
  アプリケーションのバージョンは1.0 (任意のバージョン番号で管理可能)

Pluggable database altered.

SQL> select app_name, app_version, app_status from dba_applications 
where app_name=’TOYS_APP1′;    ※dba_applicationsでアプリケーションの状態を確認

APP_NAME        APP_VERS    APP_STATUS
————— —————- ——————–
TOYS_APP1                         INSTALLING

SQL> @/home/oracle/scripts/script_toys_app.sql  ※スクリプト内のSQL文を実行
SQL> create tablespace toys_tbs datafile size 100M autoextend on next 10M maxsize 200M;

Tablespace created.

SQL> create user toys_owner1 identified by oracle_4U container=all;

User created.

SQL> grant create session, dba to toys_owner1;

Grant succeeded.

SQL> alter user toys_owner1 default tablespace toys_tbs;

User altered.

SQL> create table toys_owner1.sales_data1 sharing=metadata
  2  (year       number(4),
  3   region     varchar2(10),
  4   quarter    varchar2(4),
  5   revenue    number);

Table created.

SQL> alter pluggable database application toys_app1 end install ‘1.0’;
※アプリケーションのインストール終了宣言
  アプリケーション名はTOYS_APP1
  アプリケーションのバージョンは1.0 (任意のバージョン番号で管理可能)

Pluggable database altered.

SQL> select app_name, app_version, app_status from dba_applications 
where app_name=’TOYS_APP1′;   ※dba_applicationsでアプリケーションの状態を確認

APP_NAME      APP_VERS      APP_STATUS
————— —————- ——————–
TOYS_APP1    1.0                 NORMAL


==== ここからはアプリケーションPDB(ROBOTS)への同期処理 ====

SQL> alter session set container=robots;  ※アプリケーションPDB(ROBOTS)にセッション切り替え

Session altered.

SQL> alter pluggable database application toys_app1 sync;  
※ROBOTSアプリケーションPDBにて同期処理を実施。
  これによりアプリーケーション・ルートにインストールしてあるTOYS_OWNER1ユーザーや
  SALES_DATA1表などがROBOTSアプリケーションPDBで使用可能になる

Pluggable database altered.

SQL> connect toys_owner1/oracle_4U@localhost:1521/robots 
※TOYS_OWNER1ユーザーでROBOTSアプリケーションPDBに接続
Connected.

SQL> show user  ※TOYS_OWNER1で接続していることを確認
USER is “TOYS_OWNER1”

SQL> show con_name  ※ROBOTSアプリケーションPDBに接続していることを確認

CON_NAME
——————————
ROBOTS

SQL> describe sales_data1  ※TOYS_OWNER1のSALES_DATA1表があることを確認
 Name                                      Null?    Type
 ———————————- ——– ———————–
 YEAR                                                 NUMBER(4)
 REGION                                             VARCHAR2(10)
 QUARTER                                           VARCHAR2(4)
 REVENUE                                           NUMBER

ここまでがアプリケーション・ルートにアプリケーションをインストールして、ROBOTSという名前のアプリケーションPDBに同期処理を実行した内容です。アプリケーション・ルートにインストールしたオブジェクトが同期処理によって問題なくアプリケーションPDBで使用できていることが確認できると思います。

上記内容で同期処理を実施したのはROBOTSというアプリケーションPDBになりますが、DOLLSというアプリケーションPDBも存在しています。こちらについてはどうなっているでしょうか?同期されている?されていない?の確認を実機操作にてさらに確認していきましょう。

SQL> show con_name  ※現在のセッションはROBOTSアプリケーションPDBに接続している

CON_NAME
——————————
ROBOTS

SQL> connect toys_owner1/oracle_4U@localhost:1521/dolls  
※アプリケーションPDBであるDOLLSにTOYS_OWNER1で接続しようとしても・・
ERROR:
ORA-01017: invalid username/password; logon denied  ※エラーが発生して接続できない。

Warning: You are no longer connected to ORACLE.

SQL> connect sys/Welcome_1@localhost:1521/toys_root as sysdba ※アプリケーション・ルートに接続
Connected.

SQL> select p.pdb_name, u.username, u.common from cdb_pdbs p, cdb_users u 
     where p.con_id=u.con_id and u.username=’TOYS_OWNER1′
※アプリケーションコンテナ内でTOYS_OWNER1が定義されているコンテナ情報の確認

PDB_NAME             USERNAME           COMMON
——————– ———————- ——–
TOYS_ROOT          TOYS_OWNER1      YES
ROBOTS                TOYS_OWNER1      YES  
※同期処理をしたROBOTSにはTOYS_OWNER1ユーザーは存在するがDOLLSには存在しない

予測できた方もいらっしゃると思いますが、DOLLSという名前のアプリケーションPDBについては、まだ同期処理をしていないのでTOYS_OWNER1ユーザーやSALES_DATA1表などのオブジェクトは使用することができません。アプリケーション・ルートにインストールした共通オブジェクトを使用するためにはDOLLSアプリケーションPDBに接続して同期処理を行う必要があります。ではその操作を実施してみましょう。

SQL> show user  ※現在のセッションはSYSでアプリケーション・ルート接続している
USER is “SYS”

SQL> show con_name  

CON_NAME
——————————
TOYS_ROOT


SQL> alter session set container=dolls;  ※アプリケーションPDB(DOLLS)にセッション切り替え

Session altered.

SQL> alter pluggable database application toys_app1 sync;
※DOLLSアプリケーションPDBにて同期処理を実施。
  これによりアプリーケーション・ルートにインストールしてあるTOYS_OWNER1ユーザーや
  SALES_DATA1表などがDOLLSアプリケーションPDBで使用可能になる

Pluggable database altered.

SQL> connect toys_owner1/oracle_4U@localhost:1521/dolls
※TOYS_OWNER1ユーザーでDOLLSアプリケーションPDBに接続
Connected.

SQL> show user  ※TOYS_OWNER1で接続していることを確認
USER is “TOYS_OWNER1”

SQL> show con_name  ※DOLLSアプリケーションPDBに接続していることを確認

CON_NAME
——————————
DOLLS

SQL> describe sales_data1  ※TOYS_OWNER1のSALES_DATA1表があることを確認
 Name                                     Null?    Type
 ———————————- ——– ———————–
 YEAR                                                  NUMBER(4)
 REGION                                              VARCHAR2(10)
 QUARTER                                            VARCHAR2(4)
 REVENUE                                            NUMBER

DOLLSアプリケーションPDBで同期処理を行うことにより無事に共通オブジェクトが使用できるようになりました。以上がアプリケーションのインストールから同期処理までの詳細な操作方法になります。尚、今回はすでに作成済みのアプリケーションPDBに対して同期処理を行いましたが、アプリケーション・シードを使用した方法もあります。簡単に操作方法の流れを以下に記載しておきます。

「アプリケーション・ルートにアプリケーションをインストール」

 ↓

「アプリケーション・シードに同期処理」

 ↓

「アプリケーション・シードからアプリケーションPDBを新規作成」

こちらの内容も合わせておさえておきましょう。

それでは今回の問題をあらためて確認したいと思います。問題文に書いてある操作はアプリケーション・ルートにてユーザーの作成やアプリケーションのインストールの開始宣言、終了宣言を行っていますがアプリケーションPDBに対して同期処理を行っていません。それを踏まえて選択肢をみていけば正解を選ぶことができそうですね。

選択肢1は誤りです。アプリケーションのインストール開始と終了宣言の間にAPP_U2を作成していますが、アプリケーションPDBで同期処理をしてないのでROBOTS、DOLLSともにAPP_U2ユーザーは使用できません。

選択肢2は誤りです。APP_U1ユーザーはアプリケーション・ルートにのみ存在するユーザーとして作成されます。仮に同期処理をしたとしてもアプリケーションの開始宣言前にユーザー作成を実行しているのでアプリケーションPDBに反映はされません。

選択肢3も誤りですね。選択肢1と選択肢2の説明内容で理解できると思います。

選択肢4は正しい内容になります。

選択肢5は誤りで、選択肢6が正しい内容になります。TOYS_ROOTにはAPP_U1ユーザーとAPP_U2ユーザーが存在している状態です。同期処理を行えばAPP_U2ユーザーがアプリケーションPDBで共通オブジェクトとして共有して使用することが可能になります。

以上を踏まえまして正解は 4、6 になります。

今回はアプリケーションのインストールについて実機の操作ログを踏まえて解説させていただきました。かなり操作ログの内容が多かったですが、理解が難しかった方、よく理解できた方も是非自分で実機操作を行って再確認をしてみてください。技術知識の定着に加え、疑問に思ったことなどを実機操作にて確認するという癖をつけていただくと飛躍的にレベルアップすることが可能になるかと思います。

それでは今回の講義はこれまでとします。お疲れ様でした。

————————————————-

【Oracle University講師によるORACLE MASTER Gold DBA 2019 試験トピック解説講座】トピック一覧

————————————————-

その他の ORACLE MASTER 試験トピック解説講座シリーズ:

【Oracle University 講師による ORACLE MASTER Silver SQL 2019 試験トピック解説講座】-トピック一覧-

————————————————-