[Oracle Cloud Infrastructure]Oracle Database 18c Express Editionをインストールしてアプリケーション・コンテナやPDBを作る

Oracleのデータベースには、無償のExpress Editionがあります。
以下の制限がありますが、ISVが自分のパッケージに小さなOracle DBをBundleさせたい場合など小規模のデータベースで良ければ十分に使えると思います。
https://www.oracle.com/jp/database/technologies/appdev/xe.html

リソース：
最大12GBのユーザー・データ
最大2GBのデータベースRAM
最大2つのCPUスレッド
最大3つのプラガブル・データベース

#Oracle Database 18c Express Editionのインストールと初期データベース構築
試しに、以下の手順に沿ってExpress Databaseをインストール・構築しました。
https://docs.oracle.com/cd/E96517_01/xeinl/

Oracle Cloud Infrastructureで任意のCompartmentにVM.Standard2.2のComputeインスタンスを1つ作成。
そこにExpress Editionをインストールしました。

１．rootユーザにスイッチ

```
[opc@instance-20210423-1501 ~]$ sudo -s
```

２．プリインストールパッケージをダウンロード・インストール

```
[root@instance-20210423-1501 opc]# curl -o oracle-database-preinstall-18c-1.0-1.el6.x86_64.rpm
[root@instance-20210423-1501 opc]# yum -y localinstall oracle-database-preinstall-18c-1.0-1.el6.x86_
64.rpm
```

３．Oracle Technology Networkから、Oracle Database RPMをダウンロードします。
https://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html

４．ダウンロードしたRPMをインストールします。

```
[root@instance-20210423-1501 ~]# yum -y localinstall oracle-database-xe-18c-1.0-1.x86_64.rpm
```

５．サービス構成スクリプトを実行して、データベースを構築します。
　 このコマンドを実行すると、oracleユーザの作成からDB内のsys、system、pdbadminユーザを作成してくれます。

```
[root@instance-20210423-1501 tmp]# /etc/init.d/oracle-xe-18c configure
Specify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:
Confirm the password:
Configuring Oracle Listener.
Listener configuration succeeded.
Configuring Oracle Database XE.
Enter SYS user password:
************
Enter SYSTEM user password:
************
Enter PDBADMIN User Password:
*********
Prepare for db operation
7% complete
Copying database files
29% complete
Creating and starting Oracle instance
30% complete
31% complete
34% complete
38% complete
41% complete
43% complete
Completing Database Creation
47% complete
50% complete
Creating Pluggable Databases
54% complete
71% complete
Executing Post Configuration Actions
93% complete
Running Custom Scripts
100% complete
Database creation complete. For details check the logfiles at:
 /opt/oracle/cfgtoollogs/dbca/XE.
Database Information:
Global Database Name:XE
System Identifier(SID):XE
Look at the log file "/opt/oracle/cfgtoollogs/dbca/XE/XE.log" for further details.

Connect to Oracle Database using one of the connect strings:
     Pluggable database: instance-20210423-1501/XEPDB1
     Multitenant container database: instance-20210423-1501
Use https://localhost:5500/em to access Oracle Enterprise Manager for Oracle Database XE
[root@instance-20210423-1501 tmp]#
``` 

６．oracleユーザにスイッチし、環境変数をセットしてリスナーの実行状況の確認やsqlplusの実行が可能か確認します。

```
[oracle@instance-20210423-1501 ~]$ . oraenv
ORACLE_SID = [oracle] ? XE
The Oracle base has been set to /opt/oracle
[oracle@instance-20210423-1501 ~]$ echo $ORACLE_HOME
/opt/oracle/product/18c/dbhomeXE
[oracle@instance-20210423-1501 ~]$ which lsnrctl
/opt/oracle/product/18c/dbhomeXE/bin/lsnrctl
[oracle@instance-20210423-1501 ~]$ lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 23-APR-2021 11:45:47

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=instance-20210423-1501.subnet04231504.vcn04231504.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date                23-APR-2021 11:32:20
Uptime                    0 days 0 hr. 13 min. 26 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   /opt/oracle/product/18c/dbhomeXE/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/instance-20210423-1501/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hogehoge.oraclevcn.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=127.0.0.1)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/XE/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "XE" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "c0a3464253cb487ae0534c00000ae93f" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "xepdb1" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@instance-20210423-1501 ~]$
[oracle@instance-20210423-1501 ~]$ sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Fri Apr 23 11:46:37 2021
Version 18.4.0.0.0

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

SQL> conn / as sysdba
Connected.
SQL> select name, open_mode from v$pdbs;

NAME          OPEN_MODE
------------- ----------
PDB$SEED      READ ONLY
XEPDB1        READ WRITE
```

これでPDBを1つ搭載したデータベースができました。


#PDB最大数制限抵触確認
ここで、PDBが最大3つまでということを確認しようと思い、以下のような構成を作ってみます。

| PDB名    | 用途                   |
|:-------:|:----------------------:|
|APPCON   |アプリケーション・コンテナ|
|CUSTOMER1|エンドユーザ1用PDB       |
|CUSTOMER2|エンドユーザ2用PDB       |

サンプルで作ったXEPDB1をDropしておき、以下を実行してアプリケーション・コンテナ、アプリケーションPDBを作成します。

```
SQL> CREATE PLUGGABLE DATABASE appcon AS APPLICATION CONTAINER ADMIN USER appcon IDENTIFIED BY [password] FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/appcon/');

Pluggable database created.

SQL>alter session set container=APPCON;

Session altered.

SQL> CREATE PLUGGABLE DATABASE customer1 ADMIN USER customer1 IDENTIFIED BY [password]  FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/customer1/');

Pluggable database created.

SQL> CREATE PLUGGABLE DATABASE customer2 ADMIN USER customer2 IDENTIFIED BY Kazuma0215  FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/customer2/');

Pluggable database created.

SQL> select name, open_mode from v$pdbs;

NAME       OPEN_MODE
---------- ---------------
PDB$SEED   READ ONLY
CUSTOMER2  READ WRITE
APPCON     READ WRITE
CUSTOMER1  READ WRITE

SQL>
```

これでアプリケーション・コンテナ1つ、アプリケーションPDB2つの構成ができました。
ここから、アプリケーション・コンテナでさらにもう1つアプリケーションPDBを作成してみます。

```
SQL> CREATE PLUGGABLE DATABASE customer3 ADMIN USER customer3 IDENTIFIED BY [password]  FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/customer3/');
CREATE PLUGGABLE DATABASE customer3 ADMIN USER customer3 IDENTIFIED BY [password]  FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/customer3/')
                          *
ERROR at line 1:
ORA-65010: maximum number of pluggable databases created


SQL>
```

ORA-65010が出力され、PDB制限数に抵触してCreateできませんでした。