Oracle12c R2 をサイレントインストールする

# 概要
Oracle12c R2 をGUIが使用できない環境にインストールする必要が生じ、初めてサイレントインストールをしてみたため、手順を記録しておきます。
ここでは、OracleのインストールとSYSTEM表領域及びSYSAUX表領域の作成までを扱います。

# 環境
CentOS6.9 (Runlevel 3)
Oracle Database 12c Release 2 Enterprise Edition (12.2.0.1.0) Linux x86-64
（OTNライセンスだと Enterprise Edition になりますが、実際に構築するときはSE2なんだろうなぁ）

# 事前準備
- Oracle.comにユーザ登録し、OTNライセンスに同意の上でOracle12cをダウンロード
- CentOS6.9 64bit仮想環境を準備
- Oracle Databaseインストレーション・ガイドに従って依存パッケージをインストール
- Oracle Databaseインストレーション・ガイドに従ってカーネルパラメータを調整

# Oracle Databaseをインストール
Oracleをサイレントインストールするには、インストーラをサイレントモードで起動し、レスポンスファイルと呼ばれるファイルを読み込ませる必要があります。
## oracleユーザ作成
Oracle Databaseインストレーション・ガイドのとおり、ユーザとグループを作ります。

```
# groupadd -g 54321 oinstall
# groupadd -g 54322 dba
# groupadd -g 54323 oper
# groupadd -g 54324 backupdba
# groupadd -g 54325 dgdba
# groupadd -g 54326 kmdba
# groupadd -g 54327 racdba
# useradd -u 1200 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba -d /home/oracle oracle
```
## Oracleインストールディレクトリを作成
Oracleをインストールするディレクトリを作成し、oracleユーザで書き込みができるように権限を変更しておきます。

```
# mkdir -p /u01/app/oracle
# chown oracle:oinstall /u01/app/oracle
# mkdir -p /u01/app/oraInventory
# chown oracle:oinstall /u01/app/oraInventory
# chmod -R g+w /u01
```

## インストール
oracleユーザにスイッチし、作業ディレクトリを作成します。

```
$ mkdir install
```

作業ディレクトリにOracleからダウンロードしたアーカイブ "linuxx64_12201_database.zip" を展開します。

```
$ cd install
$ unzip linuxx64_12201_database.zip
```

展開されたファイルの中には、Oracleのインストーラと、レスポンスファイルのひな型があります。このレスポンスファイルをインストーラのオプションで指定することでCUIでのインストールができるようです。
ひな型をコピーします。

```
$ cp -p database/response/db_install.rsp oracle_install.rsp
```

コピーしたレスポンスファイルを編集します。
今回は以下の項目を変更しました。

| 項目 | 初期値 | 変更後の値 |
|:-----|:------|:-----------|
|oracle.install.option | | INSTALL_DB_SWONLY |
|UNIX_GROUP_NAME | | oinstall |
|INVENTORY_LOCATION | | /u01/app/oraInventory |
|ORACLE_HOME | | /u01/app/oracle/product/12.1.0/db_1 |
|ORACLE_BASE | | /u01/app/oracle |
|oracle.install.db.InstallEdition | | EE |
|oracle.install.db.OSDBA_GROUP | | dba |
|oracle.install.db.OSOPER_GROUP | | dba |
|oracle.install.db.OSBACKUPDBA_GROUP | | dba |
|oracle.install.db.OSDGDBA_GROUP | | dba |
|oracle.install.db.OSKMDBA_GROUP | | dba |
|oracle.install.db.OSRACDBA_GROUP | | dba |
|DECLINE_SECURITY_UPDATES | | true |


Oracleインストーラを起動します。

