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が個別に動いていることをイメージしておく必要がある。