Pluggable Databaseへの接続方法
SQL*Plusを使ってPluggable Database (PDB)に接続するには以下の方法がありました。
- リスナー経由
- ALTER SESSION SET CONTAINER文の実行
PDBがOPEN状態であればリスナー経由で接続できます。tnsnames.ora ファイルに接続先サービスの情報を書き込んで接続するか、EZCONNECT記法を使って接続します。
$ sqlplus pdbadmin/{password}@localhost:1521/pdb1
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 10:43:22 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL> SHOW CON_NAME
CON_NAME
------------------------------
PDB1
SQL>
CDBへ接続した後、ALTER SESSION SET CONTAINER文でPDBに接続することもできます。
$ sqlplus / as sysdba
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER=pdb2;
セッションが変更されました。
SQL> SHOW CON_ID;
CON_ID
------------------------------
4
SQL> SHOW CON_NAME
CON_NAME
------------------------------
PDB1
新しい接続方法
Oracle Database 19c (19.7) から、PDBに対する「AS SYSDBA」を指定したオペレーティング・システム認証がサポートされるようになりました。環境変数ORACLE_PDB_SIDにPDB名を指定します。
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 10:50:03 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL> SHOW CON_NAME
CON_NAME
------------------------------
PDB1
SQL> SELECT BANNER_FULL FROM V$VERSION;
BANNER_FULL
-----------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL>
接続先CDBを選択するため、従来からCDB接続のために使用してきた環境変数ORACLE_SIDも必要です。
非CDB環境に接続
環境変数ORACLE_SIDに非CDBデータベースを指定した場合は、環境変数ORACLE_PDB_SIDは無視されます。下記の例では、非CDBデータベースO19Aを指定しています。
$ export ORACLE_SID=O19A
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:01:30 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL> SHOW CON_NAME
CON_NAME
------------------------------
O19A
存在しないPDB
環境変数ORACLE_PDB_SIDに存在しないPDB名を指定すると、CDB$ROOTに接続されます。
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb_not_exists
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:04:19 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL> SHOW CON_NAME
CON_NAME
------------------------------
CDB$ROOT
SQL>
MOUNT状態のPDB
PDBがマウント状態でも接続できます。
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:05:24 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL> SHOW CON_NAME
CON_NAME
------------------------------
PDB1
SQL> SELECT OPEN_MODE FROM V$PDBS WHERE NAME='PDB1';
OPEN_MODE
----------
MOUNTED
SQL>
通常ユーザーによる接続
「AS SYSDBA」を指定しないユーザーを使ったPDB接続はできません。
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus pdbadmin/{password}
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:11:25 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: ^C
$
マニュアル
この機能は上記のように使えますが、SQL*Plusのマニュアルにも、Oracle Databaseの19.7パッチのREADMEにも公式な情報がありません。今後、マニュアルのアップデートにより公式化されることを期待しています。