```
$ database/runInstaller -ignoreSysPrereqs -waitforcompletion -silent -responseFile /home/oracle/install/oracle_install.rsp
Oracle Universal Installerを起動中です...

一時領域の確認中: 500MBを超えている必要があります.   実際 34682MB    問題なし
スワップ領域の確認中: 150MBを超えている必要があります.   実際 4095MB    問題なし
Oracle Universal Installerの起動を準備中 /tmp/OraInstall2017-06-30_01-22-30PM. お待ちください...このインストール・セッションのログは次の場所にあります:
 /u01/app/oraInventory/logs/installActions2017-06-30_01-22-30PM.log
Oracle Database 12cのインストールが成功しました。
詳細は'/u01/app/oraInventory/logs/silentInstall2017-06-30_01-22-30PM.log'を確認してください。

rootユーザーとして次のスクリプトを実行します:
        1. /u01/app/oraInventory/orainstRoot.sh
        2. /u01/app/oracle/product/12.1.0/db_1/root.sh



Successfully Setup Software.
```

問題なくインストールできました。出力された指示通り、rootにスイッチして2つのスクリプトを実行します。

```
$ su - root
# /u01/app/oraInventory/orainstRoot.sh
権限を変更中 /u01/app/oraInventory.
グループの読取り/書込み権限を追加中。
全ユーザーの読取り/書込み/実行権限を削除中。

グループ名の変更 /u01/app/oraInventory 宛先 oinstall.
スクリプトの実行が完了しました。
# /u01/app/oracle/product/12.1.0/db_1/root.sh
Check /u01/app/oracle/product/12.1.0/db_1/install/root_oracle12c.local_2017-06-30_13-32-20-119378286.log for the output of root script
```
こちらも問題なく実行完了しました。

環境変数を設定します。

```
# su - oracle
$ export ORACLE_BASE=/u01/app/oracle
$ export ORACLE_HOME=${ORACLE_BASE}/product/12.1.0/db_1
$ export PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
$ export LD_LIBRARY_PATH=$ORACLE_HOME/lib
$ export ORACLE_SID=orcl
$ export NLS_LANG=Japanese_japan.ja16euctilde
$ export LC_ALL=ja_JP.utf8
```

※諸事情によりEUCです。

ここまででOracleのインストールはできましたが、SYSTEMもSYSAUXもありません。

# 表領域を作成

dbcaをサイレントモードで起動し、表領域の作成をします。

## データベースファイル用のディレクトリを作成

今回はデータベースファイルやredoログなどを`/data/${ORACLE_SID}`に配置するものとします。

```
$ sudo mkdir /data
$ sudo chown oracle.oinstall /data
```

## dbcaを起動する

```
$ dbca -silent -createDatabase -templateName New_Database.dbt -gdbName orcl -sid orcl -sysPassword hoge -systemPassword fuga -datafileDestination /data -recoveryAreaDestination $ORACLE_BASE/recovery_area -characterSet "JA16EUCTILDE" -nationalCharacterSet "AL16UTF16"
```

コマンド引数でパスワードを書いてしまうのは問題がある場合（通常は問題あるでしょうが）、sysPassword等のオプションを指定しなければ対話式で入力することができます。
じっと完了するのを待ちます。1時間くらいで作成されました。
dbcaが終了した時点でOracleが起動しています。sqlplusで操作ができます。

```
$ sqlplus system/fuga as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on 金 6月 30 17:17:31 2017

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



Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
```

## 未解決

表領域は作成されましたが、いくつか想定のとおりに行かない点がありました。調査しきれなかった点を列記します。

1. レスポンスファイルが読まれなかった
Oracleからダウンロードしたアーカイブの中には、database/response/dbca.rsp というレスポンスファイルのひな型がありますが、dbca にresponseFile オプションの引数に指定しても読み込まれていないようでした。間違いの箇所がわからなかったので、レスポンスファイルは使用せずにすべてコマンドのオプションとして指定しました。

2. Enterprise Managerが構成できなかった
Enterprise Manager を一緒に構成しようとして -emConfiguration DBEXPRESS -emExpressPort 5500 を指定しましたが、TCPポートが使用されているというエラーが発生しました。後で調べてみましたが使用しているプログラムはなく、原因がわからなかったので Enterprise Managerの構成は断念しました。

3. テンプレートファイルが無視されている
/u01/app/oracle/product/12.1.0/db_1/assistants/dbca/templates/ に表領域のテンプレートとなるファイルがあり、templateNameオプションで指定できます。が、その内容も反映されてないようでした。

# 終わりに
いくつか未解決のままになっていますが、実際に構築する際にはサポートがある（はず）なので、これで終了することとします。