ローカルPCにOracleレプリケーション環境構築

#Oracleレプリケーション環境で遊びたい
やむにまれない事情でOracleレプリケーションで遊ぶ必要があったので、ローカルPCの仮想環境にDBサーバを2台立てて、レプリケーション環境を構築します。レプリケーションのタイプは単純な読取り専用マテリアライズド・ビューで、構成イメージ以下の通りです。
![Oracleレプリケーション環境.png](https://qiita-image-store.s3.amazonaws.com/0/83813/1e35d188-c4f6-bfdb-4325-eac796712636.png)

#Oracleをインストールする

##ゲストマシンを作成する
VMPlayerよりゲストマシンを1台作成し、CentOS6.8をインストールします。
このとき、スペックが[Oracle Enterprise Editionのインストール要件](http://docs.oracle.com/cd/E16338_01/install.112/b56273/pre_install.htm#i1011296)を満たしていることに注意します。（今回、メモリ1GB、ディスク20GBで構築しましたが、ストレスなく動いています）
OSがインストールできたら、[OTN](http://www.oracle.com/technetwork/jp/database/database-11g/downloads/index.html#11gstand)からOracle11gR2のアーカイブファイルをダウンロードして、適当なディレクトリに配置します。

##インストール用のユーザとグループを作成する
Oracleをインストールするために必要なユーザ、グループを作成します。

```bash:rootユーザで実行
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
passwd oracle
```

##インストーラを実行する
ダウンロードしたアーカイブファイルをoracleユーザで解凍し、インストーラを実行します。
なお、インストールは対話形式で行いますので、CUIではなくGUI環境で作業してください。

```bash:oracleユーザで実行
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
./database/runInstaller
```

以下、インストールの設定例です。
ただ遊ぶための環境なので、ほぼデフォルトのままです。
なお、LANGが日本語だとOUIが文字化けてしまったので、一時的に英語に切り替えています。

1. 1/9 セキュリティ・アップデートの構成
セキュリティアップデートの情報なんかいらないので未入力。未チェック。
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/dd5ce73d-1793-502f-de3c-b575a5c436f4.jpeg)

2. 2/9 インストール・オプションの選択
当然、DBも一緒に作成します。
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/60f43bdc-7197-e12c-5e93-16a94a20bf5a.jpeg)

3. 3/8 システム・クラス
デスクトップクラスを選択
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/5dd59c38-1a09-423a-05ff-d3ae2cf52aa0.jpeg)

4. 4/8 標準インストール構成
文字コードとDB名を変更。それ以外はデフォルト。
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/ef5617ea-4562-7ba4-1135-a46bf766ae5b.jpeg)

5. 5/9 インベントリの作成
デフォルトのまま。
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/80a15fd8-23ae-b148-b816-c936f68eedcc.jpeg)

6/9 前提条件チェックの実行
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/9c6a403b-26cd-2b5d-1bed-baa180af52f8.jpeg)
私の環境の場合、結構、怒られましたが、とりあえず必要そうな以下のパッケージだけインストールしました。

```bash:rootユーザで実行
yum install -y gcc-c++
yum install -y glibc
yum install -y compat-libstdc++-33
yum install -y elfutils-libelf-devel
```

その後、再度チェックを行い、「Ignore ALL」を選択して、次へ進みます。
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/a4a1cd86-6243-dc87-667d-605eb2369124.jpeg)

インストール処理後、DBCAが起動して、1時間後くらいに無事にインストール、DB作成完了。なお、アカウントロックの解除は特にしていません。
![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/9dcc5693-5d25-d820-7f0b-77d6a38171bb.jpeg)

最後に、rootユーザでスクリプトを実行しろと言われるので、実行します。
![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/3064139f-b951-4144-420c-af7ba10808ed.jpeg)

```bash:rootユーザで実行
sh /home/oracle/app/oraInventory/orainstRoot.sh 
sh /home/oracle/app/oracle/product/11.2.0/dbhome_1/root.sh 
```

##ゲストマシンを複製する
Oracleのインストールが完了したら、ゲストマシンのファイルを丸ごとコピーして、別の仮想マシンとして作成します。

#Oracleレプリケーション環境を構築する
Oracleをインストールした仮想マシンが2台できたので、レプリケーション環境を構築します。
このとき、必要に応じて構築用のスキーマを作成してください。また、リスナーのポートも開放しておきます。

##tnsnames.oraファイルを設定する
マテリアライズドビューサイトからマスターサイトに接続できるように、レプリケーションサイトのtnsnames.oraに任意の接続識別子を追記します。以下、記述例です。

```text:tnsnames.ora
db1=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = [マスターサイトのIPアドレス])(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = orcl)
    )
  )
```

##DBLinkを作成する
サイト間でレプリケーションができるように、マテリアライズド・ビューサイトでDBLinkを作成します。
USING句の後には、上記で作成した接続識別子を指定します。

```sql
CREATE DATABASE LINK db1_mv CONNECT TO user IDENTIFIED BY password USING 'db1';
```

DBLinkが作成できたら、マスターサイトでテーブルを作成し、マテリアライズド・ビューサイトからそのテーブルが参照できることを確認します。

```sql
select * from table1@db1_mv ;
```

##マテリアライズド・ビューログを作成する
今回、高速リフレッシュを行いたかったので、マスターサイトでレプリケーション対象のテーブルに対してマテリアライズドビュー・ログを作成します。

```sql
create materialized view log on table1;
```

##マテリアライズド・ビューを作成する
マテリアライズド・ビューサイトで作成します。今回、リフレッシュのタイミングは手動にしています。

```sql
create materialized view mv1
  refresh fast on demand
  as 
    SELECT * FROM table1@db1_mv;
```

##完了
マテリアライズド・ビューが作成できたら、マスターサイトのテーブルにレコードを追加して、すぐにはレプリケーションされないことを確認します。その後、マテリアライズド・ビューサイトで完全リフレッシュを行い、データが反映されていることを確認します。

```sql
exec dbms_mview.refresh('mv1','c');
```

以上で、必要最低限のOracleレプリケーション環境が構築できました。