OCI Database(DBaaS) の PDB に sqlplus で接続してみる。(Oracle Cloud Infrastructure)

表題の通り、OCI(Oracle Cloud Infrastructure) Database(DBaaS) の PDB に
sqlplus で接続してみます。下記の構成で試すやで彡(ﾟ)(ﾟ)

 > Compute(Oracle Client, sqlplus) ⇒ (Private Subnet) ⇒ DBaaS(PDB)

# 1. PDB, MTA(Multitenant Architecuture) とは？

PDB, MTA(multitenant architecture) は Oracle Database 12cR1以降の機能で、
一つの管理用DB(CDB)上に複数のコンテナ・データベース(PDB)を作成できる機能なんやで彡(ﾟ)(ﾟ)

詳細やメリットはマニュアルや公開資料を参照してね。

 > Oracle Database 12c マルチテナント・アーキテクチャとプラガブル・データベース
 > https://www.oracle.com/technetwork/jp/ondemand/branch/dosanko-3rd-mta-2844750-ja.pdf
 > 
 > Oracle Databaseデータベース概要, 18c
 > マルチテナント・アーキテクチャ
 > https://docs.oracle.com/cd/E96517_01/cncpt/introduction-to-oracle-database.html#GUID-ED16D715-761B-4F8B-8503-BC058E216D2F


# 2. OCI Database(DBaaS)の作成

ここはマニュアルや他の方のブログを見ませう彡(ﾟ)(ﾟ)

 > クラウドでOracle Databaseを使う - Oracle Cloud Infrastructureを使ってみよう(その7)
 > https://community.oracle.com/docs/DOC-1019568
 >
 > データベース・デプロイメントの作成
 > https://docs.oracle.com/cd/E83857_01/paas/database-dbaas-cloud/csdbi/create-db-deployment-overview.html


# 3. DBaaSのIPアドレス／管理サービス(CDB)名の参照とポート開放

ここは下記ブログを参照やで彡(ﾟ)(ﾟ)

 > [Oracle Cloud] SQL DeveloperでDBaaSに接続してみた
 > http://itedge.stars.ne.jp/oracle-cloud-dbaas_sql-developer/

OCIコンソールの下記から簡易接続（ホスト名:ポート番号/サービス名）の接続文字列として確認可能です。
![Admin_Service.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/4e6d836d-511f-a1ba-a72c-d61836f61b23.jpeg)


下記のホスト名／ポート番号／管理サービスに接続するものとします。
※これらのホスト名／管理サービス(CDB)名は架空のものです。

 > ホスト名(Private)　：dbname.subnetname.vcnname.oraclevcn.com
 > ポート番号　　　　 ：1521
 > 管理サービス(CDB)名：dbname_cdb32r.subnetname.vcnname.oraclevcn.com
 > 管理サービス(CDB)への接続文字列(簡易接続)：dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_cdb32r.subnetname.vcnname.oraclevcn.com

# 4. 管理サービス(CDB)への接続確認とPDB名(PDBサービス名)確認

Compute への Oracle Client のインストールは下記記事を参照彡(ﾟ)(ﾟ)

 > Oracle Cloud(OCI)のIaaSからDbaaSへSQLPlusで接続してみた
 > https://qiita.com/feifo/items/d21b7050d0d4799f5d47

Compute にインストールした Oracle Client の sqlplus から管理サービス(CDB)にSYSで接続してみます。
なおこの後は特に断りが無い限り、接続文字列は簡易接続（ホスト名:ポート番号/サービス名）です。

 > 8.1 簡易接続ネーミング・メソッドの理解
 > https://docs.oracle.com/cd/E96517_01/netag/configuring-naming-methods.html#GUID-B0437826-43C1-49EC-A94D-B650B6A4A6EE

```sql
export ORACLE_HOME=/home/opc/app/opc/product/18.0.0/client_1
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib
export TNS_ADMIN=${ORACLE_HOME}/network/admin
export PATH=${ORACLE_HOME}/bin:${PATH}

sqlplus /nolog
CONNECT SYS/xxxxxxxxxxxxxxx@dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_cdb32r.subnetname.vcnname.oraclevcn.com AS SYSDBA
SHOW CON_NAME
SHOW PDBS
```

結果は以下の通り。CDB(CDB$ROOT)に接続できてるやね彡(ﾟ)(ﾟ)

