dan-go.log

文系未経験からのインフラ備忘録。その他もろもろ。

【ORACLE】プラカブルデータベースへ接続する

バージョン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=mhvpdb)(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 test/test@PDBTEST

が通ります。後はいつも通りに。

 

 

スキーマ使うのもPDBに切り替えないといけないので、実質PDBばっかり使うことになるかも。

ただ表領域やら起動停止が別々なので注意ですね。

 

以上ァ