Hacking Oracle Database XE 18c インストール編

# 1. 久しぶりにOracle Database XEがリリース

長年11.2でバージョンが止まっていたOracle Database Express Edition（以降Oracle Database XEもしくはOracle XE）。ニューバージョンが待たれるなか、ようやく昨年2018年10月に「Oracle Database 18c Express Edition」としてリリースされた。

詳しいことは「[Oracle Database XE公式サイト](https://www.oracle.com/jp/database/technologies/appdev/xe.html)」などを見てもらうとして、 **今回はその中身を少し探ってみたい。今回はインストール編。**

### 1-1. 動作確認環境
Oracle Database XEはOracle Linux 6/7やRed Hat Enterprise Linux 6/7などのLinuxと、Windows 7以降（64bit）に対応している。今回はOracle Linux 7を使用する。

* [Linuxのシステム要件](https://docs.oracle.com/en/database/oracle/oracle-database/18/xeinl/system-requirements.html)
* [Windowsのシステム要件](https://docs.oracle.com/en/database/oracle/oracle-database/18/xeinw/requirements.html#GUID-4A3A99E7-655E-4202-A7DD-48257DE2B970)

### 1-2. 参考資料
手始めにこのあたりのドキュメントをあさってみよう。

* [Oracle Database XE英語サイト](https://www.oracle.com/database/technologies/appdev/xe.html)
* [Oracle Database 18c XE Installation Guide for Linux x86-64](https://docs.oracle.com/en/database/oracle/oracle-database/18/xeinl/)
* [Oracle Database XE日本語サイト](https://www.oracle.com/jp/database/technologies/appdev/xe.html)
* [Oracle Database 18c XE インストレーション・ガイドfor Linux x86-64](https://docs.oracle.com/cd/E96517_01/xeinl/index.html)

# 2. Oracle Database XEをダウンロードする

Oracle Database XEをダウンロードするには次の方法がある。

1. OracleのWebサイトにログインし、ライセンスに同意してダウンロードする
2. OracleのWebサイトから直接ダウンロードする（2020年2月から可能）
3. OCIのol7_oci_includedリポジトリからダウンロードする（OCIのみ）
 
1は従来の方法で、OCI Computeに限り3の方法が可能だった。そして2020年2月にOracle Database XEの[ライセンス条項](https://www.oracle.com/downloads/licenses/oracle-free-license.html)が改訂され、OCI以外でも直接ダウンロード／インストールできるようになった（[参考](https://blogs.oracle.com/database/oracle-database-18c-xe-now-under-the-oracle-free-use-terms-and-conditions-license-v2)）。

今回は後続作業の都合で、一度ダウンロードしてからインストールする。OCIか、それ以外かで手順が異なるので適切な方法で実施してほしい。

### 2-1. OCI Computeでダウンロードする

OCI Computeではol7_oci_includedリポジトリにXEが含まれている。そのため直接ダウンロード／インストールできる。

**ダウンロードするとき**


```shell-sesshon
yumdownloader oracle-database-xe-18c
```

**直接インストールするとき**


```shell-sesshon
yum install oracle-database-xe-18c
```


### 2-2. OCI以外の環境で直接ダウンロードする

ファイルが見つからない等のエラーが出たときは[Oracle Database XE Downloadsページ](https://www.oracle.com/database/technologies/xe-downloads.html)でURIを確認すること。

**ダウンロードするとき**

```shell-sesshon
wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-18c-1.0-1.x86_64.rpm
```

**直接インストールするとき**

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

# 3. Oracle Database XEのRPMを調べてみる
マニュアルを読みつつ、インストールする前にOracle Database XEのRPMを調べてみよう。

### 3-1. なぜOracle LinuxとRHELではインストール手順が違う？

はじめに以下のマニュアルを見て気づくのは、Oracle LinuxとRHELでは、わずかにインストール手順が違うこと。RHELでは`oracle-database-preinstall-18c`を手動でインストールしている。

* [Oracle Database XE Quick Start](https://www.oracle.com/database/technologies/appdev/xe/quickstart.html)
* [インストレーション・ガイドfor Linux x86-64](https://docs.oracle.com/cd/E96517_01/xeinl/procedure-installing-oracle-database-xe.html)

`oracle-database-preinstall-18c`は「Oracle Preinstallation RPM」もしくは「Database Preinstallation RPM」と呼ばれるもので、カーネルパラメータの設定やユーザー作成など、インストールの前準備をするパッケージだ。

RHELではOracle Database XEをインストールする前に`oracle-database-preinstall-18c`を手動でインストールしている。

```shell_session:RHEL7のインストール手順
# curl -o oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm
# yum -y localinstall oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm
```

Oracle Database XE本体の依存性を確認する。`--requires`では、このパッケージが必要としているパッケージやファイルを表示できる。

`oracle-database-preinstall-18c`があり、Oracle LinuxのYumリポジトリに含まれているので自動インストールされる。

```shell_session
$ rpm -qp --requires oracle-database-xe-18c-1.0-1.x86_64.rpm
file
net-tools
oracle-database-preinstall-18c ★ここにある
/bin/sh
/bin/sh
/bin/sh
/bin/sh
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1
```

逆にRHELのYumリポジトリには`oracle-database-preinstall-18c`が含まれないので手動インストールする必要があったのだ。


そういえば昔のバージョンの「Oracle Preinstallation RPM」はOracle Linuxのリポジトリだけにある`kernel-uek`をrequireしていて、そもそもRHELでは使えなかったことを思い出した。当時は

**「ずいぶん、いじわるなことをしている」**

と思ったっけ。

### 3-2. RPMパッケージの中身を調べてみる

いくつのファイルが含まれているのだろうと思い調べてみると、なんと2万ファイル以上！　調べる気が無くなる。

```shell_session
$ rpm -qlp oracle-database-xe-18c-1.0-1.x86_64.rpm | wc -l
22683
```

といいつつ、Oracle Database本体関連を除外してみると、たったの３つ。ファイル名から判断すると「起動スクリプト」と「設定ファイル」、「ライセンスのREADME」。

```shell_session
$ rpm -qlp oracle-database-xe-18c-1.0-1.x86_64.rpm | grep -v /opt/oracle/product
---以下出力---
/etc/init.d/oracle-xe-18c
/etc/sysconfig/oracle-xe-18c.conf
/usr/share/doc/oracle-xe-18c/LICENSE
```

そして得意の`--scripts`攻撃。RPMインストールの前後で実行されるシェルスクリプトを表示できる。

```shell_session
$ rpm -qp --scripts oracle-database-xe-18c-1.0-1.x86_64.rpm
```

すごく長いのでステップ数を調べてみると600行近い。まったく無いものや数十行程度のものが多いなか、これまた読む気が無くなる。

```shell_session
$ rpm -qp --scripts oracle-database-xe-18c-1.0-1.x86_64.rpm | wc -l
582　★行数をカウント
```

まずはpreinstallセクションを見るのが鉄則。`/var/log/oracle-database-xe-18c/results/oraInstall.log`というインストールログを生成しているようだ。

```shell_session:preinstallセクションの一部
preinstall scriptlet (using /bin/sh):
#!/bin/sh
#execute pre install validations

#Create the corresponding log for the RPM installation
RPM_LOG_LOCATION=/var/log/oracle-database-xe-18c/results
RPM_LOG_FILE=$RPM_LOG_LOCATION/oraInstall.log
```

面白そうなのは、この箇所。実はDebienやUbuntuにも対応しているのか？

```shell_session:preinstallセクションの一部。続き
if [ -f /etc/debian_version ]; then
    DISTRO='DEBIAN'
elif [ -f /etc/ubuntu_version ]; then
    DISTRO='UBUNTU'
elif [ -f /etc/redhat-release ]; then
    DISTRO='REDHAT'
elif [ -f /etc/lsb-release ]; then
    DISTRO_NAME=$(lsb_release -si)
    DISTRO="$(tr [a-z] [A-Z] <<< $DISTRO_NAME)"
else
    DISTRO=$(uname -s)
fi


# RPM upgrade check applicable only when running RPM installation
if [ "$DISTRO" != 'DEBIAN' ] && [ "$DISTRO" != 'UBUNTU' ]; then
    # In case of upgrade skip the pre install checks
    if [ "$1" != "1" -o -n "$2" ]
    then
       exit 0
    fi
else
    # On debian based distros the following steps are needed
    ln -s /usr/bin/awk /bin/awk
    mkdir -p /var/lock/subsys
    touch /var/lock/subsys/listener
    chmod 755 /var/lock/subsys/listener
fi
```

# 4. Oracle Database XEをインストールしてみる

そこそこに切り上げて、マニュアル通りにインストールしてみる。なお`/opt`に約10GBytesのサイズが必要なので、十分なディスク領域があることを確認すること。SSD搭載のマシンだったせいか、10分もかからずに終了。

```shell_session
$ sudo -s
# yum -y localinstall oracle-database-xe-18c-1.0-1.x86_64.rpm
```

インストールログを見ると、興味深いことは書かれていなかった。

```shell_session:/var/log/oracle-database-xe-18c/results/oraInstall.log
[INFO] Starting the installation process of the Oracle Database...
2019年05月23日-午前03時27分58秒
[INFO] Registering Oracle home to the Oracle inventory...
[INFO] Oracle home registered to the Oracle inventory.
[INFO] Executing post installation scripts...
[INFO] Setting up inventory as it has not been setup on this machine.
[INFO] Configuring ADR directories...
[INFO] ADR directories configured.
[INFO] Post installation scripts executed successfully.
[INFO] Oracle home installed successfully and ready to be configured.
```

実は「Oracle Preinstallation RPM」にもログがある。長いので中身は紹介しないが、興味のある人は見てほしい。

* `/var/log/oracle-database-preinstall-18c/results/orakernel.log`

# 5. データベースを作成してみる

いままでDBCAでやっていたデータベースの作成は`/etc/init.d/oracle-xe-18c configure`で開始できる。パスワードの要件が表示されるので注意して入力すること。


なおポート番号やキャラクタセットを変更するときは、事前に`/etc/sysconfig/oracle-xe–18c.conf`ファイルを修正しておくこと。

```shell_session
# /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 u
ppercase 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:★確認のためのパスワード入力
```

```shell_session:/etc/sysconfig/oracle-xe–18c.conf
#This is a configuration file to setup the Oracle Database.
#It is used when running '/etc/init.d/oracle-xe-18c configure'.

# LISTENER PORT used Database listener, Leave empty for automatic port assignment
LISTENER_PORT=

# EM_EXPRESS_PORT Oracle EM Express URL port
EM_EXPRESS_PORT=5500

# Character set of the database
CHARSET=AL32UTF8

# Database file directory
# If not specified, database files are stored under Oracle base/oradata
DBFILE_DEST=

# SKIP Validations, memory, space
SKIP_VALIDATIONS=false
```

パスワードの確認が終わるとデータベースの作成がはじまる。以下の出力にはパスワード入力のような表示もあるが、実際にはプログラム内で設定され、何も入力は必要なかった。

SSDパワーの恩恵もあって、これも10分くらいで終了。

```shell_session
Listener configuration succeeded.
Configuring Oracle Database XE.
SYSユーザー・パスワードを入力してください:
*********
SYSTEMユーザー・パスワードを入力してください:
********
PDBADMINユーザー・パスワードを入力してください:
**********
DB操作の準備
7%完了
データベース・ファイルのコピー中
29%完了
Oracleインスタンスの作成および起動中
30%完了
31%完了
34%完了
38%完了
41%完了
43%完了
データベース作成の完了
47%完了
50%完了
プラガブル・データベースの作成
54%完了
71%完了
構成後アクションの実行
93%完了
カスタム・スクリプトを実行中
100%完了
データベースの作成が完了しました。詳細は、次の場所にあるログ・ファイルを参照してください:
/opt/oracle/cfgtoollogs/dbca/XE。
データベース情報:
グローバル・データベース名:XE
システム識別子(SID):XE
詳細はログ・ファイル"/opt/oracle/cfgtoollogs/dbca/XE/XE.log"を参照してください。

Connect to Oracle Database using one of the connect strings:
     Pluggable database: ol7-oradbxe/XEPDB1
     Multitenant container database: ol7-oradbxe
Use https://localhost:5500/em to access Oracle Enterprise Manager for Oracle Database XE
```

同時に他のターミナルで`top`と`iotop`を立ち上げておくと、動いているのがよく分かって面白いかも知れない。
![oradbxe01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ecc152f0-ee5e-49b7-1627-6088be646315.jpeg)

# 6. おわりに
何か面白いことが発見できるかと思ったけれど特になし。このあとの続きを書くべきか。うーん。