Oracle Database XE 18c on LXC (Oracle Linux7) on Proxmox VE 7

#はじめに
今更、オンプレでOracle DBを構築するなんて、奇特な環境×奇特なDB=かなり奇特な構築だとは思うが、メモとして書き残しておく。
ProxmoxはKVMとLXCコンテナをWeb UIで構築、管理ができて便利。しかも無料。
VMのまるごとバックアップもWeb UIでクリックだけで出来るので運用も楽。
LXCのテンプレートもたくさんあり、環境づくりが簡単に出来るのである。

しかし、Oracle DBのテンプレートは存在しないので、今回作ってみることにした。

Oracle Linux8で環境を作りたかったが、どうやっても上手く行かず断念。
Oracle Linux8だとなぜか、リスナがインストール中に落ちる。

|  | バージョン |
|:-:|:-:|
| Proxmox VE | 7.0 |
| Oracle Database XE | 18c |
| Oracle Linux | 7.9 |

#cgroupv1モードに変更
cgroupv2では、Oracle Linux7は起動しないため、Proxmox VE7のカーネルパラメーターを変更しcgroupv1モードにする

```
$ nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
　　↓
#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet systemd.unified_cgroup_hierarchy=0"

$ update-grub
$ reboot

```

#Oracle Linux7のテンプテートをダウンロード
ストレージのCTテンプレートから、「Download from Link」をクリックする
![Web キャプチャ_8-7-2021_92326_192.168.1.210.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/1bab9123-8ccd-6498-2acb-805eecbaad21.jpeg)

開く画面で以下のように入力

| 名称 | 設定値 |
|:-----------|:------------|
|URL|https://uk.lxd.images.canonical.com/images/oracle/7/amd64/default/20220601_07:46/rootfs.tar.xz|
|File Name|oracle-linux-7.tar.xz|

URLは3日しか有効でないため、ローカルのブラウザで以下のURLを開き、下層にあるrootfs.tar.xzを探して下さい。
https://uk.lxd.images.canonical.com/images/oracle/7/amd64/default/
ProxmoxにSSHでログインしているなら以下のコマンドを実行してください

```
wget -O /var/lib/vz/template/cache/oracle-linux-7.tar.xz https://uk.lxd.images.canonical.com/images/oracle/7/amd64/default/20220601_07:46/rootfs.tar.xz
```


#Oracle Linux7のLXCコンテナを作成
右上のCT作成からコンテナを作成。

:::note alert
CentOS7のコンテナのIPアドレスは固定してください。(IPv4は固定。IPv6はStaticにして空白に。)しないと、DB作成の際に失敗します。
:::

#oracle-database-preinstallをインストール
レポジトリがはじめから入っているため、そのままyumでインストール

```
yum -y update
yum -y install oracle-database-preinstall-18c
```

:::note alert
このまま、Oracle DBをインストールすると、エラーで落ちるため対策
VMが使えるメモリを算出しようとするとエラーが出てしまうため、以下のファイルを編集しコメントアウト。
:::

```
nano /etc/security/limits.d/oracle-database-preinstall-18c.conf
```

下記2行をコメントアウト

```
# oracle-database-preinstall-18c setting for memlock hard limit is maximum of 128GB on x86_64 or 3GB on x86 OR 90 % of RAM
#oracle   hard   memlock    134217728

# oracle-database-preinstall-18c setting for memlock soft limit is maximum of 128GB on x86_64 or 3GB on x86 OR 90% of RAM
#oracle   soft   memlock    134217728
```

#Oracle DBをインストール
XEは無料のため、Oracleのサーバーから直接ダウンロード&インストール可能です。

```
yum -y install https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-18c-1.0-1.x86_64.rpm
```

#DB構築
途中SYSとSYSTEMのパスワードを聞いてくるため入力。

```
/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:
```

#リスナと接続先変更
listener.oraのHOST名をIPアドレスに変更する
```
nano /opt/oracle/product/18c/dbhomeXE/network/admin/listener.ora

# listener.ora Network Configuration File: /opt/oracle/product/18c/dbhomeXE/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
```

tnsnames.oraも同様にHOST名もIPアドレスに変更する。

```
nano /opt/oracle/product/18c/dbhomeXE/network/admin/tnsnames.ora

# tnsnames.ora Network Configuration File: /opt/oracle/product/18c/dbhomeXE/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

ORCLCDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLCDB)
    )
  )

LISTENER_ORCLCDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
```

#サービスを起動

```
systemctl daemon-reload
systemctl enable oracle-xe-18c
systemctl start oracle-xe-18c
```

#Oracle DBを自動起動するように設定

```
nano /etc/oratab
XE:/opt/oracle/product/18c/dbhomeXE:Y
```

#oracleユーザーに移行

```
su - oracle
```

#oracleユーザーの環境変数を設定

```
nano .bash_profile

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export ORACLE_SID=XE
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/18c/dbhomeXE
export NLS_LANG=Japanese_Japan.AL32UTF8

PATH=$PATH:$ORACLE_HOME/bin

export PATH
```

#oracleユーザーの環境変数を反映


```
source .bash_profile
```

#今までの設定が正しいか確認
環境変数が正しいか。サービスが起動しているかの確認のため、リスナを見てみる。
接続中になればOK。

```
lsnrctl status
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=LXC_NAME)(PORT=1539)))に接続中
```

#PDBを自動起動するように設定。

```
sqlplus / as sysdba

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 XEPDB1                         MOUNT      NO


SQL> alter pluggable database XEPDB1 open;
SQL> alter pluggable database all save state;
```

メモリ割当を増やした場合は以下のコマンドを実行割当を増やす

```
SQL> alter system set memory_max_target = 3G scope=spfile;
SQL> alter system set memory_target = 3G scope=spfile;
SQL> alter system set inmemory_size= 1G scope=spfile;
SQL> alter system set inmemory_clause_default = 'INMEMORY MEMCOMPRESS FOR QUERY LOW PRIORITY MEDIUM' scope=spfile;
SQL> shutdown immediate
SQL> startup
```

#DBに接続してみる
接続文字列の形式：[ユーザー名]/[パスワード]@//[ホスト名]:[ポート]/[DBサービス名] [AS SYSDBA]

```
-- Container Database (CDB) に接続する場合：
sqlplus sys/GetStarted18c@//localhost:1539/XE as sysdba
     
-- Pluggable Database (PDB) に初めて接続する場合：
sqlplus sys/GetStarted18c@//localhost:1539/XEPDB1 as sysdba
```