バージョン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ばっかり使うことになるかも。
ただ表領域やら起動停止が別々なので注意ですね。
以上ア