LoginSignup
12
13

【ORACLE】プラガブルデータベース(PDB)へ接続する

Last updated at Posted at 2020-07-17

バージョン12cからはマルチテナント構成の概念が追加されており、前までの感じで接続しようとするとエラーが出まくります。

・プロンプトからデータベースに接続

sqlplus / as sysdba

・ユーザを作成

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

出たな!
これは現在CDB(コンテナデータベース)に接続しているからで、ローカルの新規ユーザはPDB(プラガブルデータベース)にしか作成できないからです。
どちらに接続しているのかはshow con_nameで確認できます。

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

CDB$ROOTなので、CDBに接続していることになります。

・切り替えるPDB名とアクセス権限を確認

SQL>select name, open_mode from v$pdbs;

NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
PDB$SEED
READ ONLY

PDBTEST
READ WRITE

PDB名はPDBTEST,
READ WRITE権限がついています。

・PDBスタート

SQL>ALTER PLUGGABLE DATABASE PDBTEST OPEN;

・自動起動設定

SQL>ALTER PLUGGABLE DATABASE PDBTEST SAVE STATE;

・切り替え

SQL>alter session set container = PDBTEST;

show con_nameを実行するとPDBに切り替わっています。
これでユーザを作成できます。
※上記の切替方法は、CDB,PDB共通のユーザ(sys等)でログインしている場合しかできません。
そのため、PDBで作成した固有ユーザで接続したい場合は、プロンプトから直接以下コマンドを実行します。が、、、

>sqlplus ユーザ名/パスワード@PDB名

ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。

また出たな!!!
どうやらPDBへの接続はリスナー経由のようで、tnsnames.oraファイルの編集が必要です。

・lsntctlをみてCDB名、PDB名を確認

プロンプトから

>lsnrctl status

LSNRCTL for 64-bit Windows: Version 12.2.0.1.0 - Production on 18-10月-2018 15:52:32

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

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=mhvpdb)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for 64-bit Windows: Version 12.2.0.1.0 - Production
開始日 18-10月-2018 15:12:31
稼働時間 0 日 0 時間 40 分 0 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル C:\oracle\product\12.2.0\dbhome_1\network\admin\listener.ora
ログ・ファイル C:\oracle\diag\tnslsnr\mhvpdb\listener\alert\log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
サービスのサマリー...
サービス"67acb959d6824c0195ad990810b8771a.dangodb"には、1件のインスタンスがありま す。
インスタンス"db01"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"CLRExtProc"には、1件のインスタンスがあります。
インスタンス"CLRExtProc"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
サービス"pdbtest.dangodb"には、1件のインスタンスがあります。
インスタンス"db01"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"db01.dangodb"には、1件のインスタンスがあります。
インスタンス"db01"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"db01XDB.dangodb"には、1件のインスタンスがあります。
インスタンス"db01"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

CDB名はdb01.dangodb
PDB名はpdbtest.dangodbです。

・tnsnames.oraを編集

CDB(DB01)のエントリは既に記述があると思うので、丸々コピーしてSERVICE_NAMEのエントリをlsnrctlで調べたものに変更して追記しましょう。

PDBTEST =
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = pdbtest.dangodb)
   )
 )

これで

>sqlplus ユーザ名/パスワード@PDB名

が通ります。

スキーマ使うのもPDBに切り替えないといけないので、実質PDBばっかり使うことになるかも。
ただ表領域やら起動停止が別々なので注意ですね。


以上ア

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13