トップ > DBA上級 マルチテナント > 3章
4章 CDB,PDBの管理
本章ではCDB,PDB基本操作についてご紹介していきます。

マルチコンテナ環境の管理方法


本章ではCDB、PDBの管理方法についてご紹介していきます。
CDB、PDBの接続方法や、CDBの起動停止方法についてご紹介していきます。

CDBへのログイン



ルートDB(CDB)へのログインは非CDBと同じログイン方法です。

  $ sqlplus / as sysdba

  SQL> show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT


show con_nameコマンドで現在接続中のDB名を確認することが出来ます。
CDBのログインは通常のデータベースのログインと変わりはありません。


PDBへのログイン



PDBへの接続は以下のコマンドを使用します。

[構文] PDBへの接続方法
 SQL> ALTER SESSION SET CONTAINER = PDB名;

上記コマンドを使用するにはSET CONTAINER権限が必要です。

  SQL> alter session set container = pdb1;

  Session altered.

  SQL> show con_name

  CON_NAME
  ------------------------------
  PDB1


それ以外の接続方法はリスナー経由での接続が可能です。
一般ユーザはこちらのリスナー経由での接続を行いましょう。
今回はまだ一般ユーザを作成していないのでSYSTEMユーザで接続してみます。

TNSファイルには以下の記載をしています。

  $ cat $ORACLE_HOME/network/admin/tnsnames.ora
  PDB1 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = linux01)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = PDB1)
      )
    )
    

  $ sqlplus system/manager@pdb1

  SQL> show con_name

  CON_NAME
  ------------------------------
  PDB1



[補足]
リスナーへのPDB情報はLOCAL_LISTENERパラメータで設定されているリスナーに
対して、PDB起動時に送信されます。デフォルトは自動的に設定されます。
※LOCAL_LISTENERパラメータはtnsnames.oraに記載されているエイリアスでも可能

PDBの場合は上記のようにALTER SESSIONコマンドを使用するかTNSファイルにネットサービス名を登録して接続する方法があります。
またリスナーは以下のコマンドでPDBの情報を確認することができます。

  $ SPAN>lsnrctl service

  LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 19-JAN-2017 18:25:17

  Copyright (c) 1991, 2013, Oracle.  All rights reserved.

  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=linux01)(PORT=1521)))
  Services Summary...
  Service "orcl" has 1 instance(s).
    Instance "orcl", status READY, has 1 handler(s) for this service...
      Handler(s):
        "DEDICATED" established:0 refused:0 state:ready
           LOCAL SERVER
  ...
  Service "pdb1" has 1 instance(s).
    Instance "orcl", status READY, has 1 handler(s) for this service...
      Handler(s):
        "DEDICATED" established:0 refused:0 state:ready
           LOCAL SERVER
  Service "pdb2" has 1 instance(s).
    Instance "orcl", status READY, has 1 handler(s) for this service...
      Handler(s):
        "DEDICATED" established:0 refused:0 state:ready
           LOCAL SERVER
  The command completed successfully


CDBであるorclの他に、PDBのpdb1,pdb2がリスナーのデータベース情報に登録されています。


CDB,PDBの停止


次にCDBとPDBの起動停止方法について確認していきましょう。

CDBの起動、停止



ルートDB(CDB)を停止すると、全PDBは停止します。
停止方法は通常の停止と同じでSHUTDOWNコマンドで実施します。

では実施してみましょう。

  SQL> SPAN>show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT


  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.

  SQL> alter session set container = pdb1;
  
  alter session set container = pdb1
  *
  ERROR at line 1:
  ORA-01034: ORACLE not available
  Process ID: 0
  Session ID: 0 Serial number: 0


CDBはメインのデータベースである為、CDBが停止するとPDBは停止します。

起動方法も非CDB同様です。またCDBを起動しても、PDBは自動起動しません。
自動起動を行いたい場合はトリガーなどを使用して起動する方法を検討する必要があります。


  SQL> startup
  ORACLE instance started.

  Total System Global Area 1068937216 bytes
  Fixed Size                  2296576 bytes
  Variable Size             746587392 bytes
  Database Buffers          314572800 bytes
  Redo Buffers                5480448 bytes
  Database mounted.
  Database opened.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           MOUNTED
           4 PDB2                           MOUNTED


PDBはMOUNTEDの状態であり、起動していないことが分かります。


PDBの起動、停止


PDBの起動停止方法は2通りあります。

1.ALTER PLUGGABLEコマンドを使用した起動、停止 2.STARTUP、SHUTDOWNコマンドを使用した起動、停止 それでは構文を確認していきましょう。

[構文] PDBへの起動停止
 SQL> ALTER PLUGGABLE DATABASE PDB名 OPEN|CLOSE[IMMEDIATE];

上記コマンドはCDB,PDB上で実行することが出来ます。

通常のSTARTUP、SHUTDOWNでもPDBの起動停止は行えますが、
この場合はPDBに切り替えて実施する必要があります。

IMMEDIATEは現在実行中のトランザクションをロールバックし停止します。
デフォルトは通常のシャットダウンで、全セッションがログアウトするまで待機します。

では実際に試して見ます。

  SQL> show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           MOUNTED
           4 PDB2                           MOUNTED

  SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN;

  Pluggable database altered.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           READ WRITE NO
           4 PDB2                           MOUNTED


PDB1がREAD WRITEになり、PDBが起動しました。

  SQL> ALTER PLUGGABLE DATABASE PDB1 CLOSE;

  Pluggable database altered.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           MOUNTED
           4 PDB2                           MOUNTED


PDB1がMOUTEDになり、PDBが停止しました。
次にSTARTUP、SHUTDOWNも試してみます。


  SQL> alter session set container = pdb1;

  Session altered.

  SQL> startup
  
  Pluggable Database opened.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           3 PDB1                           READ WRITE NO

  SQL> shutdown immediate
  
  Pluggable Database closed.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           3 PDB1                           MOUNTED

また複数PDBが存在する場合、ALLオプションやEXCEPTオプションを使用し、一度に複数PDBを起動停止することが可能です。

[構文] 複数PDBへの起動停止
 SQL> ALTER PLUGGABLE DATABASE ALL PDB名 [EXCEPT PDB名] OPEN|CLOSE;

ALLオプションはすべてのPDBを起動します。
ただしEXCEPTオプションは指定した場合、指定したPDBは除外されます。

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           READ WRITE NO
           4 PDB2                           MOUNTED

  SQL> alter pluggable database all open;

  SQL> show pdbs


      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           READ WRITE NO
           4 PDB2                           READ WRITE NO


今回PDB1は既に起動していましたが、ALLを指定して起動してもエラーにはなりません。
次にEXCEPTオプションを使用して、PDB1のみ停止してみます。


  SQL> alter pluggable database all except pdb2 close;

  Pluggable database altered.

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           MOUNTED
           4 PDB2                           READ WRITE NO


上記のように複数PDBを起動する場合は、ALLオプションを使用できます。

以上がCDB,PDBの起動方法です。



CDB,PDBの初期化パラメータの変更


初期化パラメータはCDB上に1つ存在していますが、パラメータは各PDBで変更が可能です。
コマンドも非CDBと同様ALTER SYSTEM文を使用しますが、PDBを変更する際はSID句が必要です。

[構文] PDBのパラメータ変更
 SQL> ALTER SYSTEM SET パラメータ名 = 値 [CONTAINER =ALL|CURRENT][SCOPE句];

CONTAINER句は、変更する範囲を制御します。デフォルトはCURRENTであり、設定したパラメータはすべてのPDBに反映されます。CURRENTはコマンドを発行したDBのみ反映します。
またCONTAINER =ALLはルートDB(CDB)のみ実行されます。
PDBで実行した場合は、「ORA-65050: Common DDLs only allowed in CDB$ROOT」上記のメッセージが出力されます。

PDB上で変更可能なパラメータすべてではなく、一部のパラメータです。
どのパラメータが変更可能かは以下のコマンドで確認できます。

  SQL> SELECT NAME FROM V$SYSTEM_PARAMETER
    2  WHERE ISPDB_MODIFIABLE='TRUE' ORDER BY NAME;

  NAME                                               ISPDB
  -------------------------------------------------- -----
  O7_DICTIONARY_ACCESSIBILITY                        TRUE
  asm_diskstring                                     TRUE
  cell_offload_compaction                            TRUE
  cell_offload_decryption                            TRUE
  ・・・
  statistics_level                                   TRUE
  temp_undo_enabled                                  TRUE
  timed_os_statistics                                TRUE
  timed_statistics                                   TRUE
  workarea_size_policy                               TRUE
  xml_db_events                                      TRUE

  171 rows selected.


ではPDBでも変更可能なOPEN_CURSORパラメータを変更してみます。
SESSIONSパラメータはDBの接続数を制限するパラメータです。

  SQL> show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT

  SQL> show parameter open_cursors
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  open_cursors                         integer     1000

  SQL> alter system set open_cursors = 100 CONTAINER  = ALL;

  System altered.

  SQL> show parameter open_cursors

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  open_cursors                         integer     100

  SQL> alter session set container = pdb1;

  Session altered.

  SQL> show parameter open_cursors

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  open_cursors                         integer     100

  SQL> conn / as sysdba
  SQL> show con_name

  CON_NAME
  ------------------------------
  CDB$ROOT

  SQL> alter system set open_cursors = 200 CONTAINER  = CURRENT;

  System altered.

  SQL> show parameter open_cursors

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  open_cursors                         integer     200

  SQL> alter session set container = pdb1;

  Session altered.

  SQL> show parameter open_cursors

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  open_cursors                         integer     100



各CDB,PDBのパラメータが変更できていることを確認できました。

本章は以上となります。PDBの基本的な管理方法についてご紹介していきました。
基本的な操作は通常DBと異なりますが、実機で試しつつマスターしていきましょう。