Windows Oracle MSFC+OFS on ESXi 環境の構築

# Windows Oracle MSFC+OFS on ESXi 環境の構築

仕事上、Oracle HA 環境を作ることになったので、その時やった作業についてのメモを残します。


## 1. サーバー環境の設定

ESXi に仮想サーバーを 2 台 ( サーバーA, B ) を作成する。


### ハードディスク
サーバーA 側には、投票ディスク、データディスクの 2 つのハードディスクを追加する。

サーバーA

```
  SCSI(0:0)  OS 用
    サイズ: 100 GB
    プロビジョニングタイプ: Thin Provision
    SCSI コントローラタイプ: LSI Logic SAS
    SCSI バスの共有: なし

  SCSI(1:0)  投票ディスク用
    サイズ: 40 GB ( これは多くても数 GB 程度でよさそう )
    プロビジョニングタイプ: シックプロビジョニング ( Eager Zeroed )
    モード: 独立型 ( 通常 )
    SCSI コントローラタイプ: LSI Logic SAS
    SCSI バスの共有: 物理

  SCSI(2:0)  データディスク用
    サイズ: 40 GB
    プロビジョニングタイプ: シックプロビジョニング ( Eager Zeroed )
    モード: 独立型 ( 通常 )
    SCSI コントローラタイプ: LSI Logic SAS
    SCSI バスの共有: 物理
```

サーバーB

```
  基本的にサーバー A と同じ。

  SCSI(1:0),SCSI(2:0) は、作成時に、[既存の仮想ディスクを使用] で、サーバーA で
  作成したディスクを選択する。
```


### ネットワーク

  パブリックネットワーク、プライベートネットワーク用に 2 つを設定する。

  今回作った環境では、VN Network, RAC Internal の 2 つを使った。( RAC 環境と同じものを使ったため )

  ネットワークの設定は、ESXi サーバー自身のプロパティ > 構成 から行う。

  アダプタタイプ: E1000E ( これは環境によって変わるものだと思う。 )


### CPU

  各サーバーに 1 ソケット 2 コアを割り当てる。



### メモリ

  各サーバーに 6 GB を割り当てる。



## 2. AD 環境の設定

Active Directory も必要なため、サーバーがないときはこれも合わせて作っておく。

ドメインユーザーには、Domain Admin の権限を付けておく。

ここでは、ドメインを test、ドメインユーザーを cluster とする。



## 3. OS のインストール

  Windows Server 2012 R2 を使った。

  インストール後、次の設定をする。

  - マシン名を分かりやすいものに変更する。( デフォルトのものは分かりにくい。)

  - 時刻設定の NTP サーバーを変更する。( 社内のサーバーに合わせて。)

  - 投票ディスク、データディスクを NTFS でフォーマットして、両方のサーバーで同じドライブレターを割り当てる。
    今回は、投票ディスク用に H、データディスク用に I を割り当てた。

  - ネットワーク名を両サーバーで同じになるように変更する。( Public ( VN Network )、Private ( RAC Internal ) )

  > ネットワークアドレス:
  >> サーバーA: (Public) 172.18.101.51  (Private) 10.0.0.51 (DNS1) AD の IP アドレス (DNS2) 通常の DNS の IP アドレス
  >> サーバーB: (Public) 172.18.101.52  (Private) 10.0.0.52

  > Private ネットワークの、NetBIOS over TCP/IP を無効にする。

  > ネットワークアダプタの詳細設定で、ネットワークのバインド順を 1.Public 2.Private、1.インターネット プロトコル バージョン 4 2.インターネット プロトコル バージョン 6 に変更する。

  一通りの設定が終わった後で、コンピュータをドメインに参加させる。

  ファイアウォール設定をすべて ( ドメイン、パブリック、プライベート ) 無効にする。



### 4. MSFC のインストール

  両方のサーバーの電源を OFF にして、最初のサーバーのみ再起動する。

  サーバーマネージャ > 管理 > 役割と機能の追加 > 機能 から
    フェールオーバークラスタリング
    マルチパス I/O ( いるかどうかわからなかったが一応入れた。iSCSI とか使うなら必要。 )
  をインストールする。

  フェールオーバークラスタマネージャより、MSFC が稼働していることを確認する。

  もう一台のサーバーも再起動して、同様に MSFC をインストール、確認する。

　1 台目のサーバーで、新しいクラスタを作成する。

  作成後のチェックでこのようなエラーが出ていたが、ESXi のバージョンによるもののようなので、ここでは無視してこの後の作業を続けた。

