Oracle Database EE 19c 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 EE | 19c |
| 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-19c
```

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

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

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

```
# oracle-database-preinstall-19c 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-19c 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をインストール
予めダウンロードしておいた、rpmをSFTPでVMに送り込んでおき、yumでインストール。
以下の例は、/tmpの下に送り込んだ例。

```
yum -y install /tmp/oracle-database-ee-19c-1.0-1.x86_64.rpm
```

#DB構築

```
/etc/init.d/oracledb_ORCLCDB-19c configure
```

無事完了すると以下のようなメッセージになる

```
Configuring Oracle Database ORCLCDB.
DB操作の準備
8%完了
データベース・ファイルのコピー中
31%完了
Oracleインスタンスの作成および起動中
32%完了
36%完了
40%完了
43%完了
46%完了
データベース作成の完了
51%完了
54%完了
プラガブル・データベースの作成
58%完了
77%完了
構成後アクションの実行
100%完了
データベースの作成が完了しました。詳細は、次の場所にあるログ・ファイルを参照してください:
/opt/oracle/cfgtoollogs/dbca/ORCLCDB。
データベース情報:
グローバル・データベース名:ORCLCDB
システム識別子(SID):ORCLCDB
詳細はログ・ファイル"/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log"を参照してください。

Database configuration completed successfully. The passwords were auto generated, you must change them by connecting to the database using 'sqlplus / as sysdba' as the oracle user.
```

#リスナと接続先変更
listener.oraのHOST名をIPアドレスに変更しておく

```
nano /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora

# listener.ora Network Configuration File: /opt/oracle/product/19c/dbhome_1/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/19c/dbhome_1/network/admin/tnsnames.ora

# tnsnames.ora Network Configuration File: /opt/oracle/product/19c/dbhome_1/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 oracledb_ORCLCDB-19c
systemctl start oracledb_ORCLCDB-19c
```

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

```
nano /etc/oratab
ORCLCDB:/opt/oracle/product/19c/dbhome_1:Y
```

#oracleユーザーに移行

```
su - oracle
```

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

```
nano .bash_profile

# User specific environment and startup programs

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

export ORACLE_SID=ORCLCDB
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1
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)))に接続中
```

#SYSとSYSTEMのパスワード設定&PDBを自動起動するように設定。

```
sql / as sysdba

SQL> alter user sys identified by sys_passwd;
SQL> alter user system identified by system_passwd;

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 ORCLPDB1                       READ WRITE NO  


SQL> alter pluggable database ORCLPDB1 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) に接続する場合：
sql sys/sys_passwd@//localhost:1521/ORCLCDB as sysdba

-- Pluggable Database (PDB) に初めて接続する場合：
sql sys/sys_passwd@//localhost:1521/ORCLPDB1 as sysdba
```