CentOS7にOracle12cをインストールして使う方法＋トラブルシューティング

# はじめに
先日VirtualBoxで構築した仮想環境のCentOSにOracle12cをインストールしました。
インストーラを使用して画面通りインストール、DBを構成したのですが、DBの構成までやって次の日起動したらなぜか起動できませんでした。

仕方なしにエラーから起動できない原因を調査して起動できるようにしたのですが、不具合？なのか、エラーの原因を解決してもまた次のエラーが現れるループにしばらく捕まったので、インストールからエラー復旧までの一連の対応を記載します。

同様の事象に悩まされている方は一読してみてください。

当記事は筆者が別に執筆している記事の関連記事です。

# 1. 環境情報
インストール環境情報です

|環境|製品やバージョンなど|特記事項|
|:---|:-------------------|:-------|
|OS|CentOS7||
|インストール物|Oracle12cR2||

# 2. Oracle12cインストール
まず、Oracle12cのインストール方法です。
詳しく記載されていて参考になるWebはたくさんあるので、当記事では筆者が独自に行った操作や、気を付けるべきポイントなどを記載します。
当記事では、[こちらの事前準備](https://www.yamamanx.com/virtualbox-centos-7-oracle-1/)と[こちらのインストール方法](https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=2)に記載されている手順をもとにインストールを行うことを前提とします。

## 2.1. ダウンロード
Oracle Technology Network(以下OTNと呼びます)からOracleのインストーラをダウンロードします。
インストール先はCentOS7なので、Linux64ビット用をダウンローしてください。

## 2.2. インストール前設定
こちらは特にリンク先の参考記事の通りやれば筆者の環境では問題ありませんでした。
インストールディレクトリなどは必須ではありませんが、やった方があとあと困ったときにツリーとかが参考記事と合うので便利だと思います。

## 2.3. インストール
### 2.3.1. インストーラの起動
ダウンロードしたインストーラを解凍し、起動します。
GUIから起動しても構いませんし、端末からコマンドで起動してもインストーラの画面は開きます。

OracleはインストーラではとDBの構成が一気にできますが、Linuxでやるとリスナーがインスタンスを見失って二度と認識できないなどの事象が発生することがあります。
そのため、Oracle自体のインストールとDBの構成は別々に行うことをオススメします。
もうちょっといくなら、インストール後にOSごとバックアップを取っておくとなおよろしいかと思います。
読者の皆さんが構築している仮想環境の性能次第ですが、Oracleのインストールは結構時間がかかりますのでorz

### 2.3.2. インストール操作
話はそれましたが、インストールは画面の通り進んでいけば簡単にできます。
すべてデフォルトでもインストールできますが、前提としているインストール方法のスクリーンショットに従ったオプションを選択してインストールしてください。
ちなみに、筆者はStandard Editionを選択してインストールしました。

途中表示されるインストール情報はたまーに見返したくなるので、控えを取っておくか、ファイルに出力しておいた方が無難です。

# 3. リスナーの構成
Oracleのインストールが完了したところで、リスナーを構成します。
「データベース作る前にやることなの？」と思う方もいらっしゃるかもしれませんが、データベースの作成過程にリスナーを選択するところがありますので、先に作っておきます。
リスナーは[こちら](https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=3)を参考に構成してください。

# 4. データベースの作成
リスナーまで構成したところでデータベースを作成します。
データベースの作成についても[こちら](https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=4)を参考にすれば、筆者環境では問題ありませんでした。
ただし、メモリのサイズなどはご利用の環境に合わせて調整してください。

あと、Enterprise Managerは一緒に構築しておいた方が無難です。
特に筆者初心者のような初心者は、画面がないとどうにもならないこともありますのでorz

# 5. データベース作成の完了
ここまでで、Oracleのインストールからデータベースの作成まではすべて完了です。
さっそく接続してみましょう。
ご存知かと思いますが、OracleにはSQL*PlusというOracleにクエリを発行したりできるCLIのツールが付属しています。
そのSQL*Plusを使ってできたてホヤホヤのデータベースにつないでみます。

## 5.1. 環境変数の設定
SQL*Plusを使用する場合、並びにOracle同梱の各種ツールを使用するためには、設定しなければならない環境変数がいくつか存在します。
環境変数はセッションごとに設定してもよいのですが、めんどくさいので.bash_profileに書いておきましょう。
```shell:.bash_profile
export ORACLE_SID=作成したDBのSID
# SQL*Plusで使用する文字コードです。環境に合わせたものを設定してください。
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8

# $ORACLE_BASEと$ORACLE_HOMEは必ずしも設定しなくて構いませんが、
# コマンドの検索パスに通しておくと便利なので設定しておく方がよいでしょう。
# SQL*Plusを実行するにも、$ORACLE_HOME/binをパスに通しておくと便利です。
export ORACLE_BASE=インストールしたOracleのORACLE_BASE
export ORACLE_HOME=インストールしたOracleのORACLE_HOME
```
## 5.2. SQL*Plus起動
では、さっそく起動します。
SYSDBAユーザで起動しましょう。
インストールした端末でログインするので、OS認証を使いましょう。
リスナー経由でもログインはできますが、それは後から飽きるほどやると思うので。

　起動コマンド:`sqlplus sys/設定したパスワード as sysdba`

```shell:コンソール出力
[oracle@localhost ~]$sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on 日 6月 24 18:29:46 2018

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

アイドル・インスタンスに接続しました。

SQL>
```
これでOracleの管理ユーザでログインできることまで確認できました。
あとはなんでもいいのですが、SQLとか実行してみましょう。
ここではシステム日付でも取得してみます。

```shell:システム日付取得
SQL> select SYSDATE from DUAL;

SYSDATE
--------
18-06-24
```
無事、SQLも実行できました！
これで、Oracleのインストールからデータベースの構成は完了です。
これからは、学習用でも個人的なツール用でもガシガシ使ってまいましょう。

# 6. トラブルシューティング
冒頭に記載しましたが、筆者の環境ではインストール後、次に起動しようとしたら、エラーが連発して結構ハマりました。
その時に対応した内容を記載します。

期待していた方すみません。
コンソールの出力内容などは保存してあったものを消してしまったので残ってません。

また、これからのトラブルシューティングは、一応エラーから原因を特定していますが、互換性の値など、本来は「やらなくていい」はずの対応もしています。
筆者の環境では「そうしなければ動かなかった」または「そうすれば動いた」というものを記載していますので、必ずしも正しい対応であるとは限りませんのでご容赦ください。

## 6.1. 共有メモリーの容量が足りない
Oracle起動時のチェックで、共有メモリーの容量が足りないエラーが発生した場合の対処方法です。
この場合、解決方法については2つあります。

　①共有メモリーの容量を増やす
　②Oracleの設定を使用可能な共有メモリーの範囲に収める

上記2つの解決方法のうち、筆者①で解決したので、ここでも①のやり方を記載します。

共有メモリーの容量を増やすには、/etc/fstabに「tmpfs」値を指定します。
tmpfsの行がない場合は、末尾に追加すればOKです。

```shell:/etc/fstab
tmpfs /dev/shm tmpfs rw,exec,size=1024M 0 0
```
ここではOracleが使用する共有メモリーの容量以上を指定しておけば値はいくらでも問題ありません。
筆者は容量を1GBとしました。
行を追加したらOSを再起動しましょう。
再起動後、起動チェックはパスできるはずです。

## 6.2. 初期化パラメータファイルを生成
初期化パラメータファイルがないらしいエラーに出会ったので、初期化パラメータファイルを確認しました。
すると、なぜか初期化パラメータファイルが生成されていなかったので、初期化パラメータファイルを生成しました。

### 6.2.1. パラメータファイルの生成
初期化パラメータファイルは、通常「$ORACLE_HOME/dbs」にinit.oraというファイルがあるので、それをコピーしました。
どうやら筆者の環境では、init"作成したDBのSID".oraというファイル名でないと読み込めないようでした。
SIDの大文字小文字までが完全一致していないとファイルがないと怒られました。

### 6.2.2. \<ORACLE_BASE\>の編集
もとにしたinit.oraの内容が作成したDBに適したものになっていなかったので、内容を編集します。
といっても、「\<ORACLE_BASE\>」という部分をインストールしたORACLE_BASEに書き換えるだけです。
筆者は環境変数に\$ORACLE_BASEをExportしているので、「$ORACLE_BASE」と書き換えました。

### 6.2.3. compatibleの修正
ファイル自体の互換性を定義するパラメータの「compatible」というパラメータが11.2.0になっていたところを「compatible ='12.2.0'」と修正しました。
編集しなくてもいけそうな気がしますが、筆者の環境だとダメだったので、インストールしたバージョンに合わせておきました。

## 6.3. 制御ファイルの生成
制御ファイルが見つけられないというエラーをに出会ったので、アラートログを参照し、見つからないと言われているファイル名に合わせて、「spfile」で指定されている「*.control_files」で指定されているファイルをコピーしました。
アラートログは、「$ADR_BASE/diag/rdbms/DB/SID/trace/alert_SID.log」として保尊されているはずですので、そちらを確認しました。
※ADR_BASE は初期化パラメータのDIAGNOSTIC_DESTで指定されているディレクトリです

制御ファイルの内容を何も手を加えず、単純なコピーだけでエラーを乗り切ることができました。

## 6.4. パスワードファイルを生成
ここまでで初期不良？に対する対応はすべて終わり、無事データベースを起動及び使用することができるようになりました。
しかし、SYSDBAユーザでリモートログインしようとした際に、なぜかユーザー名とパスワードが正しくない旨のエラーにぶつかりましたのパスワードファイルを生成しました。
パスワードファイルは、`orapwd file=$ORACLE_HOME/dbs/orapwORCL password=パスワード format=12`のコマンドを使用して生成しました。

筆者は新しく生成しましたが、どうやら原因は初期化パラメータファイルと同様に、orapwSIDのSIDの部分が小文字だったことで、ファイルが読み取れていなかったようです。

# 7. その他
エラー対応以外に筆者が新しく知ったことなどを記載します。

## 7.1. Enterprise Manager Expressの起動
Oracleは12cから、ブラウザのGUIベースのデータベース管理ツール「Enterprise Manager」が結構変わったようです。
まずは名前が「Enterprise Manager Express」に代わっているらしいこと。
はじめ調べたときはスルーしてたのですが、名前変わってたみたいです。

その次は起動方法です。
11gまでは「emctl」というコマンドで起動していましたが、12cからはデータベースにあらかじめ入っているストアドプロシージャを使用して起動する方法に変更になったようです。
SQL*Plusなどのツールから以下のストアドプロシージャを実行してEM Expressを起動します。

コマンド:`select dbms_xdb_config.gethttpsport() from dual;`

HTTPSのポートを検索すれば、ついでにEM Expressは起動されているようです。
また、EM Expressはフラッシュを使用しているので、ブラウザにフラッシュのプラグインを入れる必要があります。
フラッシュはもうすぐ完全に開発が止まってしまう技術なので、積極で気に導入すべきかは一考の余地がありますが、筆者のように画面がないとロクに管理できない初心者は入れるしかありませんorz

# 参考
- [VirtualBoxでCentOS7+Oracle12c環境を構築するの1(事前準備)](https://www.yamamanx.com/virtualbox-centos-7-oracle-1/)
- [アラートログを確認する上でおさえておきたい3つのポイント](https://www.ashisuto.co.jp/db_blog/article/20150907_oracle_alertlog.html)
- [Oracle Database 12c Release 2 : インストール](https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=2)