![MSFC役割追加後のチェックでエラー.png](https://qiita-image-store.s3.amazonaws.com/0/84341/fcad0535-bfc7-cece-975d-29b3decb2305.png)


  古いバージョン ( MSCS ) では、ネットワークなど細かく設定する必要があったようだが、今回の MSFC では、インストールのみで、適切な設定がされているよう。



### 5. Oracle のインストール

  両方のサーバーで、Oracle のアプリケーションのみをインストールする。

  インストール先は、ローカルディスク ( C: など ) にする。



### 6. Oracle Fail Safe のインストール

  両方のサーバーで、標準インストールする。

  インストールは 1 サーバーずつ、インストール完了後、再起動してから次のサーバーのインストールをする。

ドメインユーザー：test\cluster


### 7. MSFC/OFS のグループを作成

  片方のサーバーのみで実行する。

  フェイルオーバークラスタマネージャー > { クラスタ名 } > 役割 > 役割の構成より新しい役割を作成する。

  この役割が、OFS 側で見ると、グループになる。

  後の作業で、このグループに仮想 IP アドレス ( 172.18.101.54 ) を設定するため、この対応を hosts ファイルに追加する。( 両方のサーバーで )



### 8. データベースを作成

  片方のサーバーのみで実行する。

  DBCA を使って、データベースを作成する。
  データは共有ディスク ( I: ) の直下に配置するため、デフォルトで環境変数 ( ORACLE_BASE, ORACLE_HOME ) を使っているところを変更する。

  インストール後、Oracle のサービスを停止する。



### 9. OFS 用 PFILE の作成

　OFS では、Oracle 起動に PFILE を使う。

  共有ディスクに、PFILE ( init{ORACLE_SID}.ORA ) を作成する。 <= OFS で PFILE を使用するため。

```init{ORACLE_SID}.ORA
  SPFILE=I:\spfile{ORACLE_SID}.ora
```

  $ORACLE_HOME/database 配下に作成されている SPFILE を、共有ディスクにコピーする。




### 10. グループにデータベースを追加

  片方のサーバーで実行する。

  データベースを作成すると、Fail Safe Manager の [使用可能なOracleリソース] に、追加したインスタンスが追加される。
  このインスタンスを、事前に作成したグループに追加する。
  このとき、共有ファイルに作成した PFILE が必要となる。


  ( ここが悩んだところ )
  ただし、このままでは、Oracle サービスが起動したとき、元の SPFILE を見ているようで、OFS からの起動がエラーとなっているようだった。

  ( SPFILE が非共有ディスクにあるから N.G. のようなメッセージ。以下を参照 )

![FS-10288.png](https://qiita-image-store.s3.amazonaws.com/0/84341/db4c3f3f-e5aa-ab2e-f0a8-0d92b1affa90.png)


```
SQL> show parameter spfile

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
spfile                               string
C:\APP\CLUSTER\PRODUCT\12.1.0\
DBHOME_1\DATABASE\SPFILEORA121
02.ORA
```

  そのため、oradim プログラムを使って、両方のサーバーで、Oracle インスタンス起動時の PFILE パラメータを追加した。

```
c:\app\cluster\product\12.1.0\dbhome_1\BIN>oradim -edit -sid ora12102 -pfile I:\
initORA12102.ORA
```

Oracle サービスを起動して、共有ディスク上の SPFILE が参照されていることを確認する。

```
SQL> show parameter spfile

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
spfile                               string
I:\SPFILEORA12102.ORA
```


この状態で、Oracle サービスを再度停止して、OFS グループ追加を再実行する。


ここまでで完了。



## 11. 確認

Oracle が稼働しているサーバーで、Oracle サービス ( OracleService{ORACLE_SID} ) を停止してみる。

これで、Oracle が別のサーバーで起動するようになっていればよい。

フェイルオーバーのデフォルト設定では、サービス停止は同じマシンで再起動を試みるようになっているので、停止検知即フェイルオーバーとなるようにパラメータを変更しておく。

![param1.png](https://qiita-image-store.s3.amazonaws.com/0/84341/27d230d8-ea38-5dcf-7a0d-17af693e2b82.png)


OFS からはここがうまく設定できなかったので、MSFC の側から設定を変更した。


途中、Oracle サービス停止によるフェールオーバーが、実行時エラー数超過で失敗するようになったので、フェールオーバーリトライ回数の設定を変更して確認した。

![failoverRetrySetting.png](https://qiita-image-store.s3.amazonaws.com/0/84341/87c23417-5786-9c53-fbda-5dfa539ddba0.png)



## 12. Appendix

  事後確認で、サーバーA を停止して、サーバーB へのフェールオーバーを確認したところ、フェールオーバー後、Oracle への接続ができなかった。
  ( ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました。 )

  レジストリを見てみると、サーバーB の方だけ、ORACLE_SID のキーが設定されていなかった。

> HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1

  サーバーA と同じ値を設定することで、起動できるようになった。

  ORACLE_SID キーがなかった理由・原因は不明。
  > 環境設定後、再度 dbca コマンドでデータベースを作ろうとした可能性があり、ここで ORACLE_SID が削除されてしまった可能性がある。
複数インスタンスを登録しようとしたとき、この値が、新しいものに変わったりしていたので、その辺が怪しい。
とりあえずは、作業ミスと思われる。



## 参考

意外と簡単!? Windows ソリューション - Oracle Fail Safe 編 -
http://otndnld.oracle.co.jp/easy/win_solution/ofs/

Oracle Databaseプラットフォーム・ガイド
12cリリース2 (12.2) for Microsoft Windows 
ORADIMを使用したOracle Databaseインスタンスの管理について
https://docs.oracle.com/cd/E82638_01/NTQRF/about-administering-an-oracle-database-instance-using-oradim.htm

@IT SQL Serverトラブルシューティング(11)
SQL Serverが正しく再起動しなくなってしまった ( 起動トラブル )
http://www.atmarkit.co.jp/ait/articles/1608/03/news044.html#l_si_sqls-11-03.jpg