CentOS6.6のLinux-HAでDRBD上にOracleデータベースを構築する

#前置き
CentOS+Pacemaker+Corosync+DRBDで以下の図のようなHA構成を作り、そこにOracleデータベースを実装しました。

HA構成をOSSで作っておいてわざわざOracleを使う人は少ないのか、あまり実装例が無いようなので、拙い内容ではありますが書いてみました。

##システム構成

* ノードA　ホスト名:OraSv1　eth0:192.168.10.101　eth1:192.168.1.101
* ノードB　ホスト名:OraSv2　eth0:192.168.10.102　eth1:192.168.1.102
* サービス用LAN　192.168.10.0/24　仮想IP:192.168.10.100
* 死活監視用LAN　192.168.1.0/24

![Linux-HA Oracle構成.png](https://qiita-image-store.s3.amazonaws.com/0/68537/fc62ea26-8339-5d15-de7a-6698596c440a.png)

### 使ったもの

CentOS 6.6
drbd 8.4
pacemaker 1.1.12
corosync 2.3.4
Oracle 12c Standard Edition One

### 参考記事
以下の記事を参考にいたしました。
大変勉強になりました。本当にありがとうございます。

[CentOS6.5でDRBD8.4を使ってみる](http://qiita.com/takehironet/items/4d26198798fb4b7454f8)

[Server World　Oracle 12c](http://www.server-world.info/query?os=CentOS_6&p=oracle12c)

# Linux-HAの構築

ノード２台に対して以下をインストールします。

* CentOSのインストール
* DRBDのインストール
* Pacemakerのインストール

ここの手順については別の良記事が多数あるので、ここでは省略します。

別ページにざっくりメモ書きしましたので、参考にしてください。
[CentOS6.6のLinux-HAでDRBDを構築する手順めも](http://qiita.com/takusamar/items/62d7bd70d659f42d4116)

# Oracle 12c のインストール

## Oracleインストール、リスナー作成

以下の参考サイトの通りに、リスナーの作成まで実施します。
ノード２台の両方で実施してください。

参考　Server World　Oracle 12c

* [インストール前設定](http://www.server-world.info/query?os=CentOS_6&p=oracle12c&f=1)
* [インストール](http://www.server-world.info/query?os=CentOS_6&p=oracle12c&f=2)
* [リスナーの追加](http://www.server-world.info/query?os=CentOS_6&p=oracle12c&f=3)

## Oracleデータ格納領域の設定（ノードA）

データベース作成の前に、DRBDが管理するディスク領域（以下の例では/ora）にoracleデータを格納するため、以下の設定をします。

### ノードA（Primary側）

* rootで実行

/ora以下にoradataとfast_recovery_areaディレクトリを作成します。

```sh:
df
cd /ora
mkdir oradata
mkdir fast_recovery_area
chown oracle:oinstall oradata fast_recovery_area
```

* oracleユーザで実行

/ora以下にリンクを張ることで、本来は$ORACLE_BASE以下に保存されるデータファイルの実体を/ora以下に保存するようにします。

```sh:
ln -s /ora/oradata $ORACLE_BASE
ln -s /ora/fast_recovery_area $ORACLE_BASE
ls -l $ORACLE_BASE
合計 16
drwxr-xr-x.  3 oracle oinstall 4096  2月  8 21:58 2015 product
drwxrwxr-x. 19 oracle oinstall 4096  2月  8 22:00 2015 diag
drwxr-xr-x.  2 oracle oinstall 4096  2月  8 22:02 2015 checkpoints
drwxr-xr-x.  3 oracle oinstall 4096  2月  8 22:03 2015 cfgtoollogs
lrwxrwxrwx.  1 oracle oinstall   12  2月  8 22:07 2015 oradata ->
/ora/oradata
lrwxrwxrwx.  1 oracle oinstall   23  2月  8 22:08 2015
fast_recovery_area -> /ora/fast_recovery_area
```
	
### ノードB（Secondary側）
ここでは何も設定変更せず、そのままデータベース作成に進みます。

## Oracleデータベース作成

引き続き、以下の参考サイトの通りに、データベース作成、自動起動設定を実施
します。

参考　Server World　Oracle 12c

* [データベース作成](http://www.server-world.info/query?os=CentOS_6&p=oracle12c&f=4)
* [自動起動設定](http://www.server-world.info/query?os=CentOS_6&p=oracle12c&f=5)

なお、自動起動設定は[1]の環境設定のみ実施します。
Oracleの起動・停止はpacemakerで行なうため、[2]の起動スクリプトは不要です。

## Oracle接続確認

* oracleユーザで実行

```sh:
lsnrctl status
```
リスナーが動いてること。

```sh:
sqlplus /nolog	
SQL> conn sys as sysdba
SQL> select STATUS from v$instance;
STATUS
------------------------------------
OPEN
SQL> exit
```
STATUSがOPENになっていること。

## Oracleデータ格納領域の設定（ノードB）

ここまでで、ノードAは/ora以下、ノードBは$ORACLE_BASE以下にデータファイルを保存したした状態でOracleデータベースが作成されました。

では、ノードBの$ORACLE_BASE以下のデータファイルを捨てて、ノードAが作成した/ora以下のデータファイルをノードBからも共有するように設定します。

まず、両ノードのOracleを停止します。

### ノードA（Primary側）、ノードB（Secondary側）

* oracleユーザで実行

Oracle DB停止

```sh:
sqlplus /nolog
SQL> conn sys as sysdba
SQL> shutdown
```

### ノードB（Secondary側）

* rootで実行

`crm_mon`

```sh:
Online: [ OraSv1 OraSv2 ]

Master/Slave Set: ms-drbd_ora [drbd_ora]
    Masters: [ OraSv1 ]
    Slaves: [ OraSv2 ]
Resource Group: grpora
    fs_ora     (ocf::heartbeat:Filesystem):    Started OraSv1
    VIP1       (ocf::heartbeat:IPaddr2):       Started OraSv1
```

ノードAをいったんstandyにして、ノードBに各リソースを切り替える。

`crm node standby OraSv1`

切り替わったらonlineに戻しておきます。

`crm node online OraSv1`

`crm_mon`

```sh:
Online: [ OraSv1 OraSv2 ]

Master/Slave Set: ms-drbd_ora [drbd_ora]
    Masters: [ OraSv2 ]
    Slaves: [ OraSv1 ]
Resource Group: grpora
    fs_ora     (ocf::heartbeat:Filesystem):    Started OraSv2
    VIP1       (ocf::heartbeat:IPaddr2):       Started OraSv2
```

ノードBで/oraがマウントされていることを確認します。
`df`

* oracleユーザで実行

$ORACLE_BASE以下のデータファイルを削除し、/ora以下へのリンクに変更します。

```sh:
cd $ORACLE_BASE
rm -rf oradata fast_recovery_area
ln -s /ora/oradata $ORACLE_BASE
ln -s /ora/fast_recovery_area $ORACLE_BASE
ls -ltr
合計 24
drwxr-xr-x.  3 oracle oinstall 4096  2月  8 21:58 2015 product
drwxrwxr-x. 19 oracle oinstall 4096  2月  8 22:13 2015 diag
drwxr-xr-x.  2 oracle oinstall 4096  2月  8 22:14 2015 checkpoints
drwxr-x---.  3 oracle oinstall 4096  2月  8 22:20 2015 admin
drwxr-x---.  3 oracle oinstall 4096  2月  8 22:31 2015 audit
drwxr-xr-x.  5 oracle oinstall 4096  2月  8 22:34 2015 cfgtoollogs
lrwxrwxrwx.  1 oracle oinstall   12  2月  8 23:09 2015 oradata ->
/ora/oradata
lrwxrwxrwx.  1 oracle oinstall   23  2月  8 23:09 2015
fast_recovery_area -> /ora/fast_recovery_area
```

Oracle DBを起動します。

```sh:
sqlplus /nolog			
SQL> conn sys as sysdba		
SQL> startup		
SQL> select STATUS from v$instance;
STATUS
------------------------------------
OPEN
```

これで、OracleデータファイルがDRBDで２重化されました。

## ユーザ作成、テーブル作成

Oracleデータベースにユーザ、テーブルを作ってみます。
【SID】には各自作成したデータベースのSIDを入れてください。

```sh:
SQL> CREATE USER hoge IDENTIFIED BY hoge_pwd;
SQL>ALTER USER hoge QUOTA 10M ON USERS;
SQL> GRANT CONNECT TO hoge;
SQL> GRANT CREATE TABLE TO hoge;
SQL> exit

sqlplus hoge/hoge_pwd@【SID】
SQL> create table hoge_tbl
(
 id number,
 name varchar(50),
 furigana varchar(50),
 primary key( id )
);
			
SQL> insert into hoge_tbl (id, name, furigana) values (1, 'ほげ', 'ホゲ');
SQL> commit;	
SQL> select * from hoge_tbl;
ID　NAME　FURIGANA
-----------------------------
1　ほげ　　ホゲ
SQL> exit;	
```

## Oracle起動ノードを切替

ノードBでOracleを停止し、DRBDを切り替えます。

### ノードBで実施

* oracleユーザで実行

Oracle DB停止			

```sh:
sqlplus /nolog
SQL> conn sys as sysdba
SQL> shutdown
```

DRBDの切り替え

`crm_mon`

```sh:
Online: [ OraSv1 OraSv2 ]

Master/Slave Set: ms-drbd_ora [drbd_ora]
    Masters: [ OraSv2 ]
    Slaves: [ OraSv1 ]
Resource Group: grpora
    fs_ora     (ocf::heartbeat:Filesystem):    Started OraSv2
    VIP1       (ocf::heartbeat:IPaddr2):       Started OraSv2
```

ノードBをstandbyにすると、DRBDが切り替わります。

`crm node standby OraSv2`

切り替わった後はonlineに戻しておきます。

`crm node online OraSv2`

`crm_mon`

```sh:
Online: [ OraSv1 OraSv2 ]

Master/Slave Set: ms-drbd_ora [drbd_ora]
    Masters: [ OraSv1 ]
    Slaves: [ OraSv2 ]
Resource Group: grpora
    fs_ora     (ocf::heartbeat:Filesystem):    Started OraSv1
    VIP1       (ocf::heartbeat:IPaddr2):       Started OraSv1
```

### ノードAで実施

* oracleユーザで実行

ノードAで/oraがマウントされていることを確認します。
`df`

Oracle DBを起動します。

```sh:
sqlplus /nolog			
SQL> conn sys as sysdba		
SQL> startup		
SQL> select STATUS from v$instance;
STATUS
------------------------------------
OPEN
```

ノードBで追加したテーブル・レコードがノードAでも取得できるか確認します。

```sh:
sqlplus hoge/hoge_pwd@【SID】
SQL>	select * from hoge_tbl;
ID　NAME　FURIGANA
-----------------------------
1　ほげ　　ホゲ
SQL>	exit;
```
	
## WebブラウザでOracle Enterprise Managerにアクセス	

仮想IPでOracle EMにアクセスできることも確認しておきましょう。
https://192.168.10.100:5500/em

あとは、Oracleデータベースの起動・停止をpacemakerで管理するように設定します。
続きはこちらに。
[CentOS6.6のLinux-HAでPacemakerによるOracleの起動・停止を制御する](http://qiita.com/takusamar/items/c43f351975877ff07b10)