```sql
SQL> CONNECT SYS…
Connected.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

SQL> SHOW PDBS

    CON_ID CON_NAME   OPEN MODE  RESTRICTED
---------- ---------- ---------- ----------
         2 PDB$SEED   READ ONLY  NO
         3 AYSPDB2    READ WRITE NO ★これに接続する。
SQL>
```

上記のPDB名と管理サービス(CDB)名より、PDBサービス名は下記の通りとなります。

 > ■管理サービス(CDB)名
 > dbname_cdb32r.subnetname.vcnname.oraclevcn.com
 > ^^^^^^^^^^^^^
 > ↓
 > ■PDBサービス名
 > ayspdb2.subnetname.vcnname.oraclevcn.com

なお DBaaS の OS にログイン可能な場合は、DBaaS OS の opcユーザーで接続して、
gridユーザーにsu後に lsnrctl statusコマンドを実行すれば、より確実にPDBサービス名を確認できます。

```shell
# DBaaS の OS に opcユーザーで接続
sudo su - grid
lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 19-FEB-2019 11:20:38

Copyright (c) 1991, 2017, Oracle.  All rights reserved.
:
Services Summary...
:
Service "dbname_cdb32r.subnetname.vcnname.oraclevcn.com" has 1 instance(s).
  Instance "dbname", status READY, has 2 handler(s) for this service...
Service "ayspdb2.subnetname.vcnname.oraclevcn.com" has 1 instance(s). ★このPDBサービスに接続する。
  Instance "dbname", status READY, has 2 handler(s) for this service...
:
The command completed successfully
```

# 5. PDBにSYSで接続してユーザー作成＆権限付与

上記で確認したPDBサービスにSYSで接続して、PDBに一般ユーザーを作成＆権限付与します。

```sql
sqlplus /nolog
CONNECT SYS/xxxxxxxxxxxxxxx@dbname.subnetname.vcnname.oraclevcn.com:1521/ayspdb2.subnetname.vcnname.oraclevcn.com AS SYSDBA
                                                                         ^^^^^^^ここが違う
SHOW CON_NAME
CREATE USER AYSHIBAT IDENTIFIED BY xxxxxxxxxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT DBA TO AYSHIBAT;
```

結果は下記の通りです。

```sql
$ sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Feb 19 11:43:26 2019
Version 18.5.0.0.0

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

SQL> CONNECT SYS/xxxxxxxxxxxxxxx@dbname.subnetname.vcnname.oraclevcn.com:1521/ayspdb2.subnetname.vcnname.oraclevcn.com AS SYSDBA
Connected.
SQL> SHOW CON_NAME

CON_NAME
------------------------------
AYSPDB2
SQL> CREATE USER AYSHIBAT IDENTIFIED BY xxxxxxxxxxxxxxx
  2  DEFAULT TABLESPACE USERS
  3  TEMPORARY TABLESPACE TEMP;

User created.

SQL> GRANT DBA TO AYSHIBAT;

Grant succeeded.
```

# 6. PDBに作成した一般ユーザーで接続

PDBに作成した一般ユーザーで接続してみます。

```sql
sqlplus /nolog
CONNECT AYSHIBAT/xxxxxxxxxxxxxxx@dbname.subnetname.vcnname.oraclevcn.com:1521/ayspdb2.subnetname.vcnname.oraclevcn.com
SHOW CON_NAME
```

結果は下記の通りです。

```sql
sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Feb 19 11:47:58 2019
Version 18.5.0.0.0

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

SQL> CONNECT AYSHIBAT/xxxxxxxxxxxxxxx@dbname.subnetname.vcnname.oraclevcn.com:1521/ayspdb2.subnetname.vcnname.oraclevcn.com
Connected.
SQL> SHOW CON_NAME

CON_NAME
------------------------------
AYSPDB2
```

DBaaS の PDB に一般ユーザーで接続できたやで！彡(^)(^)

# 7. まとめ

上記 4. の PDB名(PDBサービス名)確認がひと手間ですやね！彡(ﾟ)(ﾟ)

管理サービス(CDB)名への接続文字列はコンソール画面に表示できてるんやから、
PDBへの接続文字列も同様にコンソール画面に表示して欲しいもんです(ﾟεﾟ`)

なおこの記事は 生Java(JDBC Thin) to DBaaS接続編、
生Java(JDBC Thin) to Autonomous(ADW/ATP)接続編に続く予定……彡(ﾟ)(ﾟ)