二楷堂昴の人生忙しい

二楷堂昴の人生忙しい

二楷堂昴が技術者のために技術知識を書いていきます

OracleDB 12c R2でプラガブル・データべース操作基礎その壱

事前に環境構築済みのOracle DB 12cを操作していきます。
今回は12cの機能であるコンテナ・データベースとプラガブル・データベースを操作していきます。

今回の作業内容は以下になります。

  • 共有ロールの作成
  • 共有ユーザの作成(他記事で作成しましたが再作成)
  • プラガブル・データベースの作成


それではまずリスナーとデータベースを起動しておきましょう。

[root@oracle12c ~]# su - oracle
最終ログイン: 2018/03/21 (水) 14:22:50 JST日時 pts/1
[oracle@oracle12c ~]$ 
[oracle@oracle12c ~]$ lsnrctl start LISTENER

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 07-APR-2018 20:42:19

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

Starting /u01/app/oracle/product/12.2.0/dbhome/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /u01/app/oracle/product/12.2.0/dbhome/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/oracle12c/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle12c)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                07-APR-2018 20:42:21
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.2.0/dbhome/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracle12c/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
[oracle@oracle12c ~]$

リスナーが正常に起動しました。
ちなみにEM Expressは後日設定します。
簡単なのでここでは使用しないので省略します。
データベースを起動します。

[oracle@oracle12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 7 20:44:33 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> 

後々、バックアップ・リストアについて書く予定なので、ついでにアーカイブ・ログモードへ変更します。
インスタンスはマウントモードで起動します。

SQL> startup mount
ORACLE instance started.

Total System Global Area 1258291200 bytes
Fixed Size                  2923920 bytes
Variable Size             452985456 bytes
Database Buffers          788529152 bytes
Redo Buffers               13852672 bytes
Database mounted.
SQL> 

アーカイブ・ログモードに変更します。

SQL> alter database archivelog;

Database altered.

SQL> 

変更されたので、データベースをオープンします。

SQL> alter database open;

Database altered.

SQL> 


正常に起動しました。
では早速作業をしたいと思います。

共通ロール作成

まず、共通ロールとは何かと言うと、プラガブル・データベースはそれぞでユーザやロールを作成するとローカルとして扱われるますがCDB上で作成すると、すべてのプラガブル・データベースで使用可能なロールを作成することが出来ます。
また、共通ユーザも後述しますが同じものになります。
CDBルートに接続している事を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> 

それではロールを作成します。
共通ユーザ、共通ロールは接頭辞に「C##」を付けます。

SQL> create role C##cdb_dba;

Role created.

SQL>

次に権限を付与していきます。
まずは全てのコンテナ・データベースに接続できる権限を付与します。

SQL> grant connect to C##cdb_dba container=all;

Grant succeeded.

SQL> 

共通ユーザの作成

次はユーザを作成します。
C##を付与してcreate文で作成します。

SQL> create user C##nikaido identified by subaru;

User created.

SQL> 

次に権限とロールを付与します。

SQL> grant C##cdb_dba to C##nikaido;

Grant succeeded.

SQL> 

これからデータベースやテーブルを作成するための権限を付与します。
しかし今回はSYSDBA権限でデータベースを作成していきます。
また、プラガブル・データベースへの接続権限の確認のためにコンテナ内のデータベースすべてにアクセスできる権限を付与します。

SQL> grant resource,unlimited tablespace to C##nikaido;

Grant succeeded.

SQL> 
SQL> grant set CONTAINER to C##nikaido CONTAINER=ALL;

Grant succeeded.

SQL> 

一度、sqlplusから抜けます。

SQL> quit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
[oracle@oracle12c ~]$ 

C##nikaidoユーザで接続してみます。

[oracle@oracle12c ~]$ sqlplus C##nikaido/subaru

SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 7 22:31:00 2018

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> 
SQL> 
SQL> 
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> 


無事に接続が確認できました。
それではデータベースの作成に入っていきたいと思います。

プラガブル・データベースの作成

一旦、C##nikaidoユーザから切断して、SYSDBAへ権限で接続しなおして下さい。
それでは以下の形で、PDB SEEDからコピーしてプラガブルデータベースを作成します。

SQL> create pluggable database pdb2 
admin user pdb2_admin identified by nikaido
roles = (dba)
file_name_convert = ('/u01/app/oracle/oradata/orcl/pdbseed','/u01/app/oracle/oradata/orcl/pdb2')
storage unlimited
; 

Pluggable database created.

SQL> 

確認してみると、「MOUNT」モードで正常に作成できています。
他のごみデータは気にしないでくださいね。。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
         4 TESTPDB                        MOUNTED
         5 PDB2                           MOUNTED
SQL> 

ではデータベースをオープンします。

SQL> alter pluggable database PDB2 open;

Pluggable database altered.

SQL> 

オープンしたので接続します。
接続にはAlter文を使います。

SQL> alter session set container=pdb2;

Session altered.

SQL> 

セッションが変更されました。
CDB$ROOTに戻りたい時は、container=CDB$ROOTで戻れます。

SQL> show con_name

CON_NAME
------------------------------
PDB2
SQL> 

無事に接続が出来ました。
では共通ユーザからはどうでしょうか。

確認のために共通ユーザをもう一つ作成します。
共通ロールのみ付与します。
ちなみに共通ユーザはCDBのみでしか作成できません。

SQL> create user C##test identified by test

User created.

SQL> grant C##cdb_dba to C##test;          

Grant succeeded.

SQL> 

正常に作成できました。
ではそれぞれで接続します。

  • C##testユーザの場合
[oracle@oracle12c pdbseed]$ sqlplus C##test/test

SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 7 22:53:21 2018

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> 
SQL> 
SQL> alter session set container=pdb2;
ERROR:
ORA-01031: insufficient privileges


SQL> 

CDBに接続できましたが、プラガブル・データベースへの接続は失敗しています。
権限不足のエラーが発生しました。

  • C##nikaidoユーザの場合
[oracle@oracle12c pdbseed]$ sqlplus C##nikaido/subaru

SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 7 22:54:52 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Last Successful login time: Sat Apr 07 2018 22:47:39 +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> 
SQL> 
SQL> alter session set container=pdb2;

Session altered.

SQL> 

正常にpdb2に接続が出来ました。
コンテナデータベースへの接続権限だけではなく、コンテナ・データベース全体への接続権限も必要になる事が分かりました。


次回は、tnsnames.oraの修正とOracle Clientからの接続について書いていきたいと思います。