カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

Oracle Database 12c (12.1.0.2.0) で遊んでみた(その2) 〜プラガブル・データベース〜

前回、Oracle Database 12cをインストールし11gR2と同じ感覚でsysでログインできるところまで見た。

このまま続けて、DBスキーマ(ユーザ)を作成してみるが、11gまでの感覚で作業するとエラーとなる。12cからはマルチテナント・アーキテクチャとなったため、コンテナ・データベース(CDB)とプラガブル・データベース(PDB)の仕組みを理解して作業する必要がある。今回は前回のインストール作業で設定したように、親となるCDBをorcl、その子となるPDBをpdbo12cという名前で作成している。

ユーザを作成する

$ sqlplus / as sysdba


SQL*Plus: Release 12.1.0.2.0 Production on Mon Dec 29 11:26:03 2014
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> create user test identified by test;
create user test identified by test
            *
ERROR at line 1:
ORA-65096: invalid common user or role name

普通に作成するとエラーとなる。11gまでの感覚だといきなり面食らってしまうところ。これは、現在CDBに接続しているためであり、実際にデータを管理するためのPDBに切り替える必要がある。まず、現在接続しているDBを確認する。

SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT

CDBにつないでいることが分かる。PDBにつなぎ替えるには、以下のようにalter session文を実行する。

SQL> alter session set container=pdbo12c;
Session altered.
SQL> show con_name;

CON_NAME
------------------------------
PDBO12C

pdbo12cという名前のPDBに繋ぎ変えられたことが分かる。PDBにつながったので、ユーザを作ってみる。

SQL> create user test identified by test;
create user test identified by test
                               *
ERROR at line 1:
ORA-01109: database not open

またしてもエラーとなってしまった。どうやらPDBが起動していないよう。CDBが起動したからといって、PDBも起動するわけではないので、個別に起動・停止する必要があるよう。

PDBの起動・停止

まず、PDBの状態を確認する。

見方は2通りあって、V$PDBS表を見る。

SQL> select name, open_mode from v$pdbs;
NAME       OPEN_MODE
------------------------------ ----------
PDBO12C         MOUNTED

もしくは簡単に以下のコマンドでも確認できる。

SQL> show pdbs;
    CON_ID CON_NAME   OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDBO12C   MOUNTED

PDBを起動するには、PDBに接続した状態で、startupすればよい。

SQL> startup
Pluggable Database opened.
SQL> show pdbs;
    CON_ID CON_NAME   OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDBO12C   READ WRITE NO

停止はいつも通りshutdownでよい。

SQL> shutdown immediate
Pluggable Database closed.
SQL> show pdbs;
    CON_ID CON_NAME   OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDBO12C   MOUNTED

また、PDBにつなげずとも、以下のコマンドで直接起動停止もできる。

SQL> alter pluggable database pdbo12c open;
Pluggable database altered.
SQL> alter pluggable database pdbo12c close immediate;
Pluggable database altered.

PDBに接続し、PDBを起動した状態でユーザを作成してみる。

SQL> create user test identified by test;
User created.

今度はユーザ作成に成功した!。とりあえずconnectとresource権限も付与しておく。

SQL> grant connect, resource to test;
Grant succeeded.

作成したPDBユーザに接続する

11gまでの感覚でそのまま作ったユーザに接続しようとしてみる。

SQL> conn test/test
;
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.

ログインエラーとなってしまう。。調べたところ、どうやらPDBにはリスナー経由でログインしないといけないよう。なので、このまま作ったユーザにOS認証ではログインできない。

リスナー経由でログインするため、まずサービス名を確認するため、lsnrctlを見てみる。

$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 29-DEC-2014 10:49:00
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                28-DEC-2014 19:06:00
Uptime                    0 days 15 hr. 43 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle12c/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle12c/diag/tnslsnr/localhost/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle12c/product/12.1.0/dbhome_1/admin/orcl/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "o12cXDB.localdomain" has 1 instance(s).
  Instance "o12c", status READY, has 1 handler(s) for this service...
Service "orcl.localdomain" has 1 instance(s).
  Instance "o12c", status READY, has 1 handler(s) for this service...
Service "pdbo12c.localdomain" has 1 instance(s).
  Instance "o12c", status READY, has 1 handler(s) for this service...
The command completed successfully

以下のようになっていることがわかった。

  • CDBのサービス名: orcl.localdomain
  • PDBのサービス名: pdbo12c.localdomain


続いてtnsnames.oraを確認する。CDBのtnsはデフォルトで作成されている。

$ cat $ORACLE_HOME/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle12c/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.localdomain)
    )
  )

CDBのtnsをコピーし、SERVICE_NAMEだけPDBのものに変更した設定を追記する。tnsnames.oraに以下の内容を記載する。

PDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdbo12c.localdomain)
    )
  )

PDBにリスナー経由で接続してみる。

$ sqlplus test/test@pdb

SQL*Plus: Release 12.1.0.2.0 Production on Mon Dec 29 10:51:32 2014
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Last Successful login time: Mon Dec 29 2014 10:47:30 +09:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> 

ようやく作成したtestユーザでログインできた!ここまでくれば、あとのDBの使い方は11gまでと同じようにできるはず。

まとめ

実際にスキーマを使うためには、CDBからPDBに切り替えて作業をする必要があり、PDBはCDBとは別に個別に起動・停止を管理してやる必要がある。また、接続のためにはtnsnames.oraを修正しPDB専用の接続文字列でつなぐ必要がある。とりあえずプラガブルは11gまで意識していたスキーマやデータの外側にもう1レイヤー加わったということを理解し、PDBが個別に動いていることをイメージしておく必要がある。

関